(*
Print the types of the atoms of terms, thms and the goal.
*)
module Print_types
: sig
val goal_types: unit -> unit
val print_thm_types: thm -> unit
val print_term_types: term -> unit
(* I've elided the common symbols from the list
to avoid clutter. You can add and remove names
of constants from this list with (un)suppress *)
val suppress: string -> unit
val unsuppress: string -> unit
end =
struct
let suppressed = ref
["==>";"?";"!";"/\\";"\\/";",";"~";"APPEND";"CONS";"HD";"LAST";
"NIL";"=";"real_lt";"real_gt";"real_le";"real_ge";"BIT0";"BIT1";"NUMERAL";
"real_of_num";"_0";"_1";"real_div";"real_mul";"real_pow";"COND"]
let suppress s = suppressed := s :: !suppressed
let unsuppress s = suppressed := List.filter ((!=) s) (!suppressed)
let rec get_type_list tm =
match tm with
Var(s,t) -> if mem s !suppressed then [] else [(s,t)]
| Const(s,t) -> if mem s !suppressed then [] else [(s,t)]
| Comb (t1,t2) -> get_type_list t1 @ get_type_list t2
| Abs (t1,t2) -> get_type_list t1 @ get_type_list t2
let print_atom_type : string * hol_type -> unit =
fun (s,t) ->
begin
print_string ("(\"" ^ s ^ "\", ");
print_type t;
print_string ")\n"
end
let setify_types tm = ((sort (<)) o setify o get_type_list) tm
let print_term_types = List.iter print_atom_type o setify_types
let print_thm_types tm = print_term_types (concl tm)
let goal_types() =
let (asms,g) = top_goal() in
let tms = g::asms in
let tm = end_itlist (curry mk_conj) tms in
(print_term_types tm)
end;;
open Print_types;;