2011-10-19 4 views
1

그래프에서 findall/3 경로를 시도 할 때 중복 된 목록이 표시됩니까? 코드에 어떤 문제가 있습니까? S 8 : 14 S : S 7 13, S : 6 S와 중복되었다 복제의 패턴은 S이었다 (15) 등등 ..프롤로그 반환 중복 목록

co(X,Y) :- hen(X,Y) ; hen(Y,X). 

pan(A, B, _, [A,B]) :- co(A, B). 
pan(A, B, Vix, [A | Len]) :- 
    co(A, C), 
    C \== B, 
    \+ member(C, Vix), 
    pan(C, B, [C | Vix], Len). 

long_p(A, B):- 
    findall(Len, pan(A,B,[A],Len), Z), 
    printT(Z,0). 

printT([],_). 
printT([H|T],V) :- 
    V1 is V + 1, 
    write('S: '), write(V1), nl, 
    write(H), nl, 
    nl, 
    printT(T,V1). 

윌 프롤로그 findall은/3 창 구별을 결과?

답변

0

나는 추측 할 것입니다.

printT/2S:(length-of-path)을 인쇄합니다. 같은 길이의 A에서 B까지 여러 경로가 없어야하는 이유는 무엇입니까?

당신의 문제는 long_p/2이 동일한 경로에서 두 번 성공한다는 것입니다. 나는 이것을 위해 어떤 이유도 보이지 않는다. pan/4. 내가 틀렸다면 그 이유는 co/2 및/또는 hen/2입니다. 예를 들어 데이터베이스에 hen(a,b)hen(b,a)이있는 경우 co(a,b)은 두 번 성공합니다. 이것은 pan(A,B,[A],Len)이 성공하도록, 모든Len 's의 목록 Z를 생성합니다

co(X,Y) :- hen(X,Y). 
co(X,Y) :- hen(Y,X), \+ hen(X,Y). 
0
findall(Len, pan(A,B,[A],Len), Z) 

고정 할 수있다. 따라서 pan(A,B,[A],Len)은 역 추적되고 모든 솔루션 LenZ 목록에 추가됩니다.

그래프에는 두 개의 특정 노드 AB 사이에 길이가 6 인 경로가 있습니다. 그러나 A에서 B까지의 경로가 있습니다. 길이는이고 길이는이며이 두 경로를 찾습니다.