首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SymPy逻辑函数的同时替换

SymPy逻辑函数的同时替换
EN

Stack Overflow用户
提问于 2018-06-24 19:05:07
回答 1查看 119关注 0票数 2

我在Sympy中遇到了一个在逻辑公式中替换变量的问题。下面是一个很小的例子-

代码语言:javascript
复制
from sympy import *
x, y = symbols('x y')
Nand(x, y).subs({x: Nand(x, y)}, simultaneous=True)

这在本地interperter中和在SymPy文档上的活动shell中都失败,并带有错误消息。

代码语言:javascript
复制
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,还是误解了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-25 02:34:13

这是SymPy中的一个bug。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)

代码语言:javascript
复制
Nand(x, y).subs({x: Or(Not(x), Not(y))}, simultaneous=True)

(这将返回~(y & (~x | ~y)))

并自行修复这些类:

代码语言:javascript
复制
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))。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51013093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档