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.

solve(F0, F0, [], _).
solve(F0, FL, [M|Ms], Fs) :- length(Ms, MsL), MsL < 5, move(F0, M, F1), not(member(F1, Fs)),
  solve(F1, FL, Ms, [F1|Fs]).

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