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))
| 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