python - SymPy逻辑函数的同步替换

标签 python sympy

我遇到了在 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/

相关文章:

python - 从 FiniteSet 中删除一个元素

python - django.urls.exceptions.NoReverseMatch : Reverse for 'user-detail' with no arguments not found

sympy - 使用 SymPy 执行 Hadamard 产品

python - 为 sympy 表达式 "e1 op e2"生成 C 代码,其中 op 是算术比较运算符

python - 在 SymPy 中绘制带有复变量的隐式方程

python - 我可以在 sympy python 中输入 1/2 吗?

python - 如何使用 OpenCV 在包含多个图像和文本的文档中查找图像位置

python - 属性错误: 'module' object has no attribute 'Firefox'

python - 如何以编程方式创建和管理macOS Safari书签?

python - 如何在 Python 三元运算符上换行?