2013-01-11 1 views
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로부터 접근

답변

0

씨 : path/3,4 모든 지상 또는 B 가변적 A 사이의 모든 가능한 경로를 열거 철수 것이다

symmetricEquals(X,Y) :- equal(X,Y). 
symmetricEquals(X,Y) :- equal(Y,X). 

transitiveEqual(A, B) :- 
    % look for an equality path from A to B 
    path(A, B, _Path). 

path(A, B, Path) :- 
    % build a path from A to B 
    path(A, B, [A], Path). 

path(A, B, _Acc, [B]) :- 
    symmetricEquals(A, B). 

path(A, B, Visited, [C|Path]) :- 
    symmetricEquals(A, C), 
    C \== B, 
    \+ memberchk(C, Visited), 
    path(C, B, [C|Visited], Path). 

참고. equal/2 사실에 의해 암시 된 그래프가 크고 많은 연결이 끊어진 구성 요소가 포함되어 있거나 모든 조합을 찾고있는 경우 이것은 상당히 비쌀 수 있습니다.

+0

그러나 제안에 감사 드리며, SWI-Prolog에서 코드를 사용한 후에? -transitiveEqual (A, B)를 쿼리 한 후에 아무 것도 생성되지 않았습니다. 저는 항상 A = B를 출력으로 받았습니다. 어떤 생각? – user1935724

+0

아, 저는 역 추적 할 때 바인딩을 나열하는 대신에'A'와'B'의 바운드 값을 위해 _test_에 술어를 사용한다고 잘못 가정했습니다. 두 가지 모두를 처리하기 위해 내 대답을 업데이트하겠습니다. – sharky