
/* 	Procedure backtrack2 (Nilsson 82)
	Representation des regles:
	regle(signature,postconditions):-preconditions
	ou postcondition represente le nouvel etat
*/	   
/* Algorithme */

bk(T):-
	etat_initial(E),
	solve([E],T).
solve([Ec|_],[]):-
	etat_succes(Ec).

solve(E,_):-
	profondeur_max(M),
	length(E,L),
	L > M, !, fail.

solve([Ec|E],[R|Chemin]):-
        profondeur_max(M), length(E,L), L =< M,!,
	once(applicables(Ec,Liste_regles)),
	apply(Liste_regles,R,Ec,REc),
	\+ member(REc,E),
	solve([REc,Ec|E],Chemin).

apply([[R,REc]|L],R,Ec,REc).
apply([_|Liste],R,Ec,REc):-
	apply(Liste,R,Ec,REc).

applicables(E,L):-	/* Sous traite a Prolog la verif des Precconditions */
	asserta(etat(E)),
	once(exec([],L)),
	retract(etat(E)).
exec(Liste,L):-
	call(regle(R,REc)),
	once(\+ member([R,REc],Liste)),
	exec([[R,REc]|Liste],L).
exec(L,L).

/* utilitaires */


enum(X,_,X).
enum(X,Y,Z):- Z > Y,Z1 is Z-1, enum(X,Y,Z1).


