我遇到了在 Sympy 中用逻辑公式替换变量的问题。 这是一个最小的例子 -
from sympy import *
x, y = symbols('x y')
Nand(x, y).subs({x: Nand(x, y)}, simultaneous=True)
这在我的本地 interperter 和 SymPy Docs 上的 live shell 中都失败了, 带有错误信息
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/base/data/home/apps/s~sympy-live-hrd/49.400254913747479351/sympy/sympy/core/basic.py", line 889, in subs
d = Dummy(commutative=new.is_commutative)
File "/base/data/home/apps/s~sympy-live-hrd/49.400254913747479351/sympy/sympy/core/symbol.py", line 205, in __new__
cls._sanitize(assumptions, cls)
File "/base/data/home/apps/s~sympy-live-hrd/49.400254913747479351/sympy/sympy/core/symbol.py", line 65, in _sanitize
'%scommutativity must be True or False.' % whose)
ValueError: Dummy commutativity must be True or False.
我尝试过的其他表述,例如用“And”替换“Nand”,都不会失败。设置 simultaneous=False 也不会失败,但如果我想同时替换 y 则不会给出所需的结果(请参阅 this question 了解详细原因)。
这是 SymPy 中的错误,还是我误解了什么?
最佳答案
这是 SymPy 中的错误。 Class Not
没有设置 is_commutative
属性,也没有继承它。结果,Nand(x, y)
(即 Not(And(x, y))
对于“交换”假设有“None”,这不是Dummy创建方法可以接受,它试图创建一个具有相同假设的虚拟符号。And
不会出现这个问题,因为And
继承了is_commutative=True
来自 LatticeOp
类。
在 SymPy 中解决此问题的方法似乎是将 is_commutative=True
添加到类 Not
中。
用户端的解决方法包括:使用 Or(Not(x), Not(y))
代替 Nand(x, y)
Nand(x, y).subs({x: Or(Not(x), Not(y))}, simultaneous=True)
(返回 ~(y & (~x | ~y))
)
并自行修复类:
class Not(Not):
is_commutative = True
class Nand(Nand):
@classmethod
def eval(cls, *args):
return Not(And(*args))
Nand(x, y).subs({x: Nand(x, y)}, simultaneous=True)
(返回 ~(y & ~(x & y))
。)
关于python - SymPy逻辑函数的同步替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51013093/