SWI Prolog水壶拼图

时间:2013-11-25 19:26:47

标签: prolog water-jug-problem

这是我第一次来这里,我知道已有关于此的帖子,但似乎与我想编码它的方式不一样。我只是不断得到答案。

我输入: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).

非常感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分: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会更好。您 可以通过第三个已经访问过的状态 论点。然后代码如下:

[..]
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).
[..]

希望这有帮助。

再见

P.S。:concat / 3不是必需的,只需说E = [(Z,0)|L], 或者完全消除E等式并且只是修改呼叫 解决/ 3体内的solve(Z,0,[(Z,0)|L])