2014-12-03 28 views
1

我已經寫在序言的路徑:如何處理在序言圖的遍歷

edge(x, y). 
edge(y, t). 
edge(t, z). 
edge(y, z). 
edge(x, z). 
edge(z, x). 

path(Start, End, Path) :- 
    path3(Start, End, [Start], Path). 

path3(End, End, RPath, Path) :- 
    reverse(RPath, Path). 
path3(A,B,Path,[B|Path]) :- 
    edge(A,B), 
    !. 
path3(A, B, Done, Path) :- 
    edge(A, Next), 
    \+ memberchk(Next, Done), 
    path3(Next, B, [Next|Done], Path). 

其照顧循環圖,以及,我得到一個不規則的輸出,當我嘗試遍歷從同一個節點相同的節點。

如:path(x,x,P). 預期的輸出應該是:

P = [x, z, t, y, x] 
P = [x, z, y, x] 
P = [x, z, x] 

但是,我得到的輸出:

p = [x]    ------------> wrong case 
P = [x, z, t, y, x] 
P = [x, z, y, x] 
P = [x, z, x] 

我怎樣才能擺脫這種有害的情況。 感謝

+1

程序中的截圖不正確。要看到這個,試試'path(x,Y,P)',其中'Y'是一個變量。 – false 2014-12-03 13:32:22

回答

0
path(Start, End, Path) :- 
    edge(Start,First), 
    path3(Start, End, [Start,First], Path). 

應該工作

1

我們path/4一起使用與edge/2

 
?- path(edge,Path,x,Last), edge(Last,x). 
    Last = z, Path = [x,y,t,z] 
; Last = z, Path = [x,y,z] 
; Last = z, Path = [x,z] 
; false. 

好吧!以上三個答案正是OP在問題中所期望的。

只是爲了好玩我們來看看全部根據edge/2的可能路徑!

?- path(edge,Path,From,To). 
    From = To  , Path = [To] 
; From = x, To = y, Path = [x,y] 
; From = x, To = t, Path = [x,y,t] 
; From = x, To = z, Path = [x,y,t,z] 
; From = x, To = z, Path = [x,y,z] 
; From = y, To = t, Path = [y,t] 
; From = y, To = z, Path = [y,t,z] 
; From = y, To = x, Path = [y,t,z,x] 
; From = t, To = z, Path = [t,z] 
; From = t, To = x, Path = [t,z,x] 
; From = t, To = y, Path = [t,z,x,y] 
; From = y, To = z, Path = [y,z] 
; From = y, To = x, Path = [y,z,x] 
; From = x, To = z, Path = [x,z] 
; From = z, To = x, Path = [z,x] 
; From = z, To = y, Path = [z,x,y] 
; From = z, To = t, Path = [z,x,y,t] 
; false.