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'

私はtry-catchを行うことができます:

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

Not(x)

しかし、現在のタスクでは、try-except200 個までのシンボルを処理する必要があるため、これを実装することは不可能です。どうすればこれを達成できますか?

4

2 に答える 2

2

これはバグであり、SymPy の開発版で修正されており、次のバージョンで修正される予定です。git バージョンを使用できず、待つことができない場合の回避策は、monkeypatch __rxor__(など) を insympy.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)何もしません。Symbol に仮定を追加しますx.is_boolが、それは SymPy が認識している実際の仮定ではないため、何もしません。

于 2013-11-05T01:18:38.930 に答える