let norm_Exp purifie (sub : t_subst) (t : term) (lst : (term * sign) list) : term * t_subst =
let rec norm_Exp ts = function
| (t,si)::fin ->
(let (l,s) = norm_Exp ts fin in
match purifie s t with
| (Var n as t, ss) ->
(match valeur n ss with
| Xor(_) | Atm(0) -> (insere_exp ss l t si, ss)
| tt -> (insere_exp ss l tt si, ss) )
| (Xor(_) as t, ss)
| (Atm 0 as t, ss) ->
let (nv,ns) = add_newvalue ss t
in (insere_exp ns l nv si, ns)
| (tt, ss) -> (insere_exp ss l tt si, ss) )
| _ -> ts in
let (lst,sub) = norm_Exp ([],sub) lst in
( match purifie sub t with
| (Var n as t), sub -> ( match valeur n sub with
| Exp(t,lst2) ->
let l,sub = norm_Exp (lst,sub) lst2
in Exp(t,l), sub
| Atm 0 | Xor _ -> Exp(t, lst), sub
| t -> Exp(t, lst), sub )
| Exp(t,lst2), sub -> let l,sub = norm_Exp (lst,sub) lst2 in Exp(t,l), sub
| (Xor(_) as t), sub
| (Atm(0) as t), sub -> let (nv,sub) = add_newvalue sub t in Exp(nv, lst), sub
| t, sub -> Exp(t, lst), sub )