私はPrologに技術的に '返品'がないことを知っていますが、そうでなければ質問を策定する方法を知りませんでした。Prolog - アルゴリズムで印刷する代わりに結果を返す
メトロステーション間のルートを見つけるためのアルゴリズムのサンプルコードが見つかりました。それはうまく動作しますが、結果を印刷して拡張するのが難しくなるか、例えばfindall/3
を実行することになっています。
% direct routes
findRoute(X,Y,Lines,Output) :-
line(Line,Stations),
\+ member(Line,Lines),
member(X,Stations),
member(Y,Stations),
append(Output,[[X,Line,Y]],NewOutput),
print(NewOutput).
% needs intermediate stop
findRoute(X,Y,Lines,Output) :-
line(Line,Stations),
\+ member(Line,Lines),
member(X,Stations),
member(Intermediate,Stations),
X\=Intermediate,Intermediate\=Y,
append(Output,[[X,Line,Intermediate]],NewOutput),
findRoute(Intermediate,Y,[Line|Lines],NewOutput).
line
は、アトムとステーションを含むリストを持つ述語です。元の場合
:line(s1, [first_stop, second_stop, third_stop])
だから私は11行目でそのprint
を取り除くされませんし、後で使用するために結果を格納するために、私のルールに余分な変数を追加しようとしています何。しかし、私は悲惨に失敗しました。何をしようとしても無限ループに入るか、偽を返します。
今:
?- findRoute(first_stop, third_stop, [], []).
% prints [[first_stop,s1,third_stop]]
が欲しい:あなたのような
?- findRoute(first_stop, third_stop, [], R).
% [[first_stop,s1,third_stop]] is stored in R
あなたは本当に 'findRoute/4'に新しい引数を追加し、' print(newOutput) 'を取り除くだけです。明らかに、述語でまだ使用されていない新しい引数の名前を選択します。 – lurker