如何处理Prolog图遍历中的路径

问题描述 投票:1回答:2

我用Prolog写过:

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]

我如何摆脱这种不必要的情况。谢谢

prolog graph-theory traversal cyclic-graph
2个回答
1
投票

我们将 path/4path/4一起使用:

?-路径边缘,路径,x,最后),边缘(最后,x)。最后= z,路径= [x,y,t,z];最后= z,路径= [x,y,z];最后= z,路径= [x,z];假。

好!以上三个答案正是OP在问题中所希望的。

只是为了好玩,让我们看看基于edge/2all可能路径!

edge/2

0
投票
?- 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.

应该工作

© www.soinside.com 2019 - 2024. All rights reserved.