2016-07-08 54 views
0

我有嵌套表示SAT forumlas,像這樣的真值的列表:True + True = 2.優雅地執行布爾算術?

[[[0, True, False], [0, True, False], [0, True, 1]], [[0, True, True], [2, True, True], [3, False, True]], [[1, False, False], [1, False, False], [3, False, True]]] 

表示

([x0=0] + [x0=0] + [x0=1]) * ([x0=1] + [x1=1] + [-x2=1]) * ([-x3=0] + [-x3=0] + [-x2=1]) 

我想計算整個式的真值。第一步是在每個條款中加上文字的真值。

這樣的:

clause_truth_value = None 

for literal in clause: 
    # multiply polarity of literal with its value 
    # sum over all literals 
    clause_truth_value += literal[1]*literal[2] 

如果clause_truth_valueTrue求和後,該條款是作爲一個整體真實。

但我沒有得到我所期待的:

True + True = 2這不是如預期

True * True = 1這是預期

False + False = 0這是預期

False * False = 0這是預期

所以...真的只是1和Fals e是0 ...這很糟糕,我期望算術運算符爲布爾代數重載。有沒有一個優雅的方式做布爾運算與布爾變量?

+3

布爾運算符是'|'和'&',而不是'+'和'*' – lejlot

+0

但沒有'+ ='就像'和='。所以...... –

+0

不是使用'x + = y',你可以使用'x = x或y' – recursive

回答

2

在Python,True == 1False == 0,如TrueFalsebool類型,這是int的子類型。當您使用運算符+時,它隱式添加整數值TrueFalse

int(True) 
# 1 

int(False) 
# 0 

你真正想要的是治療TrueFalse爲二進制數。

int(False & False) 
# 0 

int(True & False) 
# 0 

int(True & True) 
# 1 


Bitwise Operators in Python

X &Ÿ

難道一個 「按位與」。如果y的x AND的對應位爲1,則輸出的每個位爲1,否則爲0。

x | y

做了「按位還是」。輸出的每一位爲0如果 x和y的相應位爲0,否則是1

2

有一種方法可以進行布爾運算。這種方式是使用布爾運算符。

  • 並且,當您稱爲「*」時,爲and
  • 或者,如你所說的「+」,是or