为什么 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
.
我一直在使用 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
.