let get_real_fresh_terms lhs rhs =

  let get_new_ones =
    List.fold_left
      (fun lt' t' ->
        if List.mem t' lt' then
          lt'
        else t'::lt')
  in

  let non_real_fresh_terms =
    List.fold_left
      (fun lt ->
        (function
            In(t,_) ->
              get_new_ones lt (get_fresh_terms [Iknows(t)])
          | Equal(_,t) ->
              get_new_ones lt (get_fresh_terms [Iknows(t)])
          | Event(_,lt2) ->
              List.fold_left
                (fun lt t ->
                  get_new_ones lt (get_fresh_terms [Iknows(t)]))
                lt
                lt2
          | _ -> lt))
      (List.fold_left
         (fun lt ->
           (function
               Equal(t,_) ->
                 get_new_ones lt (get_fresh_terms [Iknows(t)])
             | _ -> lt))
         [] rhs)
      lhs
  in

  let rec get_fresh_terms_from_msg = function
      Pair(t1,t2)
    | Scrypt(t1,t2)
    | Crypt(t1,t2)
    | Cons(t1,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 ->
        if List.mem t non_real_fresh_terms then []
        else [t]
    | Hash(_) ->
        prerr_endline "Semantic_check.check_var: Impossible error: invalid hash type/term"
        raise Not_found
  in

  List.fold_left
    (fun lt ->
      (function
          New(xid) ->
            get_new_ones lt [Var(xid)]
        | In(t,_)
        | Equal(_,t) ->
            get_new_ones lt (get_fresh_terms_from_msg t)
        | Event(_,lt2) ->
            List.fold_left
              (fun lt t ->
                get_new_ones lt (get_fresh_terms_from_msg t))
              lt
              lt2
        | _ -> lt))
    [] rhs