1
Prolog의 동등성을 교환 가능 및 이행 성 속성으로 시뮬레이트하고 싶습니다. 여기서는 equal/2가 사실로 제공됩니다.Prolog의 교환 가능 및 이행 동등성 구현에 대한 조언
symmetricEqual(A,B):- equal(A,B).
symmetricEqual(A,B):- equal(B,A).
transitiveEqualPath(A,B,_) :- symmetricEqual(A,B).
transitiveEqualPath(B,C,IntermediateNodes) :-
symmetricEqual(A,B),
\+ member(C,IntermediateNodes),
transitiveEqualPath(A,C,[B|IntermediateNodes]), B\==C.
transitiveEqual(A,B) :- transitiveEqualPath(A,B,[]).
하지만 transitiveEqual/2 (이 약 20 분을 촬영하고있다)를 계산하려고 위의 솔루션으로 성능 문제로 실행하고, 정말 동일/2에서 꽤 빨리 계산 2K symmetricalEqual/2 사실 주위에있다 그것은 transitiveEqual/2에 대한 규칙의 원인이어야합니다, 아무도 이것에 대한 개선을 제안 할 수 있습니까?
대단히 감사합니다. here로부터 접근
그러나 제안에 감사 드리며, SWI-Prolog에서 코드를 사용한 후에? -transitiveEqual (A, B)를 쿼리 한 후에 아무 것도 생성되지 않았습니다. 저는 항상 A = B를 출력으로 받았습니다. 어떤 생각? – user1935724
아, 저는 역 추적 할 때 바인딩을 나열하는 대신에'A'와'B'의 바운드 값을 위해 _test_에 술어를 사용한다고 잘못 가정했습니다. 두 가지 모두를 처리하기 위해 내 대답을 업데이트하겠습니다. – sharky