% estProg(Terme)
estProg(progMIL(LV, LInst)) :-
estListV(LV), estSeqInst(LV, LInst).

estListV([]).
estListV([V|SV]) :- atom(V), estListV(SV).

estSeqInst(_, []).
% estSeqInst(LV, [Inst | SInst]) :- estInst(LV, Inst), estSeqInst(LV,SInst).
estSeqInst(LV, [ligne | SInst]) :- estSeqInst(LV, SInst).
estSeqInst(LV, [espace | SInst]) :- estSeqInst(LV, SInst).
estSeqInst(LV, [lire Var | SInst]) :- member(Var, LV), estSeqInst(LV, SInst).
estSeqInst(LV, [ecrire ExpAr | SInst]) :- estExpAr(LV, ExpAr), 
	estSeqInst(LV, SInst).
estSeqInst(LV, [Var := ExpAr | SInst]) :- member(Var, LV), estExpAr(LV, ExpAr), 
	estSeqInst(LV, SInst).
estSeqInst(LV, [si(Test, AV, AF) | SInst]) :- estExpBool(LV, Test), 
	estSeqInst(LV, AV), estSeqInst(LV, AF), estSeqInst(LV, SInst).
estSeqInst(LV, [tantque(Test, Corps) | SInst]) :- estExpBool(LV, Test), 
	estSeqInst(LV, Corps), estSeqInst(LV, SInst).
	
% estExpAr(LV, ExpAr)
estExpAr(_, N) :- number(N).
estExpAr(LV, Var) :- member(Var, LV).
/*
estExpAr(LV, G+D) :- estExpAr(LV, G), estExpAr(LV, D).
estExpAr(LV, G*D) :- estExpAr(LV, G), estExpAr(LV, D).
estExpAr(LV, G-D) :- estExpAr(LV, G), estExpAr(LV, D).
estExpAr(LV, G/D) :- estExpAr(LV, G), estExpAr(LV, D).
*/
estExpAr(LV, Exp) :- Exp =.. [Op, G, D], member(Op, ['+', '*', '-', '/']),
	estExpAr(LV, G), estExpAr(LV, D).
	
	
% estExpBool(LV, Test)
/*
estExpBool(LV, G=D) :- estExpAr(LV, G), estExpAr(LV, D).
estExpBool(LV, G<D) :- estExpAr(LV, G), estExpAr(LV, D).
estExpBool(LV, G>D) :- estExpAr(LV, G), estExpAr(LV, D).
estExpBool(LV, G<=D) :- estExpAr(LV, G), estExpAr(LV, D).
estExpBool(LV, G>=D) :- estExpAr(LV, G), estExpAr(LV, D).
estExpBool(LV, G<>D) :- estExpAr(LV, G), estExpAr(LV, D).
*/
estExpBool(LV, Exp) :- Exp =.. [Op, G, D], member(Op, ['=', '<', '>', '<=', '>=', '<>']),
	estExpAr(LV, G), estExpAr(LV, D).




/* le choix fait en cours de "atomic" au lieu de "atom" était erroné
?- estListV([element('Var',[name=a],[]),element('Var',[name=b],[]),element('Var',[name=t],[]),element('Var',[name=q],[]),element('Var',[name=r],[]),element('Var',[name=d],[])]).
true.

?- estListV([element('Var',[name=a],[]),element('Var',[name=b],[]),element('Var',[name=t],[]),element('Var',[name=q],[]),element('Var',[name=r],[]),element('Var',[name=2],[])]).
false 
*/
% à suivre...
