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
(*    | Lst(l)*)
    | 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