我在Sympy中遇到了一个在逻辑公式中替换变量的问题。下面是一个很小的例子-
from sympy import *
x, y = symbols('x y')
Nand(x, y).subs({x: Nand(x, y)}, simultaneous=True)这在本地interperter中和在SymPy文档上的活动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.其他我试过的配方,比如用“和”代替“Nand”,不要失败。设置simultaneous=False也不会失败,但如果我想同时替换y,则不会给出所需的结果(详细原因请参见这个问题 )。
这是SymPy中的一个bug,还是误解了什么?
发布于 2018-06-25 02:34:13
这是SymPy中的一个bug。Not没有is_commutative属性集,也没有继承它。因此,Nand(x, y) (也就是Not(And(x, y)) )对于“可交换”假设有“无”,对于虚拟创建方法来说,这是不可接受的,因为它试图用相同的假设创建一个虚拟符号。And不会出现此问题,因为And从LatticeOp类继承了is_commutative=True。
在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))。)
https://stackoverflow.com/questions/51013093
复制相似问题