let rec egal (s : t_subst) (v1 : term) (v2 : term) : bool =
match (v1,v2) with
| (Var n1, Var n2) ->
if n1=n2 then
true
else
( match (valeur n1 s, valeur n2 s) with
| (Var m1, Var m2) -> m1=m2
| (Var(_),_) | (_,Var(_)) -> false
| (t1,t2) -> egal s t1 t2 )
| (Var n, t) | (t, Var n) ->
(match valeur n s with
| Var(_) -> false
| tt -> egal s t tt)
| (Uplet(l1), Uplet(l2))
| (Xor(l1), Xor(l2)) ->
(try List.for_all2 (egal s) l1 l2 with
_ -> false)
| (PCrypt(m1,k1),PCrypt(m2,k2))
| (SCrypt(m1,k1),SCrypt(m2,k2)) -> (egal s m1 m2) && (egal s k1 k2)
| (Atm n1, Atm n2) -> (n1=n2)
| (PInv v1, PInv v2) -> egal s v1 v2
| (Exp(t1,l1),Exp(t2,l2)) ->
( try
(egal s t1 t2) &&
(List.for_all2 (fun (a,u) (b,v) -> (u=v) && (egal s a b)) l1 l2)
with
| _ -> false )
| _ -> false