let rec clot_norm (s : t_subst) (t : term) : term = 
  match t with
    | Atm(_) as t -> t
    | Var(n)      -> 
        ( let t = valeur n s in 
            match t with 
              | Var(_) -> t 
              | _ -> clot_norm s t 
        )
    | PCrypt(m,k) -> PCrypt (clot_norm s m, clot_norm s k)
    | SCrypt(m,k) -> SCrypt (clot_norm s m, clot_norm s k)
    | Uplet(l)        -> 
        Uplet (rev_flat_map 
                 ( function 
                     | Uplet(l) -> (List.rev l) 
                     | t -> [t]
                 ) 
                 [] 
                 (List.rev_map (clot_norm s) l))
    | PInv(t) -> inverse (clot_norm s t)
    | Xor(l)  -> 
        let rec f = function
          | t::l -> 
              let l = f l and t = clot_norm s t in 
                if List.mem t l then 
                  l 
                else 
                  (t::l)
          | _    -> []
        in Xor(f l)
    | Exp(t,l) ->
        let l = List.rev_map (fun (t,si) -> (clot_norm s t, si)) l
        in match clot_norm s t with
           | Exp(t,ll) -> Exp(t, merge_exp ll l)
           | t -> Exp(t, List.rev l)