这是我第一次来这里,我知道已有关于此的帖子,但似乎与我想编码它的方式不一样。我只是不断得到答案。
我输入: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).
非常感谢任何帮助。感谢。
答案 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])
。