首页 文章

Sympy中带符号的布尔运算

提问于
浏览
1

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

我可以尝试 grab :

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

Not(x)

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

2 回答

  • 2

    这是一个错误,它已在SymPy的开发版本中修复,并将在下一版本中修复 . 如果你可以等待,一个解决方法是将 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 添加到符号中,但由于这不是't a real assumption that SymPy knows about, it doesn' t .

  • -1

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

    expressions = [
      r'S[15] ^ (S[19] & S[72]) ^ S[112]',
    ]
    
    for e in expressions:
      try:
        eval(e) # Do your thing
      except TypeError:
        pass
    

相关问题