SWI Prolog水壶拼图

SWI Prolog水壶拼图,prolog,water-jug-problem,Prolog,Water Jug Problem,这是我第一次来这里,我知道已经有关于这方面的帖子了,但似乎与我编写代码的方式不同。我总是得到错误的答案 我输入:solve(0,0)。 结果为false。 代码 solve(5,u)。 求解(X,Y):-X0, Z是Y-(7-X), \+成员((7,Z),L), concat(E,[(X,Z)],L), 写下('用4升罐子装满7升罐子。\n'), 求解(7,Z)。 求解(X,Y):-X+Y>=4, X>0, Z是X-(4-Y), \+成员((Z,4),L), concat(E,[(Z,Y)],L

这是我第一次来这里,我知道已经有关于这方面的帖子了,但似乎与我编写代码的方式不同。我总是得到错误的答案

我输入:
solve(0,0)。
结果为
false。

代码

solve(5,u)。
求解(X,Y):-X<7,
\+成员((7,Y),L),
concat(E,[(X,Y)],L),
写入('从水龙头中注满7升水罐。\n'),
求解(7,Y)。
求解(X,Y):-Y<4,
\+成员((X,4),L),
concat(E,[(X,Y)],L),
写入('从水龙头中注满4升水罐。\n'),
求解(X,4)。
求解(X,Y):-X+Y>=7,
Y>0,
Z是Y-(7-X),
\+成员((7,Z),L),
concat(E,[(X,Z)],L),
写下('用4升罐子装满7升罐子。\n'),
求解(7,Z)。
求解(X,Y):-X+Y>=4,
X>0,
Z是X-(4-Y),
\+成员((Z,4),L),
concat(E,[(Z,Y)],L),
写下('用7升罐子装满4升罐子。\n'),
求解(Z,4)。
求解(X,Y):-X+Y<4,
Y>0,
Z是X+Y,
\+成员((Z,0),L),
concat(E,[(Z,Y)],L),
写入('将4升罐空入7升罐中。\n'),
求解(Z,0)。
求解(X,Y):-X+Y<7,
X>0,
Z是X+Y,
\+成员((0,Z),L),
concat(E,[(X,Z)],L),
写入('将7升水罐空入4升水罐。\n'),
求解(0,Z)。
求解(X,Y):-X>0,
\+成员((0,Y),L),
concat(E,[(X,Y)],L),
写入('7升空罐。\n'),
求解(0,Y)。
求解(X,Y):-Y>0,
\+成员((X,0),L),
concat(E,[(X,Y)],L),
写入('4升空罐。\n'),
求解(X,0)。
成员(X[X | L])。
成员(X[L | L]):
成员(X,L)。
concat([],L,L)。
concat([X | A],B[X | L]):-
康卡特(A,B,L)。

非常感谢您的帮助。谢谢。

我想你应该做一个简单的深度优先搜索 避免循环。至少我接受了会员支票 作为搜索中现有循环的检查

现在,您的代码用于谓词
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).
[..]
[..]
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).
[..]
希望这有帮助

再见

注:concat/3不是必需的,只需说
E=[(Z,0)| L]
, 或者消除E方程,只需修改调用即可
体中的solve/3的值为
solve(Z,0,[(Z,0)| L])
member(X,[L | L]):-member(X,L)。
可能应该是
member(X,[Y | L]):-X\=Y,member(X,L)。
但是SWI-prolog对此有一个内置谓词,因此不需要它。而且,每次你有这个:
solve(X,Y):-X<7,\+成员((7,Y),L),…
,列表
L
没有被实例化,所以
\+成员((7,Y),L)
总是会失败。是的,我去掉了它。我想我可能需要在某种程度上覆盖它。谢谢。请看我对会员支票的其他评论。是的,我看到了。谢谢我知道问题出在会员身上,但我不明白怎么回事。我对序言只是相当陌生。我试图检查
(7,Y)
是否在列表中,以及是否不将其添加到列表中。是的,在这种情况下,您正在检查的列表没有实例化,因此部分逻辑似乎有缺陷。当它没有被实例化时,Prolog将为您实例化它,使
成员
成功,这意味着
\+成员
将失败。
[..]
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).
[..]