1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| :- module('zavonen.pl',[etat_initial/1,etat_final/1,etats_suivants/2]).
% les mesures sont vides
etat_initial([mesure(50,0), mesure(30,0)]).
% la mesure de 50 contient 40
etat_final([mesure(50,40), mesure(30,_)]).
etats_suivants([mesure(50, X), mesure(30,Y)], L):-
% on vide la mesure de 50, puis la mesure de 30
L1 = [[mesure(50,0), mesure(30, Y)], [mesure(50,X), mesure(30, 0)]],
% on remplit la mesure de 50, puis la mesure de 30
L2 = [[mesure(50,50), mesure(30, Y)], [mesure(50,X), mesure(30, 30)]],
% on tranvase le contenu de X dans Y
( verse1([mesure(50, X), mesure(30,Y)], L3); L3 = []),
( verse2([mesure(50, X), mesure(30,Y)], L4); L4 = []),
append(L1, L2, L5),
append(L3,L4,L6),
append(L5,L6,L).
verse1([mesure(50,X), mesure(30,Y)], [[mesure(50,X1), mesure(30,Y1)]]) :-
Y < 30, X > 0,
Y2 is 30 - Y,
Delta is min(X, Y2),
X1 is X - Delta,
Y1 is Y + Delta.
verse2([mesure(50,X), mesure(30,Y)], [[mesure(50,X1), mesure(30,Y1)]]) :-
X < 50, Y > 0,
X2 is 50 - X,
Delta is min(X2, Y),
X1 is X + Delta,
Y1 is Y - Delta. |
Partager