Sympy在简化时会生成损坏的`Piecewise`条件

时间:2018-11-13 18:10:58

标签: python sympy

我的代码

在较大的程序中,我有效地减少了以下代码段:

import sympy as sp
print('sympy version:', sp.__version__)

n = sp.symbols('n', integer=True)
expr = sp.Piecewise((0, sp.Ne(n, 3)), (-1/2, True))*sp.Piecewise((2, sp.Ne(n, 0)), (1, True))

print('raw expression:', expr)
print('simplified expression:', sp.simplify(expr))

对于简化表达式,我希望它等同于:

  

简化表达式:分段((0,Eq(n,0)),(-1.0,Eq(n,3)),(0,True))

(这可能会简化为仅两个分支,但类似的东西。)

但是,我的实际输出是:

  

符号版本:1.3

     

原始表达式:Piecewise((0,Ne(n,3)),(-0.5,True))* Piecewise((2,Ne(n,0)),(1,True))

     

简化表达式:分段((0,Ne(n,3)),(-1.0,Ne(n,0)),(-0.5,True))

我的问题

一个明显的问题是我没有达到我的期望。不仅如此,在简化的分段式表达式中还存在明显的逻辑问题。更具体地讲,在其中的条件下。

第一个条件为Ne(n, 3),表示“当n不等于3时将使用第一个值”。单就好了。

但是,第二个条件是Ne(n, 0),根据第一个条件,这完全是荒谬的。如果n为0,则第一个条件为true,并且将使用第一个分支值,因此从逻辑上保证,如果要评估第二个条件,则n不为0。

更糟糕的是,最后一个条件是True(即“否则”),如果不满足较早分支的条件,这是默认条件。但是,从逻辑上讲,不可能到达此分支,因为前两个条件将整数的整个空间分区(并且n被定义为整数;但是,当n的数字出现时,也会出现相同的问题类型未指定)。

(我还要注意,在简化之前,两个原始的逐段表达式中的任何一个都不存在此问题。尽管它们的第一个分支条件确实使用Ne,但第二个条件是默认的{{1} },这是完全有效的。)

我的问题

任何人都可以将此解释为预期的行为吗?

如果没有,我打算将此作为Bug提交给SymPy。在发布之前,我确实对the SymPy issue tracker进行了简短的搜索,但是没有找到与其匹配的内容。我只是想仔细检查一下,我不会首先忽略任何东西。

1 个答案:

答案 0 :(得分:1)

输出不是“中断”或“无意义”的。尽管没有以最简单的形式表示,但从逻辑上讲它是正确的。

条件if n == 3 and n != 0可以简化为if n == 3。 “可以简化”和“完全荒谬”之间是有区别的。

但是,是的,由于简化不完整,请在SymPy跟踪器上报告。更好的结果是Piecewise((0, Ne(n, 3)), (-1.0, True))