move((E8,E5,E3),'E8 ausschuetten',(0,E5,E3)) :- E8 > 0.
move((E8,E5,E3),'E5 ausschuetten',(E8,0,E3)) :- E5 > 0.
move((E8,E5,E3),'E3 ausschuetten',(E8,E5,0)) :- E3 > 0.

%move((E8,E5,E3),'E8 -> E5',(R8,5,E3)) :- E8 > 0, R8 is E8 - (5 - E5).
%move((E8,E5,E3),'E8 -> E5',(0,R5,E3)) :- R5 is E5 + E8, R5 =< 5.

move((E8,E5,E3),'E8 -> E5',(E8Neu,E5Neu,E3)) :- E8 > 0, E5Neu is min(5, E8+E5), E8Neu is E8+E5-E5Neu.
move((E8,E5,E3),'E8 -> E3',(E8Neu,E5,E3Neu)) :- E8 > 0, E3Neu is min(3, E8+E3), E8Neu is E8+E3-E3Neu.
move((E8,E5,E3),'E5 -> E8',(E8Neu,E5Neu,E3)) :- E5 > 0, E8Neu is min(8, E5+E8), E5Neu is E5+E8-E8Neu.
move((E8,E5,E3),'E5 -> E3',(E8,E5Neu,E3Neu)) :- E5 > 0, E3Neu is min(3, E5+E3), E5Neu is E5+E3-E3Neu.
move((E8,E5,E3),'E3 -> E8',(E8Neu,E5,E3Neu)) :- E3 > 0, E8Neu is min(8, E3+E8), E3Neu is E3+E8-E8Neu.
move((E8,E5,E3),'E3 -> E5',(E8,E5Neu,E3Neu)) :- E3 > 0, E5Neu is min(5, E3+E5), E3Neu is E3+E5-E5Neu.

start((8,0,0)).
final((4,0,0)).
solutions(Ms) :- start(F0), solve(F0, FL, Ms, [F0]), final(FL).

solve(X,X,[],_).
solve(X,Y,[M|Ms],Fs) :- move(X,M,F), not(member(F,Fs)),
                        solve(F,Y,Ms,[F|Fs]).
