私は、グラフ上のパスファインドであるProlog(gprolog)でプログラムを書いています。私は部分的にそれに基づいてthis SO postに基づいています。名前のない変数を書く
例を挙げておきます。ここで私が描いたグラフ例は次のとおりです。
そしてここでは、コードが最初のように見えたものです:
path([Goal],Goal,Goal).
path(P,Start,Goal) :- adjacent(Start,X),
\+ (memberchk(X,P)),
(
Goal=X
;
path([Start|P],X,Goal)
).
かかわらず、その基本ケースが冗長であるかどうかの、ここでの問題があります。私は
| ?- path(P,a,f).
の入力スタイルをしたいし、その入力のために、私は、しかし、それはmemberchk
と嘘を立つようなコードに問題があることを
P = [a,s,f]
true ?
の出力を得るでしょう。 memberchk(a,P)
の場合は、統合を試み、memberchk(a,[a|_])
を呼び出し、trueを返します。私はこれが起きたくないので、最初にvar/1
述語を使ってP
がインスタンス化されているかどうかをチェックします。 P
がインスタンス生成されている場合このように、私のコードは
path([Goal],Goal,Goal).
path(P,Start,Goal) :- var(P),
path([],Start,Goal).
path(P,Start,Goal) :- adjacent(Start,X),
\+ (memberchk(X,P)),
(
Goal=X
;
path([Start|P],X,Goal)
).
に変更今、私たちは、空のリストでpath/3
を呼び出します。 私の問題はこれです:path([],Start,Goal)
とP
は[]
に関連付けられていないので、最後にP
を印刷できません。
私はwrite/1
述語を使用して試してみましたが、それはどちらかのすべてのステップでP
をプリントアウトしたりP = _26
(それがインスタンス生成P
P
のではなく、最終的な値を印刷していますという意味)に印刷します。
私はこれが単純な問題であることを願っています。私はPrologを非常に新しくしています。
似たようなことがある場合はお詫び申し上げます。私は助けることができる他の質問に指摘したいと思う。私はそれを投稿する前にSOとGoogleを検索しました。
[この質問](http://stackoverflow.com/q/30328433/7473772)を参照してください。おそらく有用な一般化を示しているでしょうか? –