【问题标题】:Boolean operation with symbol in SympySympy中带有符号的布尔运算
【发布时间】:2013-10-31 09:57:14
【问题描述】:

布尔变量对符号的布尔运算产生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 个符号。我怎样才能做到这一点?

【问题讨论】:

  • 如果你要处理200个符号;我希望你正在使用循环。如果是,为什么不能使用 try-except 块?
  • @plg 我正在使用numpy.arrayS,符号和布尔值任意混合。我的操作如下:S[15] ^ (S[19] &amp; S[72]) ^ S[112]。现在,在不知道哪个是布尔值和哪个是符号的情况下,我不能做 try-except 的事情,因为这样的 try-except 块的数量会呈指数级增长。
  • 要使用循环,您可以定义一个元组列表:[(15, 19, 73, 112), ...] 如果它不总是相同的操作,这将不起作用。您还可以在 try-except 中使用表达式列表 ['S[15] ^ (S[19] &amp; S[72]) ^ S[112]', ...]eval。除非我没有其他解决方案,否则我不会这样做。
  • @plg 仍然不清楚。你能给我一个MWE吗?
  • 作为未来参考,什么是 MWE?

标签: python boolean sympy symbolic-math


【解决方案1】:

这是一个bug,在SymPy的开发版中已经修复,下个版本会修复。如果您不能使用 git 版本并且等不及,解决方法是将 sympy.logic.boolalg.Boolean 中的猴子补丁 __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 知道的真实假设,因此它什么也不做。

【讨论】:

    【解决方案2】:

    这很丑,但它应该做你想做的事:

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

    【讨论】:

      猜你喜欢
      • 2010-11-20
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      • 2011-11-13
      • 1970-01-01
      • 2011-09-05
      相关资源
      最近更新 更多