【问题标题】:Simultaneous replacement of SymPy logic function同时替换 SymPy 逻辑功能
【发布时间】:2018-06-24 19:05:07
【问题描述】:

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

我尝试过的其他公式,例如将“Nand”替换为“And”,都不会失败。设置 concurrent=False 也不会失败,但如果我想同时替换 y 将不会给出想要的结果(请参阅this question 了解详细原因)。

这是 SymPy 中的错误,还是误解了什么?

【问题讨论】:

    标签: python sympy


    【解决方案1】:

    这是 SymPy 中的一个错误。 Class Not 没有 is_commutative 属性集,也没有继承它。结果,Nand(x, y)(即Not(And(x, y)) 对“交换”假设具有“None”,这对于 Dummy 创建方法是不可接受的,该方法试图创建具有相同假设的虚拟符号。不会发生此问题对于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 &amp; (~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 &amp; ~(x &amp; y))。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-02
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多