Почему это логическое выражение в sympy принимает значение false: (~ a & b) | (a & ~ b) == a ^ b? - PullRequest
1 голос
/ 14 июля 2020

Я работал с SymPy , чтобы упростить и оценить логические выражения. Я столкнулся с этим простым случаем, упомянутым выражением в вопросе, которое не оценивается как True. Пример кода выглядит следующим образом:

from sympy import *
a, b=symbols('a b')
(~a&b)|(a&~b)==a^b

оценивается как False.

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

См. Руководство: https://docs.sympy.org/latest/tutorial/gotchas.html#equals -знаки

Два выражения, которые у вас есть, структурно не равны:

In [2]: (~a&b)|(a&~b)                                                                                                  
Out[2]: (a ∧ ¬b) ∨ (b ∧ ¬a)

In [3]: a^b                                                                                                            
Out[3]: a ⊻ b

Поэтому они не будут сравниваться равными с ==.

Вы можете упростить их, чтобы сравнить:

In [9]: simplify_logic((~a&b)|(a&~b))                                                                                  
Out[9]: (a ∧ ¬b) ∨ (b ∧ ¬a)

In [10]: simplify_logic(a^b)                                                                                           
Out[10]: (a ∧ ¬b) ∨ (b ∧ ¬a)

In [11]: simplify_logic((~a&b)|(a&~b)) == simplify_logic(a^b)                                                          
Out[11]: True
0 голосов
/ 14 июля 2020

Как объяснено в faq и в подводных камнях sympy , двойной знак равенства проверяет только точное равенство.

Чтобы проверить, равносильны ли два логических выражения, используйте Equivalent(lhs, rhs), за которым следует simplify().

from sympy import symbols, Equivalent

a, b = symbols('a b')
print(Equivalent(((~a & b) | (a & ~b)), (a ^ b)).simplify())

Печать True.

...