let get_fresh_terms msg_term =
  let rec get_fresh_terms_from_msg = function
      Pair(t1,t2)
    | Scrypt(t1,t2)
    | Crypt(t1,t2)
    | Cons(t1,t2) ->
         (get_fresh_terms_from_msg t1)@(get_fresh_terms_from_msg t2)
    | Delete(t1,t2) ->
         (get_fresh_terms_from_msg t1)@(get_fresh_terms_from_msg t2)
    | Inv(t) ->
         get_fresh_terms_from_msg t
    | Function(t1,l) ->
         (get_fresh_terms_from_msg t1)
        @(List.flatten (List.map get_fresh_terms_from_msg l))
(*    | Lst(l)*)
    | Set(l) ->
         List.flatten (List.map get_fresh_terms_from_msg l)
    | Base(_) -> []
    | Prime(t) -> [t]
    | Hash(_) ->
        prerr_endline "Semantic_check.check_var: Impossible error: invalid hash type/term"
        raise Not_found
  in
  List.flatten
    (List.map
       (function
           Iknows(t) -> get_fresh_terms_from_msg t
         | Unknown(_,lt) ->
             List.fold_left
               (fun l t -> l@(get_fresh_terms_from_msg t))
               [] lt
         | _ -> [])
       msg_term)