我一直在尝试确定与Sympy的布尔表达式等价,但它似乎没有检测到更复杂表达式的等价性
from sympy.abc import x, y
from sympy.logic.boolalg import *
print(Equivalent(x, x))
print(Equivalent(x, x & True))
print(Equivalent(x | y, y | x))
print(Equivalent(x | (x & y), x | y))
print(Equivalent(~x & ~y, ~(x | y)))
结果:
>>>True
>>>True
>>>True
>>>Equivalent(Or(x, y), Or(And(x, y), x))
>>>Equivalent(Not(Or(x, y)), And(Not(x), Not(y)))
有没有办法确定Python中两个符号布尔表达式是否相等?
答案 0 :(得分:4)
equals
对我很好:
( x|(x&y) ).equals( x|y )
# False
( ~x&~y ).equals( ~(x|y) )
# True
通常,equals
会尝试转换这两个表达式,直到它们彼此相等,如果失败则只返回False
。因此,它比==
更准确(但也更慢)。
答案 1 :(得分:2)
>>> sympy.simplify_logic(Equivalent(Or(x, y), Or(And(x, y), x)))
Or(Not(y), x)
>>> sympy.simplify_logic(Equivalent(Not(Or(x, y)), And(Not(x), Not(y))))
True
答案 2 :(得分:0)
sympy.Equivalent
没有必要的布尔可满足性求解器来检测不同表达式的逻辑等价。在您获得True
的情况下,由于Equivalent
和&
执行的转换,传递给|
的对象在结构上已经相等:
In [7]: x|y
Out[7]: Or(x, y)
In [8]: y|x
Out[8]: Or(x, y)
In [9]: x&True
Out[9]: x
在更复杂的情况下,您只会获得Equivalent
的实例。
在我测试的版本(0.7.2)上,Equivalent(~x & ~y, ~(x | y))
我也得到了True,显然是因为这个版本会自动将De Morgan的法律应用于~(x | y)
:
In [19]: ~(x|y)
Out[19]: And(Not(x), Not(y))
Equivalent(x | (x & y), x | y)
的输出绝对正确,因为它实际上并不是重言式。当x为假且y为真时,等价不成立。