我一直在使用SymPy来简化和计算布尔表达式。我遇到了这个简单的例子,问题中提到的表达式,它的计算结果不是True
。示例代码如下:
from sympy import *
a, b=symbols('a b')
(~a&b)|(a&~b)==a^b
计算结果为False。
发布于 2020-07-13 23:19:22
请参阅教程: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
发布于 2020-07-13 23:25:28
正如在faq和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
。
https://stackoverflow.com/questions/62885361
复制相似问题