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',(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(F0,F0,[],_).
solve(F0,FL,[M|Ms],Fs) :- move(F0,M,F1), not(member(F1,Fs)),
                          solve(F1,FL,Ms,[F1|Fs]).


