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 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| % NB : contenance max :
% Grande : 31L
% Moyenne : 11L
% Petite : 3L
% 3 Actions possibles :
arc(X,Y):- jeter(X,Y).
arc(X,Y):- remplir(X,Y).
arc(X,Y):- transvaser(X,Y).
% Vrai si X n'appartient pas à la liste
pasdansliste(_,[]).
pasdansliste(X,[Y|L]) :- X \= Y, pasdansliste(X,L).
% Fonction chemin :
% Si un arc existe, on le prend
chemin(X,Y,[],_) :- arc(Y,X).
% Sinon, on fait une recherche en évitant les boucles
chemin(X,Y,R,Deja_passe) :- arc(Z,X), pasdansliste(Z,Deja_passe) , chemin(Z,Y,Etat_int,[Z|Deja_passe]), R = [Z|Etat_int].
%----------------Changements d'états----------------------
jeter((A,B,C),(0,B,C)):- A\=0.
jeter((A,B,C),(A,0,C)):- B\=0.
jeter((A,B,C),(A,B,0)):- C\=0.
remplir((A,B,C),(31,B,C)):- A\=31.
remplir((A,B,C),(A,11,C)):- B\=11.
remplir((A,B,C),(A,B,3)):- C\=3.
transvaser1(A,B,Bmax,Afin,Bfin):- B+A<Bmax,
Afin is 0,
Bfin is B+A.
transvaser1(A,B,Bmax,Afin,Bfin):- B+A>=Bmax,
Afin is A-(Bmax-B),
Bfin is Bmax.
transvaser((A,B,C),(Af,Bf,C)):- A\=0, B\=11, transvaser1(A,B,11,Bf,Af).
transvaser((A,B,C),(Af,B,Cf)):- A\=0, C\=3, transvaser1(A,C,3,Af,Cf).
transvaser((A,B,C),(Af,Bf,C)):- B\=0, A\=31, transvaser1(B,A,31,Bf,Af).
transvaser((A,B,C),(A,Bf,Cf)):- B\=0, C\=3, transvaser1(B,3,C,Bf,Cf).
transvaser((A,B,C),(Af,B,Cf)):- C\=0, A\=31, transvaser1(C,2,31,Cf,Af).
transvaser((A,B,C),(A,Bf,Cf)):- C\=0, B\=11, transvaser1(B,C,11,Cf,Bf).
%---------------Appel principal => plantage---------------
% chemin((0,0,0),(7,X,Y),[],L). |
Partager