3

私はプロローグで書いています:

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]

どうすればこの不要なケースを取り除くことができますか。ありがとう

4

2 に答える 2

3

path/4を次のものと一緒に使用しedge/2ます。

?-パス( edge ,Path, x ,Last),エッジ(Last, x ).
  ラスト = z、パス = [x,y,t,z]
; ラスト = z、パス = [x,y,z]
; ラスト = z、パス = [x,z]
; 間違い。

大丈夫!上記の3つの回答は、まさに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.
于 2015-08-20T09:55:01.103 に答える
0
path(Start, End, Path) :-
    edge(Start,First),
    path3(Start, End, [Start,First], Path).

動作するはずです

于 2014-12-03T10:17:28.310 に答える