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.

solve(F0, F0, [], _).
solve(F0, FL, [M|Ms], Fs) :- move(F0, M, F1), not(member(F1, Fs)),
  solve(F1, FL, Ms, [F1|Fs]). % Hier war unser Fehler! Statt [F1|Fs] hatten wir [F|Fs]

start((8,0,0)).
final((4,_,_)).
final((_,4,_)).

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