同时替换SymPy逻辑功能

时间:2018-06-24 19:05:07

标签: python sympy

我遇到了在Sympy中用逻辑公式替换变量的问题。 这是一个最小的示例-

from sympy import *
x, y = symbols('x y')
Nand(x, y).subs({x: Nand(x, y)}, simultaneous=True)

这在我的本地操作器和SymPy Docs上的活动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”,都不会失败。设置葬礼= false也不会失败,但是如果我想同时替换y,则不会给出期望的结果(有关详细信息,请参见this question)。

这是SymPy中的bug,还是误解了?

1 个答案:

答案 0 :(得分:1)

这是SymPy中的错误。 Class Not没有设置is_commutative属性,也没有继承它。结果,Nand(x, y)Not(And(x, y))(对于“可交换”假设)为“无”,对于“虚拟创建”方法(尝试创建具有相同假设的虚拟符号),这是不可接受的。对于And不会发生问题,因为AndLatticeOp类继承了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))。)

相关问题