Мне нужно решить 3 кувшина с водой, но с небольшой хитростью. Мне не нужно использовать алгоритм, но нужно иметь «функцию», которая позволяет пользователю перемещать литры из кувшина в другой с начальным и конечным состояниемчто это написано и им.
Например, он пишет начальное (10,0,0,0, r), и первое состояние составляет 10 литров в первом и ноль в двух других, также он пишет окончательное (0,3,3,3, l) и конечное состояние имеет 3 литра в двух меньших кувшинах и ноль в первом.
«Движения» между кувшинами происходят, когда он пишет go (7,3, r) где он двигается на 3 литра вправо (справа налево, мы получаем форму кувшина большего или меньшего размера) от большего к второму кувшину, -7 - это оставленные литра, а 3 - литра, которые нужно переместитьr - это направление.
И я написал этот код пролога, но каждое состояние "ложь" есть. У кого-нибудь есть идеи, почему ??
:- dynamic go/3.
:- dynamic cur_state/1,init/5.
:- dynamic end_state/1, final/5.
cur_state(State):-State = state(10,0,0,7,l).
end_state(State):-State = state(0,3,3,0,r).
pour(state(D1,D2,D3,N,l),move(D,C,r),state(D,C,D3,N,r)) :-
D is D1-N,
C is D2+N.
pour(state(D1,D2,D3,N,r),move(D,C,l),state(D,C,D3,N,l)) :-
D is D1-N,
C is D2.
pour(state(D1,D2,D3,N,l),move(D,C,r),state(D,D2,C,N,r)) :-
D is D1-N,
C is D3+N.
pour(state(D1,D2,D3,N,l),move(D,C,r),state(D1,D,C,N,r)) :-
D is D2-N,
C is D3+N.
pour(state(D1,D2,D3,N,r),move(D,C,l),state(D1,D,C,N,l)) :-
D is D2-N,
C is D1+N.
pour(state(D1,D2,D3,N,r),move(D,C,l),state(D1,D,c,N,l)) :-
D is D2-N,
C is D3.
pour(state(D1,D2,D3,N,l),move(D,C,r),state(C,D2,D,N,r)) :-
D is D3-N,
C is D1.
pour(state(D1,D2,D3,N,r),move(D,C,l),state(D1,C,D,N,l)) :-
D is D3-N,
C is D2+N.
pour(state(D1,D2,D3,N,r),move(D,C,l),state(C,D2,D,N,l)) :-
D is D3-N,
C is D1+N.
carry(7,0).
carry(3,0).
carry(10,0).
carry(4,0).
carry(7,3).
legal(10,X,Y):-X+Y=<10.
legal(X,Y,Z):-X+Y+Z=<10.
legal(X,7,Y):-X+Y=<3.
legal(X,Y,3):-X+Y=<7.
newstate(state(D1,D2,D3,N,l),state(D11,D22,D33,N1,r)):-
carry(M,C),
M=<7,C=<3,
D22 is D2+N,
D11 is D1-N,
D3 is D33,
N1 is N,
D2=<7,D1=<10,
legal(D1,D2,D3).
newstate(state(D1,D2,D3,N,r),state(D11,D22,D33,N1,l)):-
carry(M,C),
M=<10,C=<100,
D11 is D1-N,
D22 is D2,
D33 is D3,
D1=<10,
legal(D1,D2,D3).
newstate(state(D1,D2,D3,N,l),state(D11,D22,D33,N1,r)):-
carry(M,C),
M=<10,C<3,
D11 is D1-N,
D33 is D3+N,
D22 is D2,
D1=<10,D3=<3,
legal(D1,D2,D3).
newstate(state(D1,D2,D3,N,r),state(D11,D22,D33,N1,l)):-
carry(M,C),
M=<7,C=<3,
D22 is D2-N,
D33 is D1+N,
D11 is D1,
D2=<7,D1=<10,
legal(D1,D2,D3).
newstate(state(D1,D2,D3,N,l),state(D11,D22,D33,N1,r)):-
carry(M,C),
M=<7,C=0,
D22 is D2-N,
D33 is D3+N,
D11 is D1,
D2=<7,D3=<3,
legal(D1,D2,D3).
newstate(state(D1,D2,D3,N,r),state(D11,D22,D33,N1,l)):-
carry(M,C),
M=<7,C=<100,
D22 is D2-N,
D33 is D3,
D11 is D1,
D2=<7,
legal(D1,D2,D3).
newstate(state(D1,D2,D3,N,r),state(D11,D22,D33,N1,l)):-
carry(M,C),
M=<3,C=<7,
D22 is D2+N,
D33 is D3-N,
D11 is D1,
D3=<3,D2=<7,
legal(D1,D2,D3).
newstate(state(D1,D2,D3,N,r),state(D11,D22,D33,N1,l)):-
carry(M,C),
M=<3,C=<100,
D11 is D1+N,
D33 is D3-N,
D22 is D2,
D3=<3,D1=<10,
legal(D1,D2,D3).
newstate(state(D1,D2,D3,N,l),state(D11,D22,D33,N1,r)):-
carry(M,C),
M=<3,C=<100,
D33 is D3-N,
D22 is D2,
D11 is D1,
D3=<3,
legal(D1,D2,D3).
eisodos(_):- cur_state(State),write(State),nl.
init(S1,S2,S3,S4,S5):-assert(cur_state(State):-State = state(S1,S2,S3,S4,S5)),write('Arxikh:'),
write(state(S1,S2,S3,S4,S5)),retractall(init(S1,S2,S3,S4,S5)),nl.
final(S1,S2,S3,S4,S5):-assert(end_state(State):-State = state(S1,S2,S3,S4,S5)),write('Telikh:'),
write(state(S1,S2,S3,S4,S5)),retractall(final(S1,S2,S3,S4,S5)),nl.
go(Move1,Move2,Move3):-cur_state(State),newstate(State,NextState),
pour(State,move(Move1,Move2,Move3), NextState),
retractall(cur_state(State):-State = state(_,_,_,_,_)),asserta(cur_state(NextState)),
((end_state(NextState),write('Bravo!!!!')) ;(write(' ---*Eiste sthn katastash --- :'),write(NextState))),nl.