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