まず文脈。次の双方向グラフがあります。
Prolog では次のように表されます。
relation(a,c).
relation(b,d).
relation(c,d).
relation(d,e).
relation(e,f).
connection(X,Y) :- relation(X,Y).
connection(X,Y) :- relation(Y,X).
したがって、ノード間の関係と、ノード間の接続が、前に述べたように、両方向に関係しています。
私が探しているのは、2 つのノード間のグラフにパスがあるかどうかを判断path(X,Y)
できるプロローグ定義です(両方のノード間に少なくとも 1 つのパスが存在する場合は true、両方のノード間に既存のパスがない場合は false を返します)。
したがって、このモデルの目標出力は次のようになります。
?- path(a,d).
true.
?- path(b,a).
true.
?- path(f,b).
true
? path(a,g). % The node g doesn't exist
false.
これには訪問済みリストの使用が含まれることを知っています。これの例を見たことがありますが、2つのノード間のすべての可能なパスを示しています。しかし、これは私が探しているものではありません。私が探しているのは、2 つのノード間にパスがあるかどうかを検出する定義であり、2 つのノード間に可能なすべてのパスを提供するわけではありません。
編集: @mbratch のおかげで、提案された問題を解決策に適応させることができるようになりました。
relation(a,c).
relation(b,d).
relation(c,d).
relation(d,e).
relation(e,f).
connection(X,Y) :- relation(X,Y).
connection(X,Y) :- relation(Y,X).
path_exists(X,Y) :- path(X,Y,_), !.
path(A,B,Path) :-
travel(A,B,[A],Q),
reverse(Q,Path).
travel(A,B,P,[B|P]) :-
connection(A,B).
travel(A,B,Visited,Path) :-
connection(A,C),
C \== B,
\+member(C,Visited),
travel(C,B,[C|Visited],Path).