2011-12-29 13 views
0

私は訪問先リストに部屋を追加する前に、簡単な迷路検索プログラムをプロローグに書き込もうとしています。すでに訪問したリストのメンバーであるかどうかを確認しています。しかし、本書のコードを使用しても、これを動作させることはできません。プロローグのメンバルールが期待どおりに機能しない

d(a,b). 
d(b,e). 
d(b,c). 
d(d,e). 
d(c,d). 
d(e,f). 
d(g,e). 


go(X, X, T). 
go(X, Y, T) :- 
    (d(X,Z) ; d(Z, X)), 
    \+ member(Z,T), 
    go(Z, Y, [Z|T]). 

どうしたらよいですか?

答えて

3

あなたのプログラムは正常であるようです。 問題は、3番目の引数をuninstantiatedにしてgo/3を呼び出していることです。 その場合、メンバー(X、T)は常に成功し、したがって節は失敗します。

空リストを使用して述語を3番目のパラメータとして呼び出すことができます。

go(From, To, Path):- 
    go(From, To, [], Path). 

go(X, X, T, T). 
go(X, Y, T, NT) :- 
    (d(X,Z) ; d(Z, X)), 
    \+ member(Z,T), 
    go(Z, Y, [Z|T], NT). 
+1

空のリストよりも優れ確かに出発地点を含むシングルトンのようになります。

?- go(a, g, []). true 

パスを返すようにしたい場合は、このように、行くために別のパラメータを追加することを検討してください。 – m09

+0

ありがとう、それは問題を解決します。 – tomsky

関連する問題