2011-10-19 124 views
1

當我試圖在圖中找到/ 3可能路徑時,我得到重複列表?任何想法有什麼問題的代碼?重複的圖案是S:6重複與S:13,S:7 S:14,S:8 S:15等..Prolog返回重複列表

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). 

請問的Prolog的findall/3返回一個獨特的結果?

回答

0

我會猜測。

printT/2打印S:(length-of-path)。爲什麼不應該有從A到B有相同長度的多條路徑?

我想你的問題是,long_p/2成功兩次相同的路徑。我在pan/4中看不到任何理由。除非我錯了,原因是co/2和/或hen/2。例如,如果數據庫中有hen(a,b)hen(b,a),則co(a,b)將成功兩次。這可能是固定

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

會產生列表Z所有Len的,這樣pan(A,B,[A],Len)成功。因此,pan(A,B,[A],Len)被回溯並且所有解決方案Len被放入列表Z

在圖形中,在兩個特定節點AB之間有一條長度爲6的路由。但也有從AB通過一些C長度爲13的路徑。findall找到這兩條路線等