Prolog程序,有两个空水壶和无限的水,水壶都没有刻度..
prolog吧
全部回复
仅看楼主
level 1
nickzp 楼主
题目是这样的, 用swi-prolog写一个小AI程序:
有两个空水壶和无限的水,水壶都没有刻度..一个能装7升,另一个能装4升,用深度优先搜索,量出准确的5升水.水壶从空状态(0,0)开始,到(5,X).
代码如下,但出现了一点小问题,不能运行.
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,[Y|L]):-X \= Y, member(X,L).
concat([],L,L).
concat([X|A],B,[X|L]):- concat(A,B,L).
2014年12月01日 09点12分 1
level 1
ok(5,0,L,L).%考虑到大杯有5L时一定是从小杯倒进去的,因此小杯一定为0
ok(7,4,_,_):-!,fail.%没有意义,强制退出,节省计算资源
ok(M,N,L,LL):-integer(M),integer(N),M>=0,M<7,N>=0,N=<4,\+member([7,N],L),append([7,N],L,L1),ok(7,N,L1,LL). %fill in 7
ok(M,N,L,LL):-integer(M),integer(N),M>=0,M=<7,N>=0,N<4,\+member([M,4],L),append([M,4],L,L1),ok(M,4,L1,LL). %fill in 4
ok(M,N,L,LL):-integer(M),integer(N),m2n(M,N,M1,N1),\+member([M1,N1],L), append([M1,N1],L,L1),ok(M1,N1,L1,LL). %m2n
ok(M,N,L,LL):-integer(M),integer(N),n2m(M,N,M1,N1),\+member([M1,N1],L), append([M1,N1],L,L1),ok(M1,N1,L1,LL). %n2m
ok(M,N,L,LL):-integer(M),integer(N),M>0,M=<7,N>=0,N=<4,\+member([0,N],L),append([0,N],L,L1),ok(0,N,L1,LL). %empty 7
ok(M,N,L,LL):-integer(M),integer(N),M>=0,M=<7,N>=0,N<4,\+member([M,0],L),append([M,0],L,L1),ok(M,0,L1,LL). %empty 4
%M是大杯内的水量,N是小杯
m2n(M,N,M1,N1):-N<4,M>0,M+N=<4,N1 is M+N,M1 is 0.
m2n(M,N,M1,N1):-N<4,M>0,M+N>4,N1=4,M1 is M+N-4.
n2m(M,N,M1,N1):-M<7,N>0,M+N=<7,M1 is M+N,N1 is 0.
n2m(M,N,M1,N1):-M<7,N>0,M+N>4,M1=7,N1 is M+N-7.
%查询:?-ok(0,0,[[0,0]],Result).
比3楼的给出答案简洁。
2015年02月16日 07点02分 4
大佬求问该题:假设你有两个没有刻度的壶:4加仑的壶(壶A)和3加仑的壶(壶B)。任务是准确地测量罐子A里的2加仑水。
2019年05月12日 12点05分
要求是 (1)编写Prolog程序,使用深度优先搜索策略解决问题。 (2)显示程序为初始状态的所有四种可能变体生成的解决方案。例如,(0,0)表示两个壶都是空的,(4,0)表示壶A是满的,壶B是空的。 (3)跟踪重复状态,避免无限循环。
2019年05月12日 12点05分
1