我的代码
在一个较大的程序中,我有效地有以下简化的代码片段:
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))
对于简化后的表达式,我期望得到与以下等价的结果:
简化表达式:Piecewise((0, Eq(n, 0)), (-1.0, Eq(n, 3)), (0, True))
(这可能还可以进一步简化为只有两个条件分支,但类似的结果)
然而,我的实际输出是:
sympy版本:1.3
原始表达式:Piecewise((0, Ne(n, 3)), (-0.5, True))*Piecewise((2, Ne(n, 0)), (1, True))
简化表达式:Piecewise((0, Ne(n, 3)), (-1.0, Ne(n, 0)), (-0.5, True))
我的问题
显然,我的问题不止是没有得到我期望的结果。更重要的是,在简化后得到的条件分支表达式中存在明显的逻辑问题;更具体地说,在其中的条件语句中存在问题。
第一个条件是Ne(n, 3)
,意思是“当n不等于3时将使用第一个值”。这本身没问题。
然而,第二个条件是Ne(n, 0)
,考虑到第一个条件,这是完全无意义的。如果n为0,则第一个条件为真且将使用第一分支的值,因此在评估第二个条件时可以逻辑保证n不为0。
更糟糕的是,最后一个条件是True
(即“否则”),如果之前的条件都不满足,则默认使用此条件。然而,从先前的两个条件中的任意一个都无法到达该分支,因为它们将整数空间划分为不同的区域(并且n
被定义为整数;但是,当n
的数字类型未指定时,同样的问题会发生)。
(我还想指出,在简化之前的原始Piecewise表达式中不存在这个问题。虽然它们的第一个分支条件使用了Ne
,但第二个条件是默认的True
,这是完全有效的。)
我的问题
有人能解释这是否是本意吗?
如果不是,我计划向SymPy提交此错误报告。在发布之前,我曾在SymPy问题跟踪器上搜索过我的问题,但没有找到与之匹配的内容。我只是想在这里再次核实一下,以防我遗漏了什么。