有没有办法确定Python中两个符号布尔表达式是否相等?

时间:2017-12-16 22:03:06

标签: python-3.x sympy

我一直在尝试确定与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中两个符号布尔表达式是否相等?

3 个答案:

答案 0 :(得分:4)

equals对我很好:

( x|(x&y) ).equals( x|y )
# False

( ~x&~y ).equals( ~(x|y) )
# True

通常,equals会尝试转换这两个表达式,直到它们彼此相等,如果失败则只返回False。因此,它比==更准确(但也更慢)。

答案 1 :(得分:2)

或许

sympy.simplify_logic

>>> 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为真时,等价不成立。