let clear_goalstack() =
current_goalstack := [];;
let top_goalstate() =
if !current_goalstack = [] then
(null_meta, [], fun _ [th] -> th)
else
hd (!current_goalstack);;
let raw_print_string str =
print_string ("$begin$" ^ str ^ "$end$");;
let raw_string_of_int i = string_of_num i;;
let raw_string_of_bool b = if b then "true" else "false";;
let raw_string_of_string str = "\"" ^ str ^ "\"";;
let rec raw_string_of_type =
function
(Tyapp(name, args)) -> "Tyapp(\"" ^ name ^ "\"[" ^ String.concat "," (map raw_string_of_type args) ^ "])"
| (Tyvar v) -> "Tyvar(\"" ^ v ^ "\")";;
let rec raw_string_of_term =
function
Var(name,ty) -> "Var(\"" ^ name ^ "\"," ^ raw_string_of_type ty ^ ")"
| Const(name,ty) -> "Const(\"" ^ name ^ "\"," ^ raw_string_of_type ty ^ ")"
| Comb(f,a) -> "Comb(" ^ raw_string_of_term f ^ "," ^ raw_string_of_term a ^ ")"
| Abs(v,b) -> "Abs(" ^ raw_string_of_term v ^ "," ^ raw_string_of_term b ^ ")";;
let raw_string_of_list el_type el_f list =
let str = String.concat ";" (map el_f list) in
"List(" ^ el_type ^ ",[" ^ str ^ "])";;
let raw_string_of_thm th =
let c = raw_string_of_term (concl th) in
let h = raw_string_of_list "Term" raw_string_of_term (hyp th) in
"Theorem(" ^ h ^ "," ^ c ^ ")";;
let raw_string_of_pair f_fst f_snd p =
"Pair(" ^ f_fst (fst p) ^ "," ^ f_snd (snd p) ^ ")";;
let raw_string_of_goal (g:goal) =
let assumptions = raw_string_of_list "Pair(String,Theorem)" (raw_string_of_pair raw_string_of_string raw_string_of_thm) (fst g) in
let c = raw_string_of_term (snd g) in
"Goal(" ^ assumptions ^ "," ^ c ^ ")";;
let raw_string_of_goalstate (g:goalstate) =
let s (_,b,_) = b in
let goals = raw_string_of_list "Goal" raw_string_of_goal (s g) in
"Goalstate("^goals^")";;