真 + 真 = 2。如何优雅地进行布尔运算?

10

我有嵌套的真值列表,代表着像这样的SAT公式:

[[[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,这是我期望的结果

所以... True只是1,而False是0... 这很糟糕,我希望布尔代数可以重载算术运算符。是否有一种优雅的方式使用布尔变量进行布尔算术?


4
布尔运算符是 |&,而不是 +* - lejlot
但是没有像and=那样的+=。所以... - lo tolmencre
你可以使用 x = x or y 代替 x += y - recursive
2
@lotolmencre 总是有位运算版本的;x &= yx |= y。但它们不是懒惰的。 - Veedrac
2个回答

13
在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

来自Python中的位运算符

x & y

执行“按位与”。 输出的每个位都是1,如果x和y对应的位都是1,否则为0。

x | y

执行“按位或”。 输出的每个位都是0,如果x和y对应的位都是0,否则为1。


请注意,列表不支持&|操作符,但是andor可以使用。 - Skippy le Grand Gourou

5

有一种方法可以进行布尔运算,那就是使用布尔运算符。

  • and,你称之为“*”,对应的是and
  • or,你称之为“+”,对应的是or

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接