let rec liste_var (tas : int list) : term list -> int list = function
  | Atm(_)::fin                          -> liste_var tas fin
  | Var(n)::fin                          -> 
      if List.mem n tas then 
        liste_var tas fin 
      else 
        liste_var (n::tas) fin
  | Uplet(l)::fin 
  | Xor(l)::fin                   -> liste_var (liste_var tas l) fin
  | PCrypt(m,k)::fin 
  | SCrypt(m,k)::fin              -> liste_var tas (m::k::fin)
  | PInv(t)::fin                  -> liste_var tas (t::fin)
  | Exp(t,l)::fin                 -> liste_var tas (merge_first (t::fin) l)
  | []                            -> tas