Sympy中带符号的布尔运算

时间:2013-10-31 09:57:14

标签: python boolean sympy symbolic-math

符号上布尔变量的布尔运算产生TypeError,但反过来没有问题:

>>> from sympy import *
>>> x = Symbol('x', bool=True)
>>> x ^ True
Not(x)
>>> True ^ x

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    True ^ x
TypeError: unsupported operand type(s) for ^: 'bool' and 'Symbol'

我可以试试看:

try :
    print True ^ x
except TypeError:
    print x ^ True

Not(x)

但是,对于我目前的任务,我不可能用try-except来实现它,因为我必须处理~200个符号。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

这是一个错误,它已在SymPy的开发版本中修复,并将在下一版本中修复。如果您无法使用git版本且无法等待,则解决方法是__rxor__中的monkeypatch sympy.logic.boolalg.Boolean(等等)等于sympy.logic.boolalg.Boolean.__xor__

In [1]: from sympy.logic.boolalg import Boolean

In [2]: Boolean.__rxor__ = Boolean.__xor__

In [3]: True ^ x
Out[3]: ¬ x

顺便说一句,Symbol('x', bool=True)什么也没做。它为符号添加了假设x.is_bool,但由于这不是SymPy所知道的真实假设,因此它不会做任何事情。

答案 1 :(得分:-1)

这很难看,但应该做你想做的事情:

expressions = [
  r'S[15] ^ (S[19] & S[72]) ^ S[112]',
]

for e in expressions:
  try:
    eval(e) # Do your thing
  except TypeError:
    pass