Мой код
У меня фактически есть следующий сокращенный фрагмент кода в более крупной программе:
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))
(Это потенциально можетупростим до двух веток, но примерно так.)
Тем не менее, мой фактический вывод такой:
Версия для симпли: 1.3
Необработанное выражение: Piecewise((0, Ne (n, 3)), (-0,5, True)) * Кусочно ((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
не указан).
(Хочу также отметить, что эта проблема не существует ни в одном из исходных кусочно-выраженных выражений до упрощения. Хотя они используют Ne
для первого условия ветвления, второе условие используется по умолчанию True
, что совершенно правильно.)
Мой вопрос
Может ли кто-нибудь объяснить это как предполагаемое поведение?
Если нет, я планирую представить это как ошибкуSymPy.Я выполнил краткий поиск системы отслеживания проблем SymPy для своей проблемы перед публикацией, но я не увидел ничего, что соответствовало бы этому.Я просто хотел еще раз проверить, что я ничего не пропускаю первым.