plan_ca(P):- etat_i(E1),trans(E1,E2,[],P),etat_f(E2).
trans(E,E,A,A).
trans(E1,E2,Al,P):- m_a_j(E1,E,A,Al), trans(E,E2,[A|Al],P).
m_a_j(E1,E2,A,Al):- action(A,E1),hors(A,Al),legal(A,E1),transform(A,E1,E2).
action(transfert(X,Y,Z),E):-sur(X,Y,E).
legal(transfert(X,Y,Z),E):-libre(X,E),libre(Z,E), X \== Z.
etat_i([sur(a,b),sur(b,p),sur(c,r),libre(c),libre(a),libre(q)]).
etat_f(E):-sur(a,b,E),sur(b,c,E),sur(c,r,E).
libre(X,E):-dans(libre(X),E).
sur(X,Y,E):-dans(sur(X,Y),E).
transform(transfert(X,Y,Z),Ei,Ef):-rp(sur(X,Y),sur(X,Z),Ei,E1),
                            rp(libre(Z),libre(Y),E1,Ef).
rp(X,Y,[X|T],[Y|T]).
rp(X,Y,[Z|T],[Z|T1]):- rp(X,Y,T,T1).
dans(X,[X|T]).
dans(X,[Y|T]):- X \== Y, dans(X,T).
hors(X,Y):-not dans(X,Y).


