Sympy中带符号的布尔运算

2024-06-16 09:21:28 发布

您现在位置:Python中文网/ 问答频道 /正文

对符号执行布尔变量的布尔运算会产生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'

我可以试试接球:

^{pr2}$

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


Tags: fromimporttruemostnotcallsymbolfile
2条回答

这是一个bug,它已经在SymPy的开发版本中修复了,并将在下一个版本中修复。如果您不能使用git版本并且迫不及待,一种解决方法是将sympy.logic.boolalg.Boolean中的monkeypatch__rxor__(依此类推)等于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所知道的真实假设,所以它什么也做不了。在

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

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

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

相关问题 更多 >