2

これは私にとって初めてのことであり、これに関する投稿が既にあることは知っていますが、私が想定しているコーディング方法とは異なるようです。私は答えが間違っているだけです。

入力します :solve(0,0). 結果はfalse.

コード。

solve(5,_).
solve(X,Y):- X < 7,
   \+ member((7,Y),L),  
   concat(E,[(X,Y)],L),
   write('Fill 7 litre jug from tap.\n'),
   solve(7,Y).
solve(X,Y):- Y < 4,
   \+ member((X,4),L),
   concat(E,[(X,Y)],L),
   write('Fill 4 litre jug from tap.\n'),
   solve(X,4).
solve(X,Y):- X+Y >= 7,
   Y > 0,
   Z is Y - (7 - X),
   \+ member((7,Z),L),
   concat(E,[(X,Z)],L),
   write('Fill 7 litre jug with 4 litre jug.\n'),
   solve(7,Z).
solve(X,Y):- X+Y >= 4,
   X > 0,
   Z is X - (4 - Y),
   \+ member((Z,4),L),
   concat(E,[(Z,Y)],L),
   write('Fill 4 litre jug with 7 litre jug.\n'),
   solve(Z,4).
solve(X,Y):- X+Y < 4,
   Y > 0,
   Z is X + Y,
   \+ member((Z,0),L),
   concat(E,[(Z,Y)],L),
   write('Empty 4 litre jug into 7 litre jug.\n'),
   solve(Z,0).
solve(X,Y):- X+Y < 7,
   X > 0,
   Z is X+Y,
   \+ member((0,Z),L),
   concat(E,[(X,Z)],L),
   write('Empty 7 litre jug into 4 litre jug.\n'),
   solve(0,Z).
solve(X,Y):- X > 0,
   \+ member((0,Y),L),
   concat(E,[(X,Y)],L),
   write('Empty 7 litre jug.\n'),
   solve(0,Y).
solve(X,Y):- Y > 0,
   \+ member((X,0),L),
   concat(E,[(X,Y)],L),
   write('Empty 4 litre jug.\n'),
   solve(X,0).

member(X,[X|L]).
member(X,[L|L]):- 
   member(X,L).

concat([],L,L).
concat([X|A],B,[X|L]):- 
   concat(A,B,L).

どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

0

ループを回避して単純な深さ優先検索を行いたいと思います。少なくとも、検索で既存のループのチェックとしてメンバー チェックを使用します。

これで、コードは述語用にsolve/2なり、次のようになります。

[..]
solve(X,Y):- X+Y < 4,
   Y > 0,
   Z is X + Y,
   \+ member((Z,0),L),
   concat(E,[(Z,Y)],L),
   write('Empty 4 litre jug into 7 litre jug.\n'),
   solve(Z,0).
[..]

問題は、L と E を渡さないことです。また、Prolog テキストを参照するときに警告が表示されるはずです。おそらく、E はシングルトン変数であると表示されます。

solve/3 述語の代わりに述語を使用するソリューションのsolve/2方がうまくいくと思います。3 番目の引数で、既に訪れた状態を渡すことができます。コードは次のようになります。

[..]
solve(X,Y,L):- X+Y < 4,
   Y > 0,
   Z is X + Y,
   \+ member((Z,0),L),
   concat(E,[(Z,Y)],L),
   write('Empty 4 litre jug into 7 litre jug.\n'),
   solve(Z,0,E).
[..]

お役に立てれば。

さよなら

PS: concat/3 は必要ありませE = [(Z,0)|L]solve(Z,0,[(Z,0)|L]).

于 2014-04-09T01:27:52.180 に答える