这是一个水壶问题。大桶装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).