%  Rosalie, la moglie di Jack il contadino sta facendo una
%  torta di mele. A un certo punto si accorge di aver finito
%  il latte e chiede a Jack di andargli
%  a mungere due litri esatti di latte.
%  Jack esce fischiettando, entra nella stalla, mette
%  lo sgabello davanti alla mucca e si appresta a 
%  iniziare la mungitura, quando improvvisamente un
%  terribile dubbio assale la sua mente.
%  Nella stalla Jack ha solo un fusto da 3 litri e uno da 4.
%  Come puo' fare Jack a portare esattamente due litri di 
%  latte a Rosalie?

make_evaluable(_+_, $SUM(_,_)).
make_evaluable(_-_, $DIFF(_,_)).
make_evaluable(_<=_, $LE(_,_)).
make_evaluable(_>_, $GT(_,_)).
set(auto).

list(usable).
 -ff(x, y) | ff(3, y).  % riempi il f3
 -ff(x, y) | ff(0, y).  % svuota il f3
 -ff(x, y) | ff(x, 4).  % riempi il f4
 -ff(x, y) | ff(x, 0).  % svuota il f4
 -ff(x, y) | -(x+y <= 4) | ff(0, y+x).   % f3 -> f4
 -ff(x, y) | -(x+y <= 3) | ff(x+y, 0).  % f4 -> f3
 -ff(x, y) | -(x+y >  4) | ff(x - (4-y), 4).   % f3 -> f4 finche' f4 pieno
 -ff(x, y) | -(x+y >  3) | ff(3, y - (3-x)).  % f4 -> f3 finche' f3 pieno
 ff(0, 0).   % stato iniziale: fusti vuoti
 -ff(x, 2).  % stato goal: in uno dei due fusti ci sono 2 litri
end_of_list.
