次の作業プログラムがあります: (このサイトでテストできます: http://swish.swi-prolog.org。保存したプログラムへの直接リンクを削除しました。誰でも編集できることに気付いたからです。)
無向グラフの 2 点間のパスを検索します。重要な部分は、結果が「メイン」述語のスコープで返されることです。(トラック変数内)
edge(a, b).
edge(b, c).
edge(d, b).
edge(d, e).
edge(v, w).
connected(Y, X) :-
(
edge(X, Y);
edge(Y, X)
).
path(X, X, _, []) :-
connected(X, _).
path(X, Y, _, [X, Y]) :-
connected(Y, X).
path(X, Z, Visited, [X|Track]) :-
connected(X, Y),
not(member(X, Visited)),
path(Y, Z, [X|Visited], Track).
main(X, Y) :-
path(X, Y, [], Track),
print(Track),
!.
結果:
?- main(a, e).
[a, b, d, e]
true
?- main(c, c).
[]
true
?- main(b, w).
false
私の質問:
訪問したノードのリストは、2 つの異なる方法で述語に渡されます。バインドされた Visited 変数とバインドされていない Track 変数。これら 2 つの異なる形式のパラメーター受け渡しの名前は何ですか?
通常、私はバインドされていないパラメーターの受け渡し (トラック変数) を使用して、結果をメインの述語のスコープに入れたいだけでした。しかし、メンバー チェックが Track 変数で機能しなかったため、Visited 変数も追加する必要がありました (理由はわかりません)。バインドされていない方法でトラックを渡すだけで動作させることは可能ですか? (Visited 変数なし)
どうもありがとう!