2017-12-16 4 views
3

나는 Sympy와 부울 표현식의 동등성을 결정하기 위해 노력했습니다,하지만 더 복잡한 식파이썬에서 두 개의 상징적 인 부울 표현식이 같은지 여부를 결정하는 방법이 있습니까?

from sympy.abc import x, y 
from sympy.logic.boolalg import * 

print(Equivalent(x, x)) 
print(Equivalent(x, x & True)) 
print(Equivalent(x | y, y | x)) 
print(Equivalent(x | (x & y), x | y)) 
print(Equivalent(~x & ~y, ~(x | y))) 

결과의 동등성을 감지하지 못하는 것 같다

>>>True 
>>>True 
>>>True 
>>>Equivalent(Or(x, y), Or(And(x, y), x)) 
>>>Equivalent(Not(Or(x, y)), And(Not(x), Not(y))) 

가 결정하는 방법이 있나요 두 개의 상징적 인 부울 표현식이 파이썬에서 동일하든 그렇지 않습니까?

답변

1

sympy.simplify_logic?

>>> sympy.simplify_logic(Equivalent(Or(x, y), Or(And(x, y), x))) 
Or(Not(y), x) 
>>> sympy.simplify_logic(Equivalent(Not(Or(x, y)), And(Not(x), Not(y)))) 
True 
+0

이것은 일반적으로 필요한 것보다 많은 작업을 수행합니다. 당신은 정말로 'Equivalent'의 부정이 만족 스러운지 ('만족할 만하다 (Equivalent (a, b))'), 그것이 '평등'한 것인지를 알고 싶을뿐입니다. – asmeurer

+0

@asmeurer 그러면 이것을 나타내는 해답을 게시해야합니다. x | ~ y는 아무런 의미가 없습니다. –

+0

@ Wrzlprmft의 답변과 같으므로 답변을 게시하지 않았습니다. – asmeurer

0

sympy.Equivalent에는 부울 표현식의 논리적 등가성을 감지하는 데 필요한 부울 만족 검사법이 없습니다. 당신이 True받은 경우, Equivalent에 전달 된 객체로 인해 &|에 의해 수행 변환에 이미 구조적으로 동일했다 : 더 복잡한 경우

In [7]: x|y 
Out[7]: Or(x, y) 

In [8]: y|x 
Out[8]: Or(x, y) 

In [9]: x&True 
Out[9]: x 

, 당신은 단지 Equivalent의 인스턴스를 얻을 것이다. Equivalent(x | (x & y), x | y)에 대한 출력은

In [19]: ~(x|y) 
Out[19]: And(Not(x), Not(y)) 

입니다

: 나는에서 테스트하고있어 버전에

(0.7.2), 나 또한이 버전 ~(x | y)에 드 모건의 법률을 자동 적용이 분명히 있기 때문에, Equivalent(~x & ~y, ~(x | y))에 대한 진정한 얻을 확실히 반의어는 아닙니다. x가 거짓이고 y가 참일 때 동등성은 유지되지 않습니다.

3

equals 나를 위해 잘 작동 : 일반적으로

(x|(x&y)).equals(x|y) 
# False 

(~x&~y).equals(~(x|y)) 
# True 

equals가 서로 동일 때까지 두 식을 변환을 시도하고 실패 할 경우에만 False를 반환합니다. 따라서 ==보다 정확하지만 속도는 느립니다.

+1

이것은 올바른 방법입니다. 내부적으로, 'equals'는'Equivalent'에'satisfiable'을 사용합니다. – asmeurer