为什么 sympy 中的这个布尔表达式求值为 false:(~a&b)|(a&~b)==a^b?

Why does this boolean expression in sympy evaluate to false: (~a&b)|(a&~b)==a^b?

我一直在使用 SymPy 来简化和评估布尔表达式。我遇到过这个简单的情况,即问题中提到的表达式,它的计算结果不是 True。示例代码如下:

from sympy import *
a, b=symbols('a b')
(~a&b)|(a&~b)==a^b

计算结果为 False。

查看教程: https://docs.sympy.org/latest/tutorial/gotchas.html#equals-signs

你的两个表达式在结构上不相等:

In [2]: (~a&b)|(a&~b)                                                                                                  
Out[2]: (a ∧ ¬b) ∨ (b ∧ ¬a)

In [3]: a^b                                                                                                            
Out[3]: a ⊻ b

因此它们不会与 == 进行比较。

您可以简化它们以进行比较:

In [9]: simplify_logic((~a&b)|(a&~b))                                                                                  
Out[9]: (a ∧ ¬b) ∨ (b ∧ ¬a)

In [10]: simplify_logic(a^b)                                                                                           
Out[10]: (a ∧ ¬b) ∨ (b ∧ ¬a)

In [11]: simplify_logic((~a&b)|(a&~b)) == simplify_logic(a^b)                                                          
Out[11]: True

faq and in sympy's gotchas 中所述,双等号仅测试完全相等。

要测试两个布尔表达式是否相等,请使用 Equivalent(lhs, rhs) 后跟 simplify()

from sympy import symbols, Equivalent

a, b = symbols('a b')
print(Equivalent(((~a & b) | (a & ~b)), (a ^ b)).simplify())

打印 True.