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) -> (* (match t with Var n -> (match valeur n sub with Exp(_,_) -> raise (Failure ") | _ -> ()) | _ -> ()) ; *) 
                                                 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   )