(* ========================================================================== *)
(* FLYSPECK - BOOK FORMALIZATION *)
(* *)
(* Chapter: hypermap *)
(* Author: Thomas Hales *)
(* Date: 2011-04-29 *)
(* ========================================================================== *)
(* The tame archive from the Bauer-Nipkow classification.
The ML files in this directory are identical to those in Isabelle-HOL, Flyspeck-I. *)
(* WARNING!!!!
HOL Light printer does not use ellipses in list printing.
Extremely slow processing and printing. Had to kill process .
Fix before executing outside module.
*)
(* Usage:
You have to open module for reflection to work.
But then printing of lists makes it impossible to look at tmrefK.
See development/thales/printer.ml for a fix to the term printer that
prints ellipses in long lists.
*)
(*
June 6, 2011:
flyspeck_needs "../tame_archive/tame_archive.hl";;
open Tame_archive;; (* must open because of reflected references *)
time Tame_archive.arc3 ();; (* 0.18 secs *)
List.length !Tame_archive.ref3;; (* 9 *)
!Tame_archive.tmref3;;
time Tame_archive.arc4 ();; (* 22 secs *)
List.length !Tame_archive.ref4;; (* 1105 *)
time Tame_archive.arc5 ();; (* 676.555191 secs *)
List.length !Tame_archive.ref5;; (* 15991 *)
time Tame_archive.arc6 ();; (* 28 secs *)
List.length !Tame_archive.ref6;; (* 1657 *)
*)
module Tame_archive = struct
let flyspeck_dir =
(try Sys.getenv "FLYSPECK_DIR" with Not_found -> Sys.getcwd());;
let archive_dir =
Filename.concat (Filename.concat (flyspeck_dir) Filename.parent_dir_name)
"tame_archive";;
(* from glpk.ml *)
let load_and_close_channel do_close ic =
let rec lf ichan a =
try
lf ic (Pervasives.input_line ic::a)
with End_of_file -> a in
let rs = lf ic [] in
if do_close then Pervasives.close_in ic else ();
rev rs;;
let save_stringarray filename xs =
let oc = open_out filename in
for i=0 to List.length xs -1
do
Pervasives.output_string oc (List.nth xs i ^ "\n");
done;
close_out oc;;
let convert_archive filename ext = (* strip // comments, blank lines, quotation marks etc. *)
let (ic,oc) = Unix.open_process(sprintf "cat %s | sed 's/,/;/g' | sed 's/val [a-zA-Z]*/ref%d/g' | sed 's/]]];/]]];;/g' | sed 's/=/:=/g' | tr 'A-Z' 'a-z' " filename ext) in
let s = load_and_close_channel false ic in
let _ = Unix.close_process (ic,oc) in
s;;
let ocaml_of_ml (output_f,input_f,ext) =
save_stringarray output_f (convert_archive (Filename.concat archive_dir input_f) ext);;
let hol_of_smalllist =
let ty = `:num` in
fun ls ->
let xs = map mk_small_numeral ls in
mk_list (xs,ty);;
let hol_of_list2 =
let ty = `:num list` in
fun ls -> let x = map hol_of_smalllist ls in mk_list (x,ty);;
let hol_of_list3 =
let ty = `:(num list) list` in
fun ls -> let x = map hol_of_list2 ls in mk_list (x,ty);;
let tmp3 = Filename.temp_file "tmp3_" ".hl";;
let tmp4 = Filename.temp_file "tmp4_" ".hl";;
let tmp5 = Filename.temp_file "tmp5_" ".hl";;
let tmp6 = Filename.temp_file "tmp6_" ".hl";;
map ocaml_of_ml [(tmp3,"Tri.ML",3);(tmp4,"Quad.ML",4);
(tmp5,"Pent.ML",5);(tmp6,"Hex.ML",6)];;
(* WARNING!!!!
HOL Light printer does not use ellipses in list printing.
Extremely slow processing and printing. Had to kill process .
Fix before executing outside module.
*)
let ref3 = ref [];;
let ref4 = ref [];;
let ref5 = ref [];;
let ref6 = ref [];;
let tmref3 = ref `0`;;
let tmref4 = ref `0`;;
let tmref5 = ref `0`;;
let tmref6 = ref `0`;;
(* loading these files changes the references! *)
let arc3 _ =
let _ = loadt tmp3 in
let _ = (tmref3 := hol_of_list3 (!ref3)) in ();;
let arc4 _ =
let _ = loadt tmp4 in
let _ = (tmref4 := hol_of_list3 (!ref4)) in ();;
let arc5 _ =
let _ = loadt tmp5 in
let _ = (tmref5 := hol_of_list3 (!ref5)) in ();;
let arc6 _ =
let _ = loadt tmp6 in
let _ = (tmref6 := hol_of_list3 (!ref6)) in ();;
(*
let archive3 = mk_eq (`archive3:((num list)list)list`, hol_of_list3 !ref3);;
let arc4 = mk_eq (`archive4:((num list)list)list`, hol_of_list3 !ref4);;
let arc5 = mk_eq (`archive5:((num list)list)list`, hol_of_list3 !ref5);;
let arc6 = mk_eq (`archive6:((num list)list)list`, hol_of_list3 !ref6);;
let archive3 = new_definition arc3;;
let archive4 = new_definition arc4;;
let archive5 = new_definition arc5;;
let archive6 = new_definition arc6;;
let bn_tame_archive = new_definition `bn_tame_archive =
APPEND arc3 (APPEND arc4 (APPEND arc5 arc6))`;;
*)
end;;