let check_var handle_error =
let rec check_var_rec = function
Base(Var(n))
| Prime(Var(n)) ->
handle_error
(fun n ->
try ignore (Globals.type_table#get_type n)
with Not_found ->
raise (Undefined_var (Globals.string_id#get_name n)))
n
| Base(Const(n)) ->
handle_error
(fun n ->
try ignore (Globals.type_table#get_type n)
with Not_found ->
raise (Undefined_const (Globals.string_id#get_name n)))
n
| Prime(_) -> ()
| Pair(t1,t2)
| Scrypt(t1,t2)
| Crypt(t1,t2)
| Cons(t1,t2)
| Delete(t1,t2) -> check_var_rec t1; check_var_rec t2
| Function(t1,t2) -> check_var_rec t1; List.iter check_var_rec t2
| Inv(t) -> check_var_rec t
| Set(l) -> List.iter check_var_rec l
| Hash(_) ->
prerr_endline "Semantic_check.check_var: Impossible error: invalid hash type/term";
raise Not_found
in
check_var_rec