True + True = 2. 优雅地执行布尔运算?

lo *_*cre 5 python boolean boolean-operations

我嵌套了代表 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]]]
Run Code Online (Sandbox Code Playgroud)

代表

([x0=0] + [x0=0] + [x0=1]) * ([x0=1] + [x1=1] + [-x2=1]) * ([-x3=0] + [-x3=0] + [-x2=1])
Run Code Online (Sandbox Code Playgroud)

我想计算整个公式的真值。第一步是将每个子句中文字的真值相加。

像这样:

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]
Run Code Online (Sandbox Code Playgroud)

如果clause_truth_valueTrue在求和之后,则该子句整体为真。

但我没有得到我所期望的:

True + True = 2 这不是预期的

True * True = 1 正如预期的那样

False + False = 0 正如预期的那样

False * False = 0 正如预期的那样

所以... True 只是 1 和 False 是 0 ... 糟透了,我希望算术运算符为布尔代数重载。有没有一种优雅的方法来对布尔变量进行布尔运算?

xgo*_*ord 7

在 Python 中,True == 1and False == 0、 asTrueFalse是 type bool,它是int. 当您使用的运营商+,它是隐式添加的整数值TrueFalse

int(True)
# 1

int(False)
# 0
Run Code Online (Sandbox Code Playgroud)

您真正想要的是将TrueFalse视为二进制数。

int(False & False)
# 0

int(True & False)
# 0

int(True & True)
# 1
Run Code Online (Sandbox Code Playgroud)


来自Python 中的按位运算符

x & y

做一个“按位与”。如果 y 的 x AND 的对应位为 1,则输出的每一位为 1,否则为 0。

× | 是

做一个“按位或”。如果 y 的 x AND 的对应位为 0,则输出的每一位为 0,否则为 1。


rec*_*ive 5

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

  • 并且,正如您所说的“*”,是and
  • 或者,正如您所说的“+”,是or