(* subst applies all possible substition from an environment to a term*)
letrecsubstittrmsub=
letrecsubstittrmsub=
matchtrmwith
matchtrmwith
@ -83,20 +84,20 @@ let rec substit trm sub =
Unification
Unification
========================================*)
========================================*)
(*Résout une liste d'équations*)
(*Solves an equation list by returning solution list*)
letrecsolveeqsub=
letrecsolveeqsub=
matcheqwith
matcheqwith
|[]->Somesub
|[]->Somesub
|(Var(x),term)::t->ifVar(x)=termthenSome(solvetsub)elseSome(elimxtermtsub)(*Si x = x c'est une équation inutile, on passe donc à la suite*)
|(Var(x),term)::t->ifVar(x)=termthen(solvetsub)else(elimxtermtsub)(*If x = x it's a useless equation*)
|(term,Var(x))::t->Some(elimxtermtsub)(*Inutile de vérifier si term = Var(x)ici car c'est déjà vérifié à la ligne ci-dessus*)
|(term,Var(x))::t->(elimxtermtsub)(*It's useless to check if term = Var(x)because it would be the same case as above *)
|(Func(f,fs),Func(g,gs))::t->iff=gthenSome(solve((List.combinefsgs)@t)sub)elseNone(*si f et g ne sont pas égaux, on ne peut pas résoudre l'équation*)
|(Func(f,fs),Func(g,gs))::t->iff=gthen(solve((List.combinefsgs)@t)sub)elseNone(* If f and g are not equal, the equation can't be solved *)
andelimidtermeqsub=
andelimidtermeqsub=
ifeq=[]thenSomesub
ifeq=[]thenSomesub
elseifoccursidtermthenNone(*l'équation n'est pas soluble, car on aurait quelque chose de la forme x = f(x)*)
elseifoccursidtermthenNone(*If that's the cas, we would have something like x = f(x) which can't be solved*)
elseletsigma_xy=[(id,term)]in
elseletsigma_xy=[(id,term)]in
Some(solve(List.map(fun(a,b)->(substitasigma_xy,substitbsigma_xy))eq)(sigma_xy@sub))(*On substitue toutes les occurences d'id dans le système d'équation et on ajoute cette solution au système*)
(solve(List.map(fun(a,b)->(substitasigma_xy,substitbsigma_xy))eq)(sigma_xy@sub))(*We apply the sigma_xy substitution and we add it to the solution list*)