/////////////////////: main of problem resolveur(_Deplacements):- StartState(_Ci), EndState(_Cf), resoudre(_Ci,_Cf,_Deplacements). ///////////////////////////////////// deep tree //////////////// resoudre(_Ci,_Cf,_Deplacements):- resoudre(_Ci,_Cf,[_Ci],_Deplacements). resoudre(_Config,_Config,_,[]). resoudre(_Config1,_Config2,_Deja_generees,[_Deplacement | _Deplacements]):- trouver_deplacement_legal(_Deplacement,_Config1), generer(_Deplacement,_Config1,_Config), not(membre_de(_Config,_Deja_generees)), resoudre(_Config,_Config2,[_Config|_Deja_generees],_Deplacements), !. /////////////////////////////////////// calls ///////////////// trouver_deplacement_legal([_Origine,_Destination],_Configuration):- num(_Origine), num(_Destination), not(eq(_Origine,_Destination)), not(contraintes([_Origine,_Destination],_Configuration)). //////////////////////////// generer([_Origine,_Destination],_Config1,_Config2):- oter_premier(_Config1,_Origine,_Premier,_Config3), ajouter_premier(_Config3,_Destination,_Premier,_Config2). ////////////////////////////// contraintes([_Origine,_Destination],_Configuration):- contenu(_Configuration,_Origine,[]). contraintes([_Origine,_Destination],_Configuration):- contenu(_Configuration,_Origine,[x|_]), contenu(_Configuration,_Destination,[y|_]), sup(x,y). ////////////////////////////// oter_premier(_Config,N,_Premier,_Config1):- contenu(_Config,N,[_Premier|_Suite]), remplacer(_Config,N,_Suite,_Config1). ajouter_premier(_Config,N,_Premier,_Config1):- contenu(_Config,N,_Liste), conc([_Premier],_Liste,_Liste1), remplacer(_Config,N,_Liste1,_Config1). remplacer([_,_T2,_T3],1,_S,_T):- conc([_S],[_T2,_T3],_T). remplacer([_T1,_,_T3],2,_S,_T):- conc([_T1],[_S],_T2),conc(_T2,[_T3],_T). remplacer([_T1,_T2,_],3,_S,_T):- conc([_T1,_T2],[_S],_T). //////////////////////////////////// contenu([_T,_,_],1,_T). contenu([_,_T,_],2,_T). contenu([_,_,_T],3,_T). //////////////////////////////////// states StartState([[1,2,3,4],[],[]]). EndState([[],[],[1,2,3,4]]). ////////////////////////////////////// tools sup(_x, _y) :- true is _x > _y. membre_de( _x, [_x|_] ). membre_de( _x, [ _ | _L ] ) :- membre_de( _x, _L ). conc([],_L,_L). conc([_X|_L1],_L2,[_X|_L3]):-conc(_L1,_L2,_L3). num(1). num(2). num(3). eq(X,X). not(X) :- X, !, fail. not(X).