序言中的水壶
这是一个水壶的问题。较大的桶可容纳 5 个,较小的桶可容纳 3 个。我想在较大的桶中放入 4 个。
问题是当我运行时我无法得到任何答案,它会产生错误。看起来不是一个明显的错误,算法简单直接。
谁能帮我找出问题所在吗?
check_safe(X,Y):- X>=0,X=<3,Y>=0,Y=<5.
%empty the 3 bucket
move(state(X,Y),state(0,Y)):- X>0,check_safe(0,Y).
%empty the 5 bucket
move(state(X,Y),state(X,0)):- Y>0,check_safe(X,0).
%fill the 3 bucket
move(state(X,Y), state(3,Y)):- X<3, X>=0,check_safe(3,Y).
%fill the 5 bucket
move(state(X,Y),state(X,5)):- Y>=0, Y<5,check_safe(X,5).
%transfer from 3 to 5 until the larger bucket is full
move(state(X,Y),state(NewX,5)):- X+Y>= 5, X>0,Y>=0, NewX=X+Y-5,check_safe(NewX,5).
%transfer from 3 to 5 until the smaller bucket is empty
move(state(X,Y),state(0,NewY)):- X+Y<5, X>0,Y>=0, NewY=X+Y,check_safe(0,NewY).
%transfer from 5 to 3 until the smaller is full
move(state(X,Y),state(3,NewY)):- Y>0,X>=0,X+Y>=5, NewY=Y+X-3,check_safe(3,NewY).
%transfer from 5 to 3 until the larger is empty
move(state(X,Y),state(NewX,0)):-Y>0,X>=0, X+Y<5, NewX=Y+X,check_safe(NewX,0).
path(X,X,_,[X]).
path(X,Y,BeenStates,Path):-
move(X,Somewhere),not(member(Somewhere,BeenStates)),
path(Somewhere,Y,[Somewhere|BeenStates],Path2), Path = [X|Path2].
puzzle:- path(state(0,0),state(0,5),[state(0,0)],PathList),X>=0,X=<5,
writeOut(PathList).
% Here's an easy little predicate for printing a list.
writeOut([]).
writeOut([H|T]):-write(H),nl, writeOut(T).
It is a water jug problem. The larger bucket holds 5, the smaller bucket holds 3. I want to get 4 in the larger bucket.
The problem is that when I run I cannot get any answer, it produces an error. It doesn't seem like an obvious error, the algorithm is simple and direct.
Could anyone help me to find what is wrong with it?
check_safe(X,Y):- X>=0,X=<3,Y>=0,Y=<5.
%empty the 3 bucket
move(state(X,Y),state(0,Y)):- X>0,check_safe(0,Y).
%empty the 5 bucket
move(state(X,Y),state(X,0)):- Y>0,check_safe(X,0).
%fill the 3 bucket
move(state(X,Y), state(3,Y)):- X<3, X>=0,check_safe(3,Y).
%fill the 5 bucket
move(state(X,Y),state(X,5)):- Y>=0, Y<5,check_safe(X,5).
%transfer from 3 to 5 until the larger bucket is full
move(state(X,Y),state(NewX,5)):- X+Y>= 5, X>0,Y>=0, NewX=X+Y-5,check_safe(NewX,5).
%transfer from 3 to 5 until the smaller bucket is empty
move(state(X,Y),state(0,NewY)):- X+Y<5, X>0,Y>=0, NewY=X+Y,check_safe(0,NewY).
%transfer from 5 to 3 until the smaller is full
move(state(X,Y),state(3,NewY)):- Y>0,X>=0,X+Y>=5, NewY=Y+X-3,check_safe(3,NewY).
%transfer from 5 to 3 until the larger is empty
move(state(X,Y),state(NewX,0)):-Y>0,X>=0, X+Y<5, NewX=Y+X,check_safe(NewX,0).
path(X,X,_,[X]).
path(X,Y,BeenStates,Path):-
move(X,Somewhere),not(member(Somewhere,BeenStates)),
path(Somewhere,Y,[Somewhere|BeenStates],Path2), Path = [X|Path2].
puzzle:- path(state(0,0),state(0,5),[state(0,0)],PathList),X>=0,X=<5,
writeOut(PathList).
% Here's an easy little predicate for printing a list.
writeOut([]).
writeOut([H|T]):-write(H),nl, writeOut(T).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您没有使用“is”来进行作业。
您的
puzzle\0
谓词有两个未绑定变量:X
&Y
。并且您的
path\4
谓词有错误。尝试这些:
下面是我对此问题的解决方案:
我得到这些解决方案:
显然倒数第二个(最短的)是最好的。
You're not using "is" for the assignments.
Your
puzzle\0
predicate has two unbound variables:X
&Y
.And your
path\4
predicates are faulty.Try these:
Below is my solution to this problem:
I get these solutions:
Obviously the second to last, being the shortest, is the best.
**
**
**
**