gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:39:18 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com