(* ========================================================================== *) (* FLYSPECK - BOOK FORMALIZATION *) (* *) (* Chapter: general *) (* Author: Thomas C. Hales *) (* Date: 2010-02-13 *) (* ========================================================================== *) module State_manager:sig val neutralize_state:unit->unit end = struct (* not neutralized: set_jrh_lexer;; installed printers... binders, infixes, and prefixes add on July 18, 2010. *) (* Bring conversions back to the following state of hol_version 2.20+ 100110: basic_convs();; val it : (string * (term * conv)) list = [("FUN_ONEPATTERN_CONV", (`_FUNCTION (\y z. P y z) x`, )); ("MATCH_ONEPATTERN_CONV", (`_MATCH x (\y z. P y z)`, )); ("FUN_SEQPATTERN_CONV", (`_FUNCTION (_SEQPATTERN r s) x`, )); ("MATCH_SEQPATTERN_CONV", (`_MATCH x (_SEQPATTERN r s)`, )); ("GEN_BETA_CONV", (`GABS (\a. b) c`, ))] We cannot restore the list above if someone changes it before this file is read. The following checking can easily be defeated. An honor system is in place. *) let neutralize_basic_convs = let bc = basic_convs() in let msg = "conversions beyond hol_version 2.20+ 100110. Cannot neutralize state" in let original=["FUN_ONEPATTERN_CONV"; "MATCH_ONEPATTERN_CONV"; "FUN_SEQPATTERN_CONV"; "MATCH_SEQPATTERN_CONV"; "GEN_BETA_CONV"] in let _ = if not(List.length(bc)=5) then failwith ("Added "^msg) in let _ = if not(map fst bc=original) then failwith ("Changed "^msg) in fun () -> set_basic_convs(bc);; (* 34 basic rewrites val rewrites : thm list = [|- FST (x,y) = x; |- SND (x,y) = y; |- FST x,SND x = x; |- (if x = x then y else z) = y; |- (if T then t1 else t2) = t1; |- (if F then t1 else t2) = t2; |- ~ ~t <=> t; |- (@y. y = x) = x; |- x = x <=> T; |- (T <=> t) <=> t; |- (t <=> T) <=> t; |- (F <=> t) <=> ~t; |- (t <=> F) <=> ~t; |- ~T <=> F; |- ~F <=> T; |- T /\ t <=> t; |- t /\ T <=> t; |- F /\ t <=> F; |- t /\ F <=> F; |- t /\ t <=> t; |- T \/ t <=> T; |- t \/ T <=> T; |- F \/ t <=> t; |- t \/ F <=> t; |- t \/ t <=> t; |- T ==> t <=> t; |- t ==> T <=> T; |- F ==> t <=> T; |- t ==> t <=> T; |- t ==> F <=> ~t; |- (!x. t) <=> t; |- (?x. t) <=> t; |- (\x. f x) y = f y; |- x = x ==> p <=> p] Again, we do not really check that this list is the one above. *) let neutralize_basic_rewrites= let bw = basic_rewrites() in let msg = "Added rewrites beyond hol_version 2.20+ 100110. Cannot neutralize" in let _ = if not(List.length(bw)=34) then failwith msg in fun () -> set_basic_rewrites(bw);; (* 16 Basic congruences [|- (!x. ~(x = a) ==> f x = g x) ==> (((\x. f x) --> l) (at a within s) <=> (g --> l) (at a within s)); |- (!x. ~(x = a) ==> f x = g x) ==> (((\x. f x) --> l) (at a) <=> (g --> l) (at a)); |- (!x. x IN s ==> f x = g x) ==> product s (\i. f i) = product s g; |- (!i. a <= i /\ i <= b ==> f i = g i) ==> product (a..b) (\i. f i) = product (a..b) g; |- (!x. p x ==> f x = g x) ==> product {y | p y} (\i. f i) = product {y | p y} g; |- (!x. x IN s ==> f x = g x) ==> vsum s (\i. f i) = vsum s g; |- (!i. a <= i /\ i <= b ==> f i = g i) ==> vsum (a..b) (\i. f i) = vsum (a..b) g; |- (!x. p x ==> f x = g x) ==> vsum {y | p y} (\i. f i) = vsum {y | p y} g; |- (!x. x IN s ==> f x = g x) ==> sum s (\i. f i) = sum s g; |- (!i. a <= i /\ i <= b ==> f i = g i) ==> sum (a..b) (\i. f i) = sum (a..b) g; |- (!x. p x ==> f x = g x) ==> sum {y | p y} (\i. f i) = sum {y | p y} g; |- (!x. x IN s ==> f x = g x) ==> nsum s (\i. f i) = nsum s g; |- (!i. a <= i /\ i <= b ==> f i = g i) ==> nsum (a..b) (\i. f i) = nsum (a..b) g; |- (!x. p x ==> f x = g x) ==> nsum {y | p y} (\i. f i) = nsum {y | p y} g; |- (g <=> g') ==> (g' ==> t = t') ==> (~g' ==> e = e') ==> (if g then t else e) = (if g' then t' else e'); |- (p <=> p') ==> (p' ==> (q <=> q')) ==> (p ==> q <=> p' ==> q')] *) let neutralize_basic_congs= let bc = basic_congs() in let msg = "Added "^string_of_int(List.length bc)^ " congruences. Cannot neutralize. " in let _ = if not(List.length(bc)=16) then (let _ = map print_thm bc in failwith msg) in fun () -> set_basic_congs(bc);; let default_overload_skeletons = (* unchanged since July 31 2009 *) [("real_interval", `:A`); ("segment", `:A`); ("interval", `:A`); ("**", `:A->B->C`); ("norm", `:A->real`); ("gcd", `:A#A->A`); ("coprime", `:A#A->bool`); ("mod", `:A->A->A->bool`); ("divides", `:A->A->bool`); ("&", `:num->A`); ("min", `:A->A->A`); ("max", `:A->A->A`); ("abs", `:A->A`); ("inv", `:A->A`); ("pow", `:A->num->A`); ("--", `:A->A`); (">=", `:A->A->bool`); (">", `:A->A->bool`); ("<=", `:A->A->bool`); ("<", `:A->A->bool`); ("/", `:A->A->A`); ("*", `:A->A->A`); ("-", `:A->A->A`); ("+", `:A->A->A`)];; let neutralize_overload_skeletons()= the_overload_skeletons:= default_overload_skeletons;; let the_default_interface = (* set on Feb 12 2010 *) [("+", ("real_add", `:real->real->real`)); ("-", ("real_sub", `:real->real->real`)); ("*", ("real_mul", `:real->real->real`)); ("/", ("real_div", `:real->real->real`)); ("<", ("real_lt", `:real->real->bool`)); ("<=", ("real_le", `:real->real->bool`)); (">", ("real_gt", `:real->real->bool`)); (">=", ("real_ge", `:real->real->bool`)); ("--", ("real_neg", `:real->real`)); ("pow", ("real_pow", `:real->num->real`)); ("inv", ("real_inv", `:real->real`)); ("abs", ("real_abs", `:real->real`)); ("max", ("real_max", `:real->real->real`)); ("min", ("real_min", `:real->real->real`)); ("&", ("real_of_num", `:num->real`)); ("mod", ("real_mod", `:real->real->real->bool`)); ("+", ("vector_add", `:real^N->real^N->real^N`)); ("-", ("vector_sub", `:real^N->real^N->real^N`)); ("--", ("vector_neg", `:real^N->real^N`)); ("norm", ("vector_norm", `:real^N->real`)); ("**", ("vector_matrix_mul", `:real^M->real^N^M->real^N`)); ("+", ("+", `:num->num->num`)); ("-", ("-", `:num->num->num`)); ("*", ("*", `:num->num->num`)); ("<", ("<", `:num->num->bool`)); ("<=", ("<=", `:num->num->bool`)); (">", (">", `:num->num->bool`)); (">=", (">=", `:num->num->bool`)); ("divides", ("num_divides", `:num->num->bool`)); ("mod", ("num_mod", `:num->num->num->bool`)); ("coprime", ("num_coprime", `:num#num->bool`)); ("gcd", ("num_gcd", `:num#num->num`)); ("+", ("int_add", `:int->int->int`)); ("-", ("int_sub", `:int->int->int`)); ("*", ("int_mul", `:int->int->int`)); ("<", ("int_lt", `:int->int->bool`)); ("<=", ("int_le", `:int->int->bool`)); (">", ("int_gt", `:int->int->bool`)); (">=", ("int_ge", `:int->int->bool`)); ("--", ("int_neg", `:int->int`)); ("pow", ("int_pow", `:int->num->int`)); ("abs", ("int_abs", `:int->int`)); ("max", ("int_max", `:int->int->int`)); ("min", ("int_min", `:int->int->int`)); ("&", ("int_of_num", `:num->int`)); ("divides", ("int_divides", `:int->int->bool`)); ("mod", ("int_mod", `:int->int->int->bool`)); ("coprime", ("int_coprime", `:int#int->bool`)); ("gcd", ("int_gcd", `:int#int->int`)); ("inv", ("complex_inv", `:real^2->real^2`)); ("pow", ("complex_pow", `:real^2->num->real^2`)); ("/", ("complex_div", `:real^2->real^2->real^2`)); ("*", ("complex_mul", `:real^2->real^2->real^2`)); ("-", ("vector_sub", `:real^2->real^2->real^2`)); ("+", ("vector_add", `:real^2->real^2->real^2`)); ("--", ("vector_neg", `:real^2->real^2`)); ("vol", ("measure", `:(real^3->bool)->real`)); ("NULLSET", ("negligible", `:(real^3->bool)->bool`)); ("real_interval", ("closed_real_interval", `:(real#real)list->real->bool`)); ("real_interval", ("open_real_interval", `:real#real->real->bool`)); ("segment", ("closed_segment", `:(real^A#real^A)list->real^A->bool`)); ("segment", ("open_segment", `:real^A#real^A->real^A->bool`)); ("interval", ("closed_interval", `:(real^A#real^A)list->real^A->bool`)); ("interval", ("open_interval", `:real^A#real^A->real^A->bool`)); ("**", ("matrix_vector_mul", `:real^N^M->real^N->real^M`)); ("**", ("matrix_mul", `:real^N^M->real^P^N->real^P^M`)); ("-", ("matrix_sub", `:real^N^M->real^N^M->real^N^M`)); ("+", ("matrix_add", `:real^N^M->real^N^M->real^N^M`)); ("--", ("matrix_neg", `:real^N^M->real^N^M`)); ("dist", ("distance", `:real^N#real^N->real`)); ("&", ("hreal_of_num", `:num->hreal`)); ("<=>", ("=", `:bool->bool->bool`))];; let neutralize_interface()= the_interface:= the_default_interface;; let set_parsel f g h xl = (let _ = map f (h()) in let _ = map g xl in ());; let neutralize_binders() = let bind = ["\\"; "!"; "?"; "?!"; "@"; "minimal"; "lambda"] in set_parsel unparse_as_binder parse_as_binder binders bind;; let neutralize_prefixes() = let pre = ["~"; "--"; "mod"] in set_parsel unparse_as_prefix parse_as_prefix prefixes pre;; let neutralize_infixes() = let inf = [("<=>", (2, "right")); ("==>", (4, "right")); ("\\/", (6, "right")); ("/\\", (8, "right")); ("==", (10, "right")); ("===", (10, "right")); ("treal_eq", (10, "right")); ("IN", (11, "right")); ("--->", (12, "right")); ("-->", (12, "right")); ("<", (12, "right")); ("<<", (12, "right")); ("<<<", (12, "right")); ("<<=", (12, "right")); ("<=", (12, "right")); ("<=_c", (12, "right")); ("<_c", (12, "right")); ("=", (12, "right")); ("=_c", (12, "right")); (">", (12, "right")); (">=", (12, "right")); (">=_c", (12, "right")); (">_c", (12, "right")); ("HAS_SIZE", (12, "right")); ("PSUBSET", (12, "right")); ("SUBSET", (12, "right")); ("absolutely_integrable_on", (12, "right")); ("absolutely_real_integrable_on", (12, "right")); ("analytic_on", (12, "right")); ("complex_differentiable", (12, "right")); ("continuous", (12, "right")); ("continuous_on", (12, "right")); ("convex_on", (12, "right")); ("differentiable", (12, "right")); ("differentiable_on", (12, "right")); ("divides", (12, "right")); ("division_of", (12, "right")); ("edge_of", (12, "right")); ("exposed_face_of", (12, "right")); ("extreme_point_of", (12, "right")); ("face_of", (12, "right")); ("facet_of", (12, "right")); ("fine", (12, "right")); ("has_complex_derivative", (12, "right")); ("has_derivative", (12, "right")); ("has_integral", (12, "right")); ("has_integral_compact_interval", (12, "right")); ("has_measure", (12, "right")); ("has_real_derivative", (12, "right")); ("has_real_integral", (12, "right")); ("has_real_measure", (12, "right")); ("has_vector_derivative", (12, "right")); ("holomorphic_on", (12, "right")); ("homeomorphic", (12, "right")); ("inseg", (12, "right")); ("integrable_on", (12, "right")); ("limit_point_of", (12, "right")); ("permutes", (12, "right")); ("real_continuous", (12, "right")); ("real_continuous_on", (12, "right")); ("real_convex_on", (12, "right")); ("real_differentiable", (12, "right")); ("real_differentiable_on", (12, "right")); ("real_integrable_on", (12, "right")); ("real_sums", (12, "right")); ("real_uniformly_continuous_on", (12, "right")); ("retract_of", (12, "right")); ("simplex", (12, "right")); ("sums", (12, "right")); ("tagged_division_of", (12, "right")); ("tagged_partial_division_of", (12, "right")); ("treal_le", (12, "right")); ("uniformly_continuous_on", (12, "right")); (",", (14, "right")); ("in_direction", (14, "right")); ("within", (14, "right")); ("..", (15, "right")); ("+", (16, "right")); ("++", (16, "right")); ("+_c", (16, "right")); ("UNION", (16, "right")); ("treal_add", (16, "right")); ("-", (18, "left")); ("DIFF", (18, "left")); ("*", (20, "right")); ("**", (20, "right")); ("*_c", (20, "right")); ("INTER", (20, "right")); ("cross", (20, "right")); ("dot", (20, "right")); ("treal_mul", (20, "right")); ("%", (21, "right")); ("INSERT", (21, "right")); ("DELETE", (21, "left")); ("hull", (21, "left")); ("CROSS", (22, "right")); ("/", (22, "left")); ("DIV", (22, "left")); ("MOD", (22, "left")); ("div", (22, "left")); ("rem", (22, "left")); ("POWER",(24,"right")); ("EXP", (24, "left")); ("cpow", (24, "left")); ("pow", (24, "left")); ("$", (25, "left")); ("o", (26, "right"))] in set_parsel (fun (a,_) -> unparse_as_infix a) parse_as_infix infixes inf ;; (* What we cannot neutralize we destroy *) let neutralize_axioms() = if not(List.length(axioms()) =3) then failwith ("Further axioms are not allowed");; let neutralize_state()= ( current_goalstack := ([]:goalstack); neutralize_overload_skeletons(); neutralize_interface(); neutralize_basic_congs(); neutralize_basic_convs(); neutralize_basic_rewrites(); neutralize_binders(); neutralize_prefixes(); neutralize_infixes(); neutralize_axioms(); );; end;;