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)