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