2014-12-03 26 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.