| author | wenzelm | 
| Sat, 13 Mar 2021 12:45:31 +0100 | |
| changeset 73420 | 2c5d58e58fd2 | 
| parent 69597 | ff784d5a5bfb | 
| child 74380 | 79ac28db185c | 
| permissions | -rw-r--r-- | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1 | (* Title: HOL/Tools/Nitpick/nitpick_preproc.ML | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 2 | Author: Jasmin Blanchette, TU Muenchen | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 3 | Copyright 2008, 2009, 2010 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 4 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 5 | Nitpick's HOL preprocessor. | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 6 | *) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 7 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 8 | signature NITPICK_PREPROC = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 9 | sig | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 10 | type hol_context = Nitpick_HOL.hol_context | 
| 38169 
b51784515471
optimize local "def"s by treating them as definitions
 blanchet parents: 
38166diff
changeset | 11 | val preprocess_formulas : | 
| 41052 
3db267a01c1d
remove the "fin_fun" optimization in Nitpick -- it was always a hack and didn't help much
 blanchet parents: 
41001diff
changeset | 12 | hol_context -> term list -> term | 
| 41803 
ef13e3b7cbaf
more work on "fix_datatype_vals" optimization (renamed "preconstruct")
 blanchet parents: 
41793diff
changeset | 13 | -> term list * term list * term list * bool * bool * bool | 
| 35866 
513074557e06
move the Sledgehammer Isar commands together into one file;
 blanchet parents: 
35807diff
changeset | 14 | end; | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 15 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 16 | structure Nitpick_Preproc : NITPICK_PREPROC = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 17 | struct | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 18 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 19 | open Nitpick_Util | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 20 | open Nitpick_HOL | 
| 35665 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35408diff
changeset | 21 | open Nitpick_Mono | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 22 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 23 | fun is_positive_existential polar quant_s = | 
| 69593 | 24 | (polar = Pos andalso quant_s = \<^const_name>\<open>Ex\<close>) orelse | 
| 25 | (polar = Neg andalso quant_s <> \<^const_name>\<open>Ex\<close>) | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 26 | |
| 37271 | 27 | val is_descr = | 
| 69593 | 28 | member (op =) [\<^const_name>\<open>The\<close>, \<^const_name>\<open>Eps\<close>, \<^const_name>\<open>safe_The\<close>] | 
| 37271 | 29 | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 30 | (** Binary coding of integers **) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 31 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 32 | (* If a formula contains a numeral whose absolute value is more than this | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 33 | threshold, the unary coding is likely not to work well and we prefer the | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 34 | binary coding. *) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 35 | val binary_int_threshold = 3 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 36 | |
| 35718 | 37 | val may_use_binary_ints = | 
| 38 | let | |
| 69593 | 39 | fun aux def (Const (\<^const_name>\<open>Pure.eq\<close>, _) $ t1 $ t2) = | 
| 35718 | 40 | aux def t1 andalso aux false t2 | 
| 69597 | 41 | | aux def (\<^const>\<open>Pure.imp\<close> $ t1 $ t2) = aux false t1 andalso aux def t2 | 
| 69593 | 42 | | aux def (Const (\<^const_name>\<open>HOL.eq\<close>, _) $ t1 $ t2) = | 
| 35718 | 43 | aux def t1 andalso aux false t2 | 
| 69597 | 44 | | aux def (\<^const>\<open>HOL.implies\<close> $ t1 $ t2) = aux false t1 andalso aux def t2 | 
| 35718 | 45 | | aux def (t1 $ t2) = aux def t1 andalso aux def t2 | 
| 46 | | aux def (t as Const (s, _)) = | |
| 69597 | 47 | (not def orelse t <> \<^const>\<open>Suc\<close>) andalso | 
| 47909 
5f1afeebafbc
fixed "real" after they were redefined as a 'quotient_type'
 blanchet parents: 
47754diff
changeset | 48 | not (member (op =) | 
| 69593 | 49 | [\<^const_name>\<open>Abs_Frac\<close>, \<^const_name>\<open>Rep_Frac\<close>, | 
| 50 | \<^const_name>\<open>nat_gcd\<close>, \<^const_name>\<open>nat_lcm\<close>, | |
| 51 | \<^const_name>\<open>Frac\<close>, \<^const_name>\<open>norm_frac\<close>] s) | |
| 35718 | 52 | | aux def (Abs (_, _, t')) = aux def t' | 
| 53 | | aux _ _ = true | |
| 54 | in aux end | |
| 55 | val should_use_binary_ints = | |
| 56 | let | |
| 57 | fun aux (t1 $ t2) = aux t1 orelse aux t2 | |
| 58 | | aux (Const (s, T)) = | |
| 69593 | 59 | ((s = \<^const_name>\<open>times\<close> orelse s = \<^const_name>\<open>Rings.divide\<close>) andalso | 
| 35718 | 60 | is_integer_type (body_type T)) orelse | 
| 61 | (String.isPrefix numeral_prefix s andalso | |
| 62 | let val n = the (Int.fromString (unprefix numeral_prefix s)) in | |
| 63 | n < ~ binary_int_threshold orelse n > binary_int_threshold | |
| 64 | end) | |
| 65 | | aux (Abs (_, _, t')) = aux t' | |
| 66 | | aux _ = false | |
| 67 | in aux end | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 68 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 69 | (** Uncurrying **) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 70 | |
| 37256 
0dca1ec52999
thread along context instead of theory for typedef lookup
 blanchet parents: 
37253diff
changeset | 71 | fun add_to_uncurry_table ctxt t = | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 72 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 73 | fun aux (t1 $ t2) args table = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 74 | let val table = aux t2 [] table in aux t1 (t2 :: args) table end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 75 | | aux (Abs (_, _, t')) _ table = aux t' [] table | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 76 | | aux (t as Const (x as (s, _))) args table = | 
| 55889 | 77 | if is_built_in_const x orelse is_nonfree_constr ctxt x orelse | 
| 69593 | 78 | is_sel s orelse s = \<^const_name>\<open>Sigma\<close> then | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 79 | table | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 80 | else | 
| 36384 | 81 | Termtab.map_default (t, 65536) (Integer.min (length args)) table | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 82 | | aux _ _ table = table | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 83 | in aux t [] end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 84 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 85 | fun uncurry_prefix_for k j = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 86 | uncurry_prefix ^ string_of_int k ^ "@" ^ string_of_int j ^ name_sep | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 87 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 88 | fun uncurry_term table t = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 89 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 90 | fun aux (t1 $ t2) args = aux t1 (aux t2 [] :: args) | 
| 37476 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 91 | | aux (Abs (s, T, t')) args = s_betapplys [] (Abs (s, T, aux t' []), args) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 92 | | aux (t as Const (s, T)) args = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 93 | (case Termtab.lookup table t of | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 94 | SOME n => | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 95 | if n >= 2 then | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 96 | let | 
| 35280 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 blanchet parents: 
35220diff
changeset | 97 | val arg_Ts = strip_n_binders n T |> fst | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 98 | val j = | 
| 35280 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 blanchet parents: 
35220diff
changeset | 99 | if is_iterator_type (hd arg_Ts) then | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 100 | 1 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 101 | else case find_index (not_equal bool_T) arg_Ts of | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 102 | ~1 => n | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 103 | | j => j | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 104 | val ((before_args, tuple_args), after_args) = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 105 | args |> chop n |>> chop j | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 106 | val ((before_arg_Ts, tuple_arg_Ts), rest_T) = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 107 | T |> strip_n_binders n |>> chop j | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 108 | val tuple_T = HOLogic.mk_tupleT tuple_arg_Ts | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 109 | in | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 110 | if n - j < 2 then | 
| 37476 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 111 | s_betapplys [] (t, args) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 112 | else | 
| 37476 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 113 | s_betapplys [] | 
| 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 114 | (Const (uncurry_prefix_for (n - j) j ^ s, | 
| 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 115 | before_arg_Ts ---> tuple_T --> rest_T), | 
| 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 116 | before_args @ [mk_flat_tuple tuple_T tuple_args] @ | 
| 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 117 | after_args) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 118 | end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 119 | else | 
| 37476 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 120 | s_betapplys [] (t, args) | 
| 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 121 | | NONE => s_betapplys [] (t, args)) | 
| 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 122 | | aux t args = s_betapplys [] (t, args) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 123 | in aux t [] end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 124 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 125 | (** Boxing **) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 126 | |
| 55888 | 127 | fun box_fun_and_pair_in_term (hol_ctxt as {ctxt, ...}) def orig_t =
 | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 128 | let | 
| 69593 | 129 | fun box_relational_operator_type (Type (\<^type_name>\<open>fun\<close>, Ts)) = | 
| 130 | Type (\<^type_name>\<open>fun\<close>, map box_relational_operator_type Ts) | |
| 131 | | box_relational_operator_type (Type (\<^type_name>\<open>prod\<close>, Ts)) = | |
| 132 | Type (\<^type_name>\<open>prod\<close>, map (box_type hol_ctxt InPair) Ts) | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 133 | | box_relational_operator_type T = T | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 134 | fun add_boxed_types_for_var (z as (_, T)) (T', t') = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 135 | case t' of | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 136 | Var z' => z' = z ? insert (op =) T' | 
| 69593 | 137 | | Const (\<^const_name>\<open>Pair\<close>, _) $ t1 $ t2 => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 138 | (case T' of | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 139 | Type (_, [T1, T2]) => | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 140 | fold (add_boxed_types_for_var z) [(T1, t1), (T2, t2)] | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 141 |          | _ => raise TYPE ("Nitpick_Preproc.box_fun_and_pair_in_term.\
 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 142 | \add_boxed_types_for_var", [T'], [])) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 143 | | _ => exists_subterm (curry (op =) (Var z)) t' ? insert (op =) T | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 144 | fun box_var_in_def new_Ts old_Ts t (z as (_, T)) = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 145 | case t of | 
| 69597 | 146 | \<^const>\<open>Trueprop\<close> $ t1 => box_var_in_def new_Ts old_Ts t1 z | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 147 | | Const (s0, _) $ t1 $ _ => | 
| 69593 | 148 | if s0 = \<^const_name>\<open>Pure.eq\<close> orelse s0 = \<^const_name>\<open>HOL.eq\<close> then | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 149 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 150 | val (t', args) = strip_comb t1 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 151 | val T' = fastype_of1 (new_Ts, do_term new_Ts old_Ts Neut t') | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 152 | in | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 153 | case fold (add_boxed_types_for_var z) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 154 | (fst (strip_n_binders (length args) T') ~~ args) [] of | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 155 | [T''] => T'' | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 156 | | _ => T | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 157 | end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 158 | else | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 159 | T | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 160 | | _ => T | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 161 | and do_quantifier new_Ts old_Ts polar quant_s quant_T abs_s abs_T t = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 162 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 163 | val abs_T' = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 164 | if polar = Neut orelse is_positive_existential polar quant_s then | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 165 | box_type hol_ctxt InFunLHS abs_T | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 166 | else | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 167 | abs_T | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 168 | val body_T = body_type quant_T | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 169 | in | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 170 | Const (quant_s, (abs_T' --> body_T) --> body_T) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 171 | $ Abs (abs_s, abs_T', | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 172 | t |> do_term (abs_T' :: new_Ts) (abs_T :: old_Ts) polar) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 173 | end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 174 | and do_equals new_Ts old_Ts s0 T0 t1 t2 = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 175 | let | 
| 59058 
a78612c67ec0
renamed "pairself" to "apply2", in accordance to @{apply 2};
 wenzelm parents: 
58634diff
changeset | 176 | val (t1, t2) = apply2 (do_term new_Ts old_Ts Neut) (t1, t2) | 
| 
a78612c67ec0
renamed "pairself" to "apply2", in accordance to @{apply 2};
 wenzelm parents: 
58634diff
changeset | 177 | val (T1, T2) = apply2 (curry fastype_of1 new_Ts) (t1, t2) | 
| 
a78612c67ec0
renamed "pairself" to "apply2", in accordance to @{apply 2};
 wenzelm parents: 
58634diff
changeset | 178 | val T = if def then T1 else [T1, T2] |> sort (int_ord o apply2 size_of_typ) |> hd | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 179 | in | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 180 | list_comb (Const (s0, T --> T --> body_type T0), | 
| 35384 | 181 | map2 (coerce_term hol_ctxt new_Ts T) [T1, T2] [t1, t2]) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 182 | end | 
| 37271 | 183 | and do_descr s T = | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 184 | let val T1 = box_type hol_ctxt InFunLHS (range_type T) in | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 185 | Const (s, (T1 --> bool_T) --> T1) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 186 | end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 187 | and do_term new_Ts old_Ts polar t = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 188 | case t of | 
| 69593 | 189 | Const (s0 as \<^const_name>\<open>Pure.all\<close>, T0) $ Abs (s1, T1, t1) => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 190 | do_quantifier new_Ts old_Ts polar s0 T0 s1 T1 t1 | 
| 69593 | 191 | | Const (s0 as \<^const_name>\<open>Pure.eq\<close>, T0) $ t1 $ t2 => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 192 | do_equals new_Ts old_Ts s0 T0 t1 t2 | 
| 69597 | 193 | | \<^const>\<open>Pure.imp\<close> $ t1 $ t2 => | 
| 194 | \<^const>\<open>Pure.imp\<close> $ do_term new_Ts old_Ts (flip_polarity polar) t1 | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 195 | $ do_term new_Ts old_Ts polar t2 | 
| 69597 | 196 | | \<^const>\<open>Pure.conjunction\<close> $ t1 $ t2 => | 
| 197 | \<^const>\<open>Pure.conjunction\<close> $ do_term new_Ts old_Ts polar t1 | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 198 | $ do_term new_Ts old_Ts polar t2 | 
| 69597 | 199 | | \<^const>\<open>Trueprop\<close> $ t1 => | 
| 200 | \<^const>\<open>Trueprop\<close> $ do_term new_Ts old_Ts polar t1 | |
| 201 | | \<^const>\<open>Not\<close> $ t1 => | |
| 202 | \<^const>\<open>Not\<close> $ do_term new_Ts old_Ts (flip_polarity polar) t1 | |
| 69593 | 203 | | Const (s0 as \<^const_name>\<open>All\<close>, T0) $ Abs (s1, T1, t1) => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 204 | do_quantifier new_Ts old_Ts polar s0 T0 s1 T1 t1 | 
| 69593 | 205 | | Const (s0 as \<^const_name>\<open>Ex\<close>, T0) $ Abs (s1, T1, t1) => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 206 | do_quantifier new_Ts old_Ts polar s0 T0 s1 T1 t1 | 
| 69593 | 207 | | Const (s0 as \<^const_name>\<open>HOL.eq\<close>, T0) $ t1 $ t2 => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 208 | do_equals new_Ts old_Ts s0 T0 t1 t2 | 
| 69597 | 209 | | \<^const>\<open>HOL.conj\<close> $ t1 $ t2 => | 
| 210 | \<^const>\<open>HOL.conj\<close> $ do_term new_Ts old_Ts polar t1 | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 211 | $ do_term new_Ts old_Ts polar t2 | 
| 69597 | 212 | | \<^const>\<open>HOL.disj\<close> $ t1 $ t2 => | 
| 213 | \<^const>\<open>HOL.disj\<close> $ do_term new_Ts old_Ts polar t1 | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 214 | $ do_term new_Ts old_Ts polar t2 | 
| 69597 | 215 | | \<^const>\<open>HOL.implies\<close> $ t1 $ t2 => | 
| 216 | \<^const>\<open>HOL.implies\<close> $ do_term new_Ts old_Ts (flip_polarity polar) t1 | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 217 | $ do_term new_Ts old_Ts polar t2 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 218 | | Const (x as (s, T)) => | 
| 37271 | 219 | if is_descr s then | 
| 220 | do_descr s T | |
| 221 | else | |
| 69593 | 222 | Const (s, if s = \<^const_name>\<open>converse\<close> orelse | 
| 223 | s = \<^const_name>\<open>trancl\<close> then | |
| 37271 | 224 | box_relational_operator_type T | 
| 225 | else if String.isPrefix quot_normal_prefix s then | |
| 226 | let val T' = box_type hol_ctxt InFunLHS (domain_type T) in | |
| 227 | T' --> T' | |
| 228 | end | |
| 55888 | 229 | else if is_built_in_const x orelse | 
| 69593 | 230 | s = \<^const_name>\<open>Sigma\<close> then | 
| 37271 | 231 | T | 
| 55889 | 232 | else if is_nonfree_constr ctxt x then | 
| 37271 | 233 | box_type hol_ctxt InConstr T | 
| 234 | else if is_sel s orelse is_rep_fun ctxt x then | |
| 235 | box_type hol_ctxt InSel T | |
| 236 | else | |
| 237 | box_type hol_ctxt InExpr T) | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 238 | | t1 $ Abs (s, T, t2') => | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 239 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 240 | val t1 = do_term new_Ts old_Ts Neut t1 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 241 | val T1 = fastype_of1 (new_Ts, t1) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 242 | val (s1, Ts1) = dest_Type T1 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 243 | val T' = hd (snd (dest_Type (hd Ts1))) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 244 | val t2 = Abs (s, T', do_term (T' :: new_Ts) (T :: old_Ts) Neut t2') | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 245 | val T2 = fastype_of1 (new_Ts, t2) | 
| 35384 | 246 | val t2 = coerce_term hol_ctxt new_Ts (hd Ts1) T2 t2 | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 247 | in | 
| 69593 | 248 | s_betapply new_Ts (if s1 = \<^type_name>\<open>fun\<close> then | 
| 37476 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 249 | t1 | 
| 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 250 | else | 
| 55888 | 251 | select_nth_constr_arg ctxt | 
| 69593 | 252 | (\<^const_name>\<open>FunBox\<close>, | 
| 253 | Type (\<^type_name>\<open>fun\<close>, Ts1) --> T1) t1 0 | |
| 254 | (Type (\<^type_name>\<open>fun\<close>, Ts1)), t2) | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 255 | end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 256 | | t1 $ t2 => | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 257 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 258 | val t1 = do_term new_Ts old_Ts Neut t1 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 259 | val T1 = fastype_of1 (new_Ts, t1) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 260 | val (s1, Ts1) = dest_Type T1 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 261 | val t2 = do_term new_Ts old_Ts Neut t2 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 262 | val T2 = fastype_of1 (new_Ts, t2) | 
| 35384 | 263 | val t2 = coerce_term hol_ctxt new_Ts (hd Ts1) T2 t2 | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 264 | in | 
| 69593 | 265 | s_betapply new_Ts (if s1 = \<^type_name>\<open>fun\<close> then | 
| 37476 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 266 | t1 | 
| 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 267 | else | 
| 55888 | 268 | select_nth_constr_arg ctxt | 
| 69593 | 269 | (\<^const_name>\<open>FunBox\<close>, | 
| 270 | Type (\<^type_name>\<open>fun\<close>, Ts1) --> T1) t1 0 | |
| 271 | (Type (\<^type_name>\<open>fun\<close>, Ts1)), t2) | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 272 | end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 273 | | Free (s, T) => Free (s, box_type hol_ctxt InExpr T) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 274 | | Var (z as (x, T)) => | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 275 | Var (x, if def then box_var_in_def new_Ts old_Ts orig_t z | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 276 | else box_type hol_ctxt InExpr T) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 277 | | Bound _ => t | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 278 | | Abs (s, T, t') => | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 279 | Abs (s, T, do_term (T :: new_Ts) (T :: old_Ts) Neut t') | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 280 | in do_term [] [] Pos orig_t end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 281 | |
| 46102 | 282 | (** Destruction of set membership and comprehensions **) | 
| 283 | ||
| 69593 | 284 | fun destroy_set_Collect (Const (\<^const_name>\<open>Set.member\<close>, _) $ t1 | 
| 285 | $ (Const (\<^const_name>\<open>Collect\<close>, _) $ t2)) = | |
| 46102 | 286 | destroy_set_Collect (t2 $ t1) | 
| 287 | | destroy_set_Collect (t1 $ t2) = | |
| 288 | destroy_set_Collect t1 $ destroy_set_Collect t2 | |
| 289 | | destroy_set_Collect (Abs (s, T, t')) = Abs (s, T, destroy_set_Collect t') | |
| 290 | | destroy_set_Collect t = t | |
| 291 | ||
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 292 | (** Destruction of constructors **) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 293 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 294 | val val_var_prefix = nitpick_prefix ^ "v" | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 295 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 296 | fun fresh_value_var Ts k n j t = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 297 | Var ((val_var_prefix ^ nat_subscript (n - j), k), fastype_of1 (Ts, t)) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 298 | |
| 35280 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 blanchet parents: 
35220diff
changeset | 299 | fun has_heavy_bounds_or_vars Ts t = | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 300 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 301 | fun aux [] = false | 
| 46115 | 302 | | aux [T] = is_fun_or_set_type T orelse is_pair_type T | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 303 | | aux _ = true | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 304 | in aux (map snd (Term.add_vars t []) @ map (nth Ts) (loose_bnos t)) end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 305 | |
| 55888 | 306 | fun pull_out_constr_comb ({ctxt, ...} : hol_context) Ts relax k level t args
 | 
| 307 | seen = | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 308 | let val t_comb = list_comb (t, args) in | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 309 | case t of | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 310 | Const x => | 
| 55888 | 311 | if not relax andalso is_constr ctxt x andalso | 
| 46115 | 312 | not (is_fun_or_set_type (fastype_of1 (Ts, t_comb))) andalso | 
| 35280 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 blanchet parents: 
35220diff
changeset | 313 | has_heavy_bounds_or_vars Ts t_comb andalso | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 314 | not (loose_bvar (t_comb, level)) then | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 315 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 316 | val (j, seen) = case find_index (curry (op =) t_comb) seen of | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 317 | ~1 => (0, t_comb :: seen) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 318 | | j => (j, seen) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 319 | in (fresh_value_var Ts k (length seen) j t_comb, seen) end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 320 | else | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 321 | (t_comb, seen) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 322 | | _ => (t_comb, seen) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 323 | end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 324 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 325 | fun equations_for_pulled_out_constrs mk_eq Ts k seen = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 326 | let val n = length seen in | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 327 | map2 (fn j => fn t => mk_eq (fresh_value_var Ts k n j t, t)) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 328 | (index_seq 0 n) seen | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 329 | end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 330 | |
| 35220 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 331 | fun pull_out_universal_constrs hol_ctxt def t = | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 332 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 333 | val k = maxidx_of_term t + 1 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 334 | fun do_term Ts def t args seen = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 335 | case t of | 
| 69593 | 336 | (t0 as Const (\<^const_name>\<open>Pure.eq\<close>, _)) $ t1 $ t2 => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 337 | do_eq_or_imp Ts true def t0 t1 t2 seen | 
| 69597 | 338 | | (t0 as \<^const>\<open>Pure.imp\<close>) $ t1 $ t2 => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 339 | if def then (t, []) else do_eq_or_imp Ts false def t0 t1 t2 seen | 
| 69593 | 340 | | (t0 as Const (\<^const_name>\<open>HOL.eq\<close>, _)) $ t1 $ t2 => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 341 | do_eq_or_imp Ts true def t0 t1 t2 seen | 
| 69597 | 342 | | (t0 as \<^const>\<open>HOL.implies\<close>) $ t1 $ t2 => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 343 | do_eq_or_imp Ts false def t0 t1 t2 seen | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 344 | | Abs (s, T, t') => | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 345 | let val (t', seen) = do_term (T :: Ts) def t' [] seen in | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 346 | (list_comb (Abs (s, T, t'), args), seen) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 347 | end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 348 | | t1 $ t2 => | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 349 | let val (t2, seen) = do_term Ts def t2 [] seen in | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 350 | do_term Ts def t1 (t2 :: args) seen | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 351 | end | 
| 35220 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 352 | | _ => pull_out_constr_comb hol_ctxt Ts def k 0 t args seen | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 353 | and do_eq_or_imp Ts eq def t0 t1 t2 seen = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 354 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 355 | val (t2, seen) = if eq andalso def then (t2, seen) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 356 | else do_term Ts false t2 [] seen | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 357 | val (t1, seen) = do_term Ts false t1 [] seen | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 358 | in (t0 $ t1 $ t2, seen) end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 359 | val (concl, seen) = do_term [] def t [] [] | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 360 | in | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 361 | Logic.list_implies (equations_for_pulled_out_constrs Logic.mk_equals [] k | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 362 | seen, concl) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 363 | end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 364 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 365 | fun mk_exists v t = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 366 | HOLogic.exists_const (fastype_of v) $ lambda v (incr_boundvars 1 t) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 367 | |
| 35220 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 368 | fun pull_out_existential_constrs hol_ctxt t = | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 369 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 370 | val k = maxidx_of_term t + 1 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 371 | fun aux Ts num_exists t args seen = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 372 | case t of | 
| 69593 | 373 | (t0 as Const (\<^const_name>\<open>Ex\<close>, _)) $ Abs (s1, T1, t1) => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 374 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 375 | val (t1, seen') = aux (T1 :: Ts) (num_exists + 1) t1 [] [] | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 376 | val n = length seen' | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 377 | fun vars () = map2 (fresh_value_var Ts k n) (index_seq 0 n) seen' | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 378 | in | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 379 | (equations_for_pulled_out_constrs HOLogic.mk_eq Ts k seen' | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 380 | |> List.foldl s_conj t1 |> fold mk_exists (vars ()) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 381 | |> curry3 Abs s1 T1 |> curry (op $) t0, seen) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 382 | end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 383 | | t1 $ t2 => | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 384 | let val (t2, seen) = aux Ts num_exists t2 [] seen in | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 385 | aux Ts num_exists t1 (t2 :: args) seen | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 386 | end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 387 | | Abs (s, T, t') => | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 388 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 389 | val (t', seen) = aux (T :: Ts) 0 t' [] (map (incr_boundvars 1) seen) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 390 | in (list_comb (Abs (s, T, t'), args), map (incr_boundvars ~1) seen) end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 391 | | _ => | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 392 | if num_exists > 0 then | 
| 35220 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 393 | pull_out_constr_comb hol_ctxt Ts false k num_exists t args seen | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 394 | else | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 395 | (list_comb (t, args), seen) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 396 | in aux [] 0 t [] [] |> fst end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 397 | |
| 55888 | 398 | fun destroy_pulled_out_constrs (hol_ctxt as {ctxt, ...}) axiom strong t =
 | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 399 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 400 | val num_occs_of_var = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 401 | fold_aterms (fn Var z => (fn f => fn z' => f z' |> z = z' ? Integer.add 1) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 402 | | _ => I) t (K 0) | 
| 69593 | 403 | fun aux Ts careful ((t0 as Const (\<^const_name>\<open>Pure.eq\<close>, _)) $ t1 $ t2) = | 
| 41793 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 blanchet parents: 
41791diff
changeset | 404 | aux_eq Ts careful true t0 t1 t2 | 
| 69597 | 405 | | aux Ts careful ((t0 as \<^const>\<open>Pure.imp\<close>) $ t1 $ t2) = | 
| 41793 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 blanchet parents: 
41791diff
changeset | 406 | t0 $ aux Ts false t1 $ aux Ts careful t2 | 
| 69593 | 407 | | aux Ts careful ((t0 as Const (\<^const_name>\<open>HOL.eq\<close>, _)) $ t1 $ t2) = | 
| 41793 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 blanchet parents: 
41791diff
changeset | 408 | aux_eq Ts careful true t0 t1 t2 | 
| 69597 | 409 | | aux Ts careful ((t0 as \<^const>\<open>HOL.implies\<close>) $ t1 $ t2) = | 
| 41793 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 blanchet parents: 
41791diff
changeset | 410 | t0 $ aux Ts false t1 $ aux Ts careful t2 | 
| 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 blanchet parents: 
41791diff
changeset | 411 | | aux Ts careful (Abs (s, T, t')) = Abs (s, T, aux (T :: Ts) careful t') | 
| 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 blanchet parents: 
41791diff
changeset | 412 | | aux Ts careful (t1 $ t2) = aux Ts careful t1 $ aux Ts careful t2 | 
| 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 blanchet parents: 
41791diff
changeset | 413 | | aux _ _ t = t | 
| 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 blanchet parents: 
41791diff
changeset | 414 | and aux_eq Ts careful pass1 t0 t1 t2 = | 
| 41994 
c567c860caf6
always destroy constructor patterns, since this seems to be always useful
 blanchet parents: 
41876diff
changeset | 415 | ((if careful orelse | 
| 
c567c860caf6
always destroy constructor patterns, since this seems to be always useful
 blanchet parents: 
41876diff
changeset | 416 | not (strong orelse forall (is_constr_pattern ctxt) [t1, t2]) then | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 417 | raise SAME () | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 418 | else if axiom andalso is_Var t2 andalso | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 419 | num_occs_of_var (dest_Var t2) = 1 then | 
| 69597 | 420 | \<^const>\<open>True\<close> | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 421 | else case strip_comb t2 of | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 422 | (* The first case is not as general as it could be. *) | 
| 69593 | 423 | (Const (\<^const_name>\<open>PairBox\<close>, _), | 
| 424 | [Const (\<^const_name>\<open>fst\<close>, _) $ Var z1, | |
| 425 | Const (\<^const_name>\<open>snd\<close>, _) $ Var z2]) => | |
| 69597 | 426 | if z1 = z2 andalso num_occs_of_var z1 = 2 then \<^const>\<open>True\<close> | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 427 | else raise SAME () | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 428 | | (Const (x as (s, T)), args) => | 
| 35386 
45a4e19d3ebd
more work on the new monotonicity stuff in Nitpick
 blanchet parents: 
35385diff
changeset | 429 | let | 
| 
45a4e19d3ebd
more work on the new monotonicity stuff in Nitpick
 blanchet parents: 
35385diff
changeset | 430 | val (arg_Ts, dataT) = strip_type T | 
| 
45a4e19d3ebd
more work on the new monotonicity stuff in Nitpick
 blanchet parents: 
35385diff
changeset | 431 | val n = length arg_Ts | 
| 
45a4e19d3ebd
more work on the new monotonicity stuff in Nitpick
 blanchet parents: 
35385diff
changeset | 432 | in | 
| 
45a4e19d3ebd
more work on the new monotonicity stuff in Nitpick
 blanchet parents: 
35385diff
changeset | 433 | if length args = n andalso | 
| 69593 | 434 | (is_constr ctxt x orelse s = \<^const_name>\<open>Pair\<close> orelse | 
| 435 | x = (\<^const_name>\<open>Suc\<close>, nat_T --> nat_T)) andalso | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 436 | (not careful orelse not (is_Var t1) orelse | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 437 | String.isPrefix val_var_prefix (fst (fst (dest_Var t1)))) then | 
| 41793 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 blanchet parents: 
41791diff
changeset | 438 | s_let Ts "l" (n + 1) dataT bool_T | 
| 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 blanchet parents: 
41791diff
changeset | 439 | (fn t1 => | 
| 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 blanchet parents: 
41791diff
changeset | 440 | discriminate_value hol_ctxt x t1 :: | 
| 58634 
9f10d82e8188
added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
 wenzelm parents: 
56245diff
changeset | 441 |                           @{map 3} (sel_eq Ts x t1) (index_seq 0 n) arg_Ts args
 | 
| 41793 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 blanchet parents: 
41791diff
changeset | 442 | |> foldr1 s_conj) t1 | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 443 | else | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 444 | raise SAME () | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 445 | end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 446 | | _ => raise SAME ()) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 447 | |> body_type (type_of t0) = prop_T ? HOLogic.mk_Trueprop) | 
| 41793 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 blanchet parents: 
41791diff
changeset | 448 | handle SAME () => if pass1 then aux_eq Ts careful false t0 t2 t1 | 
| 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 blanchet parents: 
41791diff
changeset | 449 | else t0 $ aux Ts false t2 $ aux Ts false t1 | 
| 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 blanchet parents: 
41791diff
changeset | 450 | and sel_eq Ts x t n nth_T nth_t = | 
| 55888 | 451 | HOLogic.eq_const nth_T $ nth_t $ select_nth_constr_arg ctxt x t n nth_T | 
| 41793 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 blanchet parents: 
41791diff
changeset | 452 | |> aux Ts false | 
| 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 blanchet parents: 
41791diff
changeset | 453 | in aux [] axiom t end | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 454 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 455 | (** Destruction of universal and existential equalities **) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 456 | |
| 69597 | 457 | fun curry_assms (\<^const>\<open>Pure.imp\<close> $ (\<^const>\<open>Trueprop\<close> | 
| 458 | $ (\<^const>\<open>HOL.conj\<close> $ t1 $ t2)) $ t3) = | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 459 | curry_assms (Logic.list_implies ([t1, t2] |> map HOLogic.mk_Trueprop, t3)) | 
| 69597 | 460 | | curry_assms (\<^const>\<open>Pure.imp\<close> $ t1 $ t2) = | 
| 461 | \<^const>\<open>Pure.imp\<close> $ curry_assms t1 $ curry_assms t2 | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 462 | | curry_assms t = t | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 463 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 464 | val destroy_universal_equalities = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 465 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 466 | fun aux prems zs t = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 467 | case t of | 
| 69597 | 468 | \<^const>\<open>Pure.imp\<close> $ t1 $ t2 => aux_implies prems zs t1 t2 | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 469 | | _ => Logic.list_implies (rev prems, t) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 470 | and aux_implies prems zs t1 t2 = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 471 | case t1 of | 
| 69593 | 472 | Const (\<^const_name>\<open>Pure.eq\<close>, _) $ Var z $ t' => aux_eq prems zs z t' t1 t2 | 
| 69597 | 473 | | \<^const>\<open>Trueprop\<close> $ (Const (\<^const_name>\<open>HOL.eq\<close>, _) $ Var z $ t') => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 474 | aux_eq prems zs z t' t1 t2 | 
| 69597 | 475 | | \<^const>\<open>Trueprop\<close> $ (Const (\<^const_name>\<open>HOL.eq\<close>, _) $ t' $ Var z) => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 476 | aux_eq prems zs z t' t1 t2 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 477 | | _ => aux (t1 :: prems) (Term.add_vars t1 zs) t2 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 478 | and aux_eq prems zs z t' t1 t2 = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 479 | if not (member (op =) zs z) andalso | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 480 | not (exists_subterm (curry (op =) (Var z)) t') then | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 481 | aux prems zs (subst_free [(Var z, t')] t2) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 482 | else | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 483 | aux (t1 :: prems) (Term.add_vars t1 zs) t2 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 484 | in aux [] [] end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 485 | |
| 55888 | 486 | fun find_bound_assign ctxt j = | 
| 35220 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 487 | let | 
| 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 488 | fun do_term _ [] = NONE | 
| 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 489 | | do_term seen (t :: ts) = | 
| 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 490 | let | 
| 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 491 | fun do_eq pass1 t1 t2 = | 
| 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 492 | (if loose_bvar1 (t2, j) then | 
| 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 493 | if pass1 then do_eq false t2 t1 else raise SAME () | 
| 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 494 | else case t1 of | 
| 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 495 | Bound j' => if j' = j then SOME (t2, ts @ seen) else raise SAME () | 
| 69593 | 496 | | Const (s, Type (\<^type_name>\<open>fun\<close>, [T1, T2])) $ Bound j' => | 
| 35220 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 497 | if j' = j andalso | 
| 69593 | 498 | s = nth_sel_name_for_constr_name \<^const_name>\<open>FunBox\<close> 0 then | 
| 55888 | 499 | SOME (construct_value ctxt | 
| 69593 | 500 | (\<^const_name>\<open>FunBox\<close>, T2 --> T1) [t2], | 
| 37256 
0dca1ec52999
thread along context instead of theory for typedef lookup
 blanchet parents: 
37253diff
changeset | 501 | ts @ seen) | 
| 35220 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 502 | else | 
| 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 503 | raise SAME () | 
| 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 504 | | _ => raise SAME ()) | 
| 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 505 | handle SAME () => do_term (t :: seen) ts | 
| 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 506 | in | 
| 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 507 | case t of | 
| 69593 | 508 | Const (\<^const_name>\<open>HOL.eq\<close>, _) $ t1 $ t2 => do_eq true t1 t2 | 
| 35220 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 509 | | _ => do_term (t :: seen) ts | 
| 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 510 | end | 
| 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 511 | in do_term end | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 512 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 513 | fun subst_one_bound j arg t = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 514 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 515 | fun aux (Bound i, lev) = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 516 | if i < lev then raise SAME () | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 517 | else if i = lev then incr_boundvars (lev - j) arg | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 518 | else Bound (i - 1) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 519 | | aux (Abs (a, T, body), lev) = Abs (a, T, aux (body, lev + 1)) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 520 | | aux (f $ t, lev) = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 521 | (aux (f, lev) $ (aux (t, lev) handle SAME () => t) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 522 | handle SAME () => f $ aux (t, lev)) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 523 | | aux _ = raise SAME () | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 524 | in aux (t, j) handle SAME () => t end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 525 | |
| 55888 | 526 | fun destroy_existential_equalities ({ctxt, ...} : hol_context) =
 | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 527 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 528 | fun kill [] [] ts = foldr1 s_conj ts | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 529 | | kill (s :: ss) (T :: Ts) ts = | 
| 55888 | 530 | (case find_bound_assign ctxt (length ss) [] ts of | 
| 69597 | 531 | SOME (_, []) => \<^const>\<open>True\<close> | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 532 | | SOME (arg_t, ts) => | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 533 | kill ss Ts (map (subst_one_bound (length ss) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 534 | (incr_bv (~1, length ss + 1, arg_t))) ts) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 535 | | NONE => | 
| 69593 | 536 | Const (\<^const_name>\<open>Ex\<close>, (T --> bool_T) --> bool_T) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 537 | $ Abs (s, T, kill ss Ts ts)) | 
| 40722 
441260986b63
make two copies (!) of Library.UnequalLengths coincide with ListPair.UnequalLengths;
 wenzelm parents: 
39687diff
changeset | 538 | | kill _ _ _ = raise ListPair.UnequalLengths | 
| 69593 | 539 | fun gather ss Ts (Const (\<^const_name>\<open>Ex\<close>, _) $ Abs (s1, T1, t1)) = | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 540 | gather (ss @ [s1]) (Ts @ [T1]) t1 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 541 | | gather [] [] (Abs (s, T, t1)) = Abs (s, T, gather [] [] t1) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 542 | | gather [] [] (t1 $ t2) = gather [] [] t1 $ gather [] [] t2 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 543 | | gather [] [] t = t | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 544 | | gather ss Ts t = kill ss Ts (conjuncts_of (gather [] [] t)) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 545 | in gather [] [] end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 546 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 547 | (** Skolemization **) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 548 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 549 | fun skolem_prefix_for k j = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 550 | skolem_prefix ^ string_of_int k ^ "@" ^ string_of_int j ^ name_sep | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 551 | |
| 41791 
01d722707a36
always unfold constant defitions marked with "nitpick_def" -- to prevent unfolding, there's already "nitpick_simp"
 blanchet parents: 
41052diff
changeset | 552 | fun skolemize_term_and_more (hol_ctxt as {thy, def_tables, skolems, ...})
 | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 553 | skolem_depth = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 554 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 555 | val incrs = map (Integer.add 1) | 
| 37928 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 556 | fun aux ss Ts js skolemizable polar t = | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 557 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 558 | fun do_quantifier quant_s quant_T abs_s abs_T t = | 
| 37928 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 559 | (if not (loose_bvar1 (t, 0)) then | 
| 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 560 | aux ss Ts js skolemizable polar (incr_boundvars ~1 t) | 
| 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 561 | else if is_positive_existential polar quant_s then | 
| 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 562 | let | 
| 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 563 | val j = length (!skolems) + 1 | 
| 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 564 | in | 
| 47754 
11b4395aaf0c
remove too aggressive skolemization optimization (prevented discovery of a model in SYN994^1)
 blanchet parents: 
47669diff
changeset | 565 | if skolemizable andalso length js <= skolem_depth then | 
| 37928 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 566 | let | 
| 47754 
11b4395aaf0c
remove too aggressive skolemization optimization (prevented discovery of a model in SYN994^1)
 blanchet parents: 
47669diff
changeset | 567 | val sko_s = skolem_prefix_for (length js) j ^ abs_s | 
| 
11b4395aaf0c
remove too aggressive skolemization optimization (prevented discovery of a model in SYN994^1)
 blanchet parents: 
47669diff
changeset | 568 | val _ = Unsynchronized.change skolems (cons (sko_s, ss)) | 
| 
11b4395aaf0c
remove too aggressive skolemization optimization (prevented discovery of a model in SYN994^1)
 blanchet parents: 
47669diff
changeset | 569 | val sko_t = list_comb (Const (sko_s, rev Ts ---> abs_T), | 
| 
11b4395aaf0c
remove too aggressive skolemization optimization (prevented discovery of a model in SYN994^1)
 blanchet parents: 
47669diff
changeset | 570 | map Bound (rev js)) | 
| 37928 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 571 | val abs_t = Abs (abs_s, abs_T, | 
| 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 572 | aux ss Ts (incrs js) skolemizable polar t) | 
| 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 573 | in | 
| 47754 
11b4395aaf0c
remove too aggressive skolemization optimization (prevented discovery of a model in SYN994^1)
 blanchet parents: 
47669diff
changeset | 574 | if null js then | 
| 37928 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 575 | s_betapply Ts (abs_t, sko_t) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 576 | else | 
| 69593 | 577 | Const (\<^const_name>\<open>Let\<close>, abs_T --> quant_T) $ sko_t | 
| 37928 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 578 | $ abs_t | 
| 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 579 | end | 
| 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 580 | else | 
| 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 581 | raise SAME () | 
| 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 582 | end | 
| 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 583 | else | 
| 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 584 | raise SAME ()) | 
| 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 585 | handle SAME () => | 
| 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 586 | Const (quant_s, quant_T) | 
| 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 587 | $ Abs (abs_s, abs_T, | 
| 38166 
28bb89672cc7
fix Skolemizer -- last week's optimizations resulted in UnequalLengths errors
 blanchet parents: 
38165diff
changeset | 588 | aux (abs_s :: ss) (abs_T :: Ts) (0 :: incrs js) | 
| 
28bb89672cc7
fix Skolemizer -- last week's optimizations resulted in UnequalLengths errors
 blanchet parents: 
38165diff
changeset | 589 | (skolemizable andalso | 
| 
28bb89672cc7
fix Skolemizer -- last week's optimizations resulted in UnequalLengths errors
 blanchet parents: 
38165diff
changeset | 590 | not (is_higher_order_type abs_T)) polar t) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 591 | in | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 592 | case t of | 
| 69593 | 593 | Const (s0 as \<^const_name>\<open>Pure.all\<close>, T0) $ Abs (s1, T1, t1) => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 594 | do_quantifier s0 T0 s1 T1 t1 | 
| 69597 | 595 | | \<^const>\<open>Pure.imp\<close> $ t1 $ t2 => | 
| 596 | \<^const>\<open>Pure.imp\<close> $ aux ss Ts js skolemizable (flip_polarity polar) t1 | |
| 37928 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 597 | $ aux ss Ts js skolemizable polar t2 | 
| 69597 | 598 | | \<^const>\<open>Pure.conjunction\<close> $ t1 $ t2 => | 
| 599 | \<^const>\<open>Pure.conjunction\<close> $ aux ss Ts js skolemizable polar t1 | |
| 37928 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 600 | $ aux ss Ts js skolemizable polar t2 | 
| 69597 | 601 | | \<^const>\<open>Trueprop\<close> $ t1 => | 
| 602 | \<^const>\<open>Trueprop\<close> $ aux ss Ts js skolemizable polar t1 | |
| 603 | | \<^const>\<open>Not\<close> $ t1 => | |
| 604 | \<^const>\<open>Not\<close> $ aux ss Ts js skolemizable (flip_polarity polar) t1 | |
| 69593 | 605 | | Const (s0 as \<^const_name>\<open>All\<close>, T0) $ Abs (s1, T1, t1) => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 606 | do_quantifier s0 T0 s1 T1 t1 | 
| 69593 | 607 | | Const (s0 as \<^const_name>\<open>Ex\<close>, T0) $ Abs (s1, T1, t1) => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 608 | do_quantifier s0 T0 s1 T1 t1 | 
| 69597 | 609 | | \<^const>\<open>HOL.conj\<close> $ t1 $ t2 => | 
| 59058 
a78612c67ec0
renamed "pairself" to "apply2", in accordance to @{apply 2};
 wenzelm parents: 
58634diff
changeset | 610 | s_conj (apply2 (aux ss Ts js skolemizable polar) (t1, t2)) | 
| 69597 | 611 | | \<^const>\<open>HOL.disj\<close> $ t1 $ t2 => | 
| 59058 
a78612c67ec0
renamed "pairself" to "apply2", in accordance to @{apply 2};
 wenzelm parents: 
58634diff
changeset | 612 | s_disj (apply2 (aux ss Ts js skolemizable polar) (t1, t2)) | 
| 69597 | 613 | | \<^const>\<open>HOL.implies\<close> $ t1 $ t2 => | 
| 614 | \<^const>\<open>HOL.implies\<close> $ aux ss Ts js skolemizable (flip_polarity polar) t1 | |
| 37928 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 615 | $ aux ss Ts js skolemizable polar t2 | 
| 69593 | 616 | | (t0 as Const (\<^const_name>\<open>Let\<close>, _)) $ t1 $ t2 => | 
| 37928 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 617 | t0 $ t1 $ aux ss Ts js skolemizable polar t2 | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 618 | | Const (x as (s, T)) => | 
| 55889 | 619 | if is_raw_inductive_pred hol_ctxt x andalso | 
| 620 | not (is_raw_equational_fun hol_ctxt x) andalso | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 621 | not (is_well_founded_inductive_pred hol_ctxt x) then | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 622 | let | 
| 41791 
01d722707a36
always unfold constant defitions marked with "nitpick_def" -- to prevent unfolding, there's already "nitpick_simp"
 blanchet parents: 
41052diff
changeset | 623 | val gfp = (fixpoint_kind_of_const thy def_tables x = Gfp) | 
| 37476 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 624 | val (pref, connective) = | 
| 69597 | 625 | if gfp then (lbfp_prefix, \<^const>\<open>HOL.disj\<close>) | 
| 626 | else (ubfp_prefix, \<^const>\<open>HOL.conj\<close>) | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 627 | fun pos () = unrolled_inductive_pred_const hol_ctxt gfp x | 
| 37928 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 628 | |> aux ss Ts js skolemizable polar | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 629 | fun neg () = Const (pref ^ s, T) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 630 | in | 
| 37476 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 631 | case polar |> gfp ? flip_polarity of | 
| 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 632 | Pos => pos () | 
| 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 633 | | Neg => neg () | 
| 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 634 | | Neut => | 
| 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 635 | let | 
| 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 636 | val arg_Ts = binder_types T | 
| 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 637 | fun app f = | 
| 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 638 | list_comb (f (), map Bound (length arg_Ts - 1 downto 0)) | 
| 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 639 | in | 
| 44241 | 640 | fold_rev absdummy arg_Ts (connective $ app pos $ app neg) | 
| 37476 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 641 | end | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 642 | end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 643 | else | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 644 | Const x | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 645 | | t1 $ t2 => | 
| 38166 
28bb89672cc7
fix Skolemizer -- last week's optimizations resulted in UnequalLengths errors
 blanchet parents: 
38165diff
changeset | 646 | s_betapply Ts (aux ss Ts js false polar t1, | 
| 
28bb89672cc7
fix Skolemizer -- last week's optimizations resulted in UnequalLengths errors
 blanchet parents: 
38165diff
changeset | 647 | aux ss Ts js false Neut t2) | 
| 37928 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 648 | | Abs (s, T, t1) => | 
| 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 649 | Abs (s, T, aux ss Ts (incrs js) skolemizable polar t1) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 650 | | _ => t | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 651 | end | 
| 37928 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 652 | in aux [] [] [] true Pos end | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 653 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 654 | (** Function specialization **) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 655 | |
| 69597 | 656 | fun params_in_equation (\<^const>\<open>Pure.imp\<close> $ _ $ t2) = params_in_equation t2 | 
| 657 | | params_in_equation (\<^const>\<open>Trueprop\<close> $ t1) = params_in_equation t1 | |
| 69593 | 658 | | params_in_equation (Const (\<^const_name>\<open>HOL.eq\<close>, _) $ t1 $ _) = | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 659 | snd (strip_comb t1) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 660 | | params_in_equation _ = [] | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 661 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 662 | fun specialize_fun_axiom x x' fixed_js fixed_args extra_args t = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 663 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 664 | val k = fold Integer.max (map maxidx_of_term (fixed_args @ extra_args)) 0 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 665 | + 1 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 666 | val t = map_aterms (fn Var ((s, i), T) => Var ((s, k + i), T) | t' => t') t | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 667 | val fixed_params = filter_indices fixed_js (params_in_equation t) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 668 | fun aux args (Abs (s, T, t)) = list_comb (Abs (s, T, aux [] t), args) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 669 | | aux args (t1 $ t2) = aux (aux [] t2 :: args) t1 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 670 | | aux args t = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 671 | if t = Const x then | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 672 | list_comb (Const x', extra_args @ filter_out_indices fixed_js args) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 673 | else | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 674 | let val j = find_index (curry (op =) t) fixed_params in | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 675 | list_comb (if j >= 0 then nth fixed_args j else t, args) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 676 | end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 677 | in aux [] t end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 678 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 679 | fun static_args_in_term ({ersatz_table, ...} : hol_context) x t =
 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 680 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 681 | fun fun_calls (Abs (_, _, t)) _ = fun_calls t [] | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 682 | | fun_calls (t1 $ t2) args = fun_calls t2 [] #> fun_calls t1 (t2 :: args) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 683 | | fun_calls t args = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 684 | (case t of | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 685 | Const (x' as (s', T')) => | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 686 | x = x' orelse (case AList.lookup (op =) ersatz_table s' of | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 687 | SOME s'' => x = (s'', T') | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 688 | | NONE => false) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 689 | | _ => false) ? cons args | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 690 | fun call_sets [] [] vs = [vs] | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 691 | | call_sets [] uss vs = vs :: call_sets uss [] [] | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 692 | | call_sets ([] :: _) _ _ = [] | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 693 | | call_sets ((t :: ts) :: tss) uss vs = | 
| 39687 | 694 | Ord_List.insert Term_Ord.term_ord t vs |> call_sets tss (ts :: uss) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 695 | val sets = call_sets (fun_calls t [] []) [] [] | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 696 | val indexed_sets = sets ~~ (index_seq 0 (length sets)) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 697 | in | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 698 | fold_rev (fn (set, j) => | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 699 | case set of | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 700 | [Var _] => AList.lookup (op =) indexed_sets set = SOME j | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 701 | ? cons (j, NONE) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 702 | | [t as Const _] => cons (j, SOME t) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 703 | | [t as Free _] => cons (j, SOME t) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 704 | | _ => I) indexed_sets [] | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 705 | end | 
| 55889 | 706 | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 707 | fun static_args_in_terms hol_ctxt x = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 708 | map (static_args_in_term hol_ctxt x) | 
| 39687 | 709 | #> fold1 (Ord_List.inter (prod_ord int_ord (option_ord Term_Ord.term_ord))) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 710 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 711 | fun overlapping_indices [] _ = [] | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 712 | | overlapping_indices _ [] = [] | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 713 | | overlapping_indices (ps1 as (j1, t1) :: ps1') (ps2 as (j2, t2) :: ps2') = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 714 | if j1 < j2 then overlapping_indices ps1' ps2 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 715 | else if j1 > j2 then overlapping_indices ps1 ps2' | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 716 | else overlapping_indices ps1' ps2' |> the_default t2 t1 = t2 ? cons j1 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 717 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 718 | fun special_prefix_for j = special_prefix ^ string_of_int j ^ name_sep | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 719 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 720 | (* If a constant's definition is picked up deeper than this threshold, we | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 721 | prevent excessive specialization by not specializing it. *) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 722 | val special_max_depth = 20 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 723 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 724 | val bound_var_prefix = "b" | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 725 | |
| 38165 
9797be44df23
prevent generation of needless specialized constants etc.
 blanchet parents: 
37928diff
changeset | 726 | fun special_fun_aconv ((x1, js1, ts1), (x2, js2, ts2)) = | 
| 
9797be44df23
prevent generation of needless specialized constants etc.
 blanchet parents: 
37928diff
changeset | 727 | x1 = x2 andalso js1 = js2 andalso length ts1 = length ts2 andalso | 
| 
9797be44df23
prevent generation of needless specialized constants etc.
 blanchet parents: 
37928diff
changeset | 728 | forall (op aconv) (ts1 ~~ ts2) | 
| 
9797be44df23
prevent generation of needless specialized constants etc.
 blanchet parents: 
37928diff
changeset | 729 | |
| 38204 | 730 | fun specialize_consts_in_term | 
| 55888 | 731 |         (hol_ctxt as {ctxt, thy, specialize, def_tables, simp_table,
 | 
| 39359 | 732 | special_funs, ...}) def depth t = | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 733 | if not specialize orelse depth > special_max_depth then | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 734 | t | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 735 | else | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 736 | let | 
| 38206 | 737 | val blacklist = | 
| 738 | if def then case term_under_def t of Const x => [x] | _ => [] else [] | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 739 | fun aux args Ts (Const (x as (s, T))) = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 740 | ((if not (member (op =) blacklist x) andalso not (null args) andalso | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 741 | not (String.isPrefix special_prefix s) andalso | 
| 55888 | 742 | not (is_built_in_const x) andalso | 
| 55889 | 743 | (is_equational_fun hol_ctxt x orelse | 
| 41791 
01d722707a36
always unfold constant defitions marked with "nitpick_def" -- to prevent unfolding, there's already "nitpick_simp"
 blanchet parents: 
41052diff
changeset | 744 | (is_some (def_of_const thy def_tables x) andalso | 
| 38204 | 745 | not (is_of_class_const thy x) andalso | 
| 55888 | 746 | not (is_constr ctxt x) andalso | 
| 38204 | 747 | not (is_choice_spec_fun hol_ctxt x))) then | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 748 | let | 
| 41793 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 blanchet parents: 
41791diff
changeset | 749 | val eligible_args = | 
| 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 blanchet parents: 
41791diff
changeset | 750 | filter (is_special_eligible_arg true Ts o snd) | 
| 
c7a2669ae75d
tweaked Nitpick based on C++ memory model example
 blanchet parents: 
41791diff
changeset | 751 | (index_seq 0 (length args) ~~ args) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 752 | val _ = not (null eligible_args) orelse raise SAME () | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 753 | val old_axs = equational_fun_axioms hol_ctxt x | 
| 35220 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 754 | |> map (destroy_existential_equalities hol_ctxt) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 755 | val static_params = static_args_in_terms hol_ctxt x old_axs | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 756 | val fixed_js = overlapping_indices static_params eligible_args | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 757 | val _ = not (null fixed_js) orelse raise SAME () | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 758 | val fixed_args = filter_indices fixed_js args | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 759 | val vars = fold Term.add_vars fixed_args [] | 
| 59058 
a78612c67ec0
renamed "pairself" to "apply2", in accordance to @{apply 2};
 wenzelm parents: 
58634diff
changeset | 760 | |> sort (Term_Ord.fast_indexname_ord o apply2 fst) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 761 | val bound_js = fold (fn t => fn js => add_loose_bnos (t, 0, js)) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 762 | fixed_args [] | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 763 | |> sort int_ord | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 764 | val live_args = filter_out_indices fixed_js args | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 765 | val extra_args = map Var vars @ map Bound bound_js @ live_args | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 766 | val extra_Ts = map snd vars @ filter_indices bound_js Ts | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 767 | val k = maxidx_of_term t + 1 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 768 | fun var_for_bound_no j = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 769 | Var ((bound_var_prefix ^ | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 770 | nat_subscript (find_index (curry (op =) j) bound_js | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 771 | + 1), k), | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 772 | nth Ts j) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 773 | val fixed_args_in_axiom = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 774 | map (curry subst_bounds | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 775 | (map var_for_bound_no (index_seq 0 (length Ts)))) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 776 | fixed_args | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 777 | in | 
| 38165 
9797be44df23
prevent generation of needless specialized constants etc.
 blanchet parents: 
37928diff
changeset | 778 | case AList.lookup special_fun_aconv (!special_funs) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 779 | (x, fixed_js, fixed_args_in_axiom) of | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 780 | SOME x' => list_comb (Const x', extra_args) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 781 | | NONE => | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 782 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 783 | val extra_args_in_axiom = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 784 | map Var vars @ map var_for_bound_no bound_js | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 785 | val x' as (s', _) = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 786 | (special_prefix_for (length (!special_funs) + 1) ^ s, | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 787 | extra_Ts @ filter_out_indices fixed_js (binder_types T) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 788 | ---> body_type T) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 789 | val new_axs = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 790 | map (specialize_fun_axiom x x' fixed_js | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 791 | fixed_args_in_axiom extra_args_in_axiom) old_axs | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 792 | val _ = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 793 | Unsynchronized.change special_funs | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 794 | (cons ((x, fixed_js, fixed_args_in_axiom), x')) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 795 | val _ = add_simps simp_table s' new_axs | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 796 | in list_comb (Const x', extra_args) end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 797 | end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 798 | else | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 799 | raise SAME ()) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 800 | handle SAME () => list_comb (Const x, args)) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 801 | | aux args Ts (Abs (s, T, t)) = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 802 | list_comb (Abs (s, T, aux [] (T :: Ts) t), args) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 803 | | aux args Ts (t1 $ t2) = aux (aux [] Ts t2 :: args) Ts t1 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 804 | | aux args _ t = list_comb (t, args) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 805 | in aux [] [] t end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 806 | |
| 55889 | 807 | type special_triple = int list * term list * (string * typ) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 808 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 809 | val cong_var_prefix = "c" | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 810 | |
| 35280 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 blanchet parents: 
35220diff
changeset | 811 | fun special_congruence_axiom T (js1, ts1, x1) (js2, ts2, x2) = | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 812 | let | 
| 59058 
a78612c67ec0
renamed "pairself" to "apply2", in accordance to @{apply 2};
 wenzelm parents: 
58634diff
changeset | 813 | val (bounds1, bounds2) = apply2 (map Var o special_bounds) (ts1, ts2) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 814 | val Ts = binder_types T | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 815 | val max_j = fold (fold Integer.max) [js1, js2] ~1 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 816 | val (eqs, (args1, args2)) = | 
| 59058 
a78612c67ec0
renamed "pairself" to "apply2", in accordance to @{apply 2};
 wenzelm parents: 
58634diff
changeset | 817 | fold (fn j => case apply2 (fn ps => AList.lookup (op =) ps j) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 818 | (js1 ~~ ts1, js2 ~~ ts2) of | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 819 | (SOME t1, SOME t2) => apfst (cons (t1, t2)) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 820 | | (SOME t1, NONE) => apsnd (apsnd (cons t1)) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 821 | | (NONE, SOME t2) => apsnd (apfst (cons t2)) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 822 | | (NONE, NONE) => | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 823 | let val v = Var ((cong_var_prefix ^ nat_subscript j, 0), | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 824 | nth Ts j) in | 
| 59058 
a78612c67ec0
renamed "pairself" to "apply2", in accordance to @{apply 2};
 wenzelm parents: 
58634diff
changeset | 825 | apsnd (apply2 (cons v)) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 826 | end) (max_j downto 0) ([], ([], [])) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 827 | in | 
| 38165 
9797be44df23
prevent generation of needless specialized constants etc.
 blanchet parents: 
37928diff
changeset | 828 | Logic.list_implies (eqs |> filter_out (op aconv) |> distinct (op =) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 829 | |> map Logic.mk_equals, | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 830 | Logic.mk_equals (list_comb (Const x1, bounds1 @ args1), | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 831 | list_comb (Const x2, bounds2 @ args2))) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 832 | end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 833 | |
| 38170 | 834 | fun special_congruence_axioms (hol_ctxt as {special_funs, ...}) ts =
 | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 835 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 836 | val groups = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 837 | !special_funs | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 838 | |> map (fn ((x, js, ts), x') => (x, (js, ts, x'))) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 839 | |> AList.group (op =) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 840 | |> filter_out (is_equational_fun_surely_complete hol_ctxt o fst) | 
| 38170 | 841 | |> map (fn (x, zs) => | 
| 842 | (x, zs |> member (op =) ts (Const x) ? cons ([], [], x))) | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 843 | fun generality (js, _, _) = ~(length js) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 844 | fun is_more_specific (j1, t1, x1) (j2, t2, x2) = | 
| 38165 
9797be44df23
prevent generation of needless specialized constants etc.
 blanchet parents: 
37928diff
changeset | 845 | x1 <> x2 andalso length j2 < length j1 andalso | 
| 39687 | 846 | Ord_List.subset (prod_ord int_ord Term_Ord.term_ord) (j2 ~~ t2, j1 ~~ t1) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 847 | fun do_pass_1 _ [] [_] [_] = I | 
| 35280 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 blanchet parents: 
35220diff
changeset | 848 | | do_pass_1 T skipped _ [] = do_pass_2 T skipped | 
| 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 blanchet parents: 
35220diff
changeset | 849 | | do_pass_1 T skipped all (z :: zs) = | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 850 | case filter (is_more_specific z) all | 
| 59058 
a78612c67ec0
renamed "pairself" to "apply2", in accordance to @{apply 2};
 wenzelm parents: 
58634diff
changeset | 851 | |> sort (int_ord o apply2 generality) of | 
| 35280 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 blanchet parents: 
35220diff
changeset | 852 | [] => do_pass_1 T (z :: skipped) all zs | 
| 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 blanchet parents: 
35220diff
changeset | 853 | | (z' :: _) => cons (special_congruence_axiom T z z') | 
| 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 blanchet parents: 
35220diff
changeset | 854 | #> do_pass_1 T skipped all zs | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 855 | and do_pass_2 _ [] = I | 
| 35280 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 blanchet parents: 
35220diff
changeset | 856 | | do_pass_2 T (z :: zs) = | 
| 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 blanchet parents: 
35220diff
changeset | 857 | fold (cons o special_congruence_axiom T z) zs #> do_pass_2 T zs | 
| 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 blanchet parents: 
35220diff
changeset | 858 | in fold (fn ((_, T), zs) => do_pass_1 T [] zs zs) groups [] end | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 859 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 860 | (** Axiom selection **) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 861 | |
| 38169 
b51784515471
optimize local "def"s by treating them as definitions
 blanchet parents: 
38166diff
changeset | 862 | fun defined_free_by_assumption t = | 
| 
b51784515471
optimize local "def"s by treating them as definitions
 blanchet parents: 
38166diff
changeset | 863 | let | 
| 47669 | 864 | fun do_equals u def = | 
| 865 | if exists_subterm (curry (op aconv) u) def then NONE else SOME u | |
| 38169 
b51784515471
optimize local "def"s by treating them as definitions
 blanchet parents: 
38166diff
changeset | 866 | in | 
| 
b51784515471
optimize local "def"s by treating them as definitions
 blanchet parents: 
38166diff
changeset | 867 | case t of | 
| 69593 | 868 | Const (\<^const_name>\<open>Pure.eq\<close>, _) $ (u as Free _) $ def => do_equals u def | 
| 69597 | 869 | | \<^const>\<open>Trueprop\<close> | 
| 69593 | 870 | $ (Const (\<^const_name>\<open>HOL.eq\<close>, _) $ (u as Free _) $ def) => | 
| 47669 | 871 | do_equals u def | 
| 38169 
b51784515471
optimize local "def"s by treating them as definitions
 blanchet parents: 
38166diff
changeset | 872 | | _ => NONE | 
| 
b51784515471
optimize local "def"s by treating them as definitions
 blanchet parents: 
38166diff
changeset | 873 | end | 
| 
b51784515471
optimize local "def"s by treating them as definitions
 blanchet parents: 
38166diff
changeset | 874 | |
| 
b51784515471
optimize local "def"s by treating them as definitions
 blanchet parents: 
38166diff
changeset | 875 | fun assumption_exclusively_defines_free assm_ts t = | 
| 
b51784515471
optimize local "def"s by treating them as definitions
 blanchet parents: 
38166diff
changeset | 876 | case defined_free_by_assumption t of | 
| 47669 | 877 | SOME u => | 
| 878 | length (filter ((fn SOME u' => u aconv u' | NONE => false) | |
| 38169 
b51784515471
optimize local "def"s by treating them as definitions
 blanchet parents: 
38166diff
changeset | 879 | o defined_free_by_assumption) assm_ts) = 1 | 
| 
b51784515471
optimize local "def"s by treating them as definitions
 blanchet parents: 
38166diff
changeset | 880 | | NONE => false | 
| 
b51784515471
optimize local "def"s by treating them as definitions
 blanchet parents: 
38166diff
changeset | 881 | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 882 | fun all_table_entries table = Symtab.fold (append o snd) table [] | 
| 55889 | 883 | |
| 41791 
01d722707a36
always unfold constant defitions marked with "nitpick_def" -- to prevent unfolding, there's already "nitpick_simp"
 blanchet parents: 
41052diff
changeset | 884 | fun extra_table tables s = | 
| 59058 
a78612c67ec0
renamed "pairself" to "apply2", in accordance to @{apply 2};
 wenzelm parents: 
58634diff
changeset | 885 | Symtab.make [(s, apply2 all_table_entries tables |> op @)] | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 886 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 887 | fun eval_axiom_for_term j t = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 888 | Logic.mk_equals (Const (eval_prefix ^ string_of_int j, fastype_of t), t) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 889 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 890 | val is_trivial_equation = the_default false o try (op aconv o Logic.dest_equals) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 891 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 892 | (* Prevents divergence in case of cyclic or infinite axiom dependencies. *) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 893 | val axioms_max_depth = 255 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 894 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 895 | fun axioms_for_term | 
| 55888 | 896 |         (hol_ctxt as {thy, ctxt, max_bisim_depth, user_axioms, evals,
 | 
| 897 | def_tables, nondef_table, choice_spec_table, nondefs, | |
| 898 | ...}) assm_ts neg_t = | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 899 | let | 
| 38170 | 900 | val (def_assm_ts, nondef_assm_ts) = | 
| 901 | List.partition (assumption_exclusively_defines_free assm_ts) assm_ts | |
| 902 | val def_assm_table = map (`(the o defined_free_by_assumption)) def_assm_ts | |
| 55889 | 903 | type accumulator = (string * typ) list * (term list * term list) | 
| 38206 | 904 | fun add_axiom get app def depth t (accum as (seen, axs)) = | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 905 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 906 | val t = t |> unfold_defs_in_term hol_ctxt | 
| 38206 | 907 | |> skolemize_term_and_more hol_ctxt ~1 (* FIXME: why ~1? *) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 908 | in | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 909 | if is_trivial_equation t then | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 910 | accum | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 911 | else | 
| 38206 | 912 | let val t' = t |> specialize_consts_in_term hol_ctxt def depth in | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 913 | if exists (member (op aconv) (get axs)) [t, t'] then accum | 
| 38170 | 914 | else add_axioms_for_term (depth + 1) t' (seen, app (cons t') axs) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 915 | end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 916 | end | 
| 38206 | 917 | and add_def_axiom depth = add_axiom fst apfst true depth | 
| 918 | and add_nondef_axiom depth = add_axiom snd apsnd false depth | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 919 | and add_maybe_def_axiom depth t = | 
| 69597 | 920 | (if head_of t <> \<^const>\<open>Pure.imp\<close> then add_def_axiom | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 921 | else add_nondef_axiom) depth t | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 922 | and add_eq_axiom depth t = | 
| 37256 
0dca1ec52999
thread along context instead of theory for typedef lookup
 blanchet parents: 
37253diff
changeset | 923 | (if is_constr_pattern_formula ctxt t then add_def_axiom | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 924 | else add_nondef_axiom) depth t | 
| 38170 | 925 | and add_axioms_for_term depth t (accum as (seen, axs)) = | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 926 | case t of | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 927 | t1 $ t2 => accum |> fold (add_axioms_for_term depth) [t1, t2] | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 928 | | Const (x as (s, T)) => | 
| 55888 | 929 | (if member (op aconv) seen t orelse is_built_in_const x then | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 930 | accum | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 931 | else | 
| 38170 | 932 | let val accum = (t :: seen, axs) in | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 933 | if depth > axioms_max_depth then | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 934 |                raise TOO_LARGE ("Nitpick_Preproc.axioms_for_term.\
 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 935 | \add_axioms_for_term", | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 936 |                                 "too many nested axioms (" ^
 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 937 | string_of_int depth ^ ")") | 
| 37260 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37256diff
changeset | 938 | else if is_of_class_const thy x then | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 939 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 940 | val class = Logic.class_of_const s | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 941 |                  val of_class = Logic.mk_of_class (TVar (("'a", 0), [class]),
 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 942 | class) | 
| 36555 
8ff45c2076da
expand combinators in Isar proofs constructed by Sledgehammer;
 blanchet parents: 
36389diff
changeset | 943 | val ax1 = try (specialize_type thy x) of_class | 
| 
8ff45c2076da
expand combinators in Isar proofs constructed by Sledgehammer;
 blanchet parents: 
36389diff
changeset | 944 | val ax2 = Option.map (specialize_type thy x o snd) | 
| 37260 
dde817e6dfb1
added "atoms" option to Nitpick (request from Karlsruhe) + wrap Refute. functions to "nitpick_util.ML"
 blanchet parents: 
37256diff
changeset | 945 | (get_class_def thy class) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 946 | in | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 947 | fold (add_maybe_def_axiom depth) (map_filter I [ax1, ax2]) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 948 | accum | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 949 | end | 
| 55888 | 950 | else if is_constr ctxt x then | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 951 | accum | 
| 37271 | 952 | else if is_descr (original_name s) then | 
| 953 | fold (add_nondef_axiom depth) (equational_fun_axioms hol_ctxt x) | |
| 954 | accum | |
| 55889 | 955 | else if is_equational_fun hol_ctxt x then | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 956 | fold (add_eq_axiom depth) (equational_fun_axioms hol_ctxt x) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 957 | accum | 
| 35807 
e4d1b5cbd429
added support for "specification" and "ax_specification" constructs to Nitpick
 blanchet parents: 
35718diff
changeset | 958 | else if is_choice_spec_fun hol_ctxt x then | 
| 
e4d1b5cbd429
added support for "specification" and "ax_specification" constructs to Nitpick
 blanchet parents: 
35718diff
changeset | 959 | fold (add_nondef_axiom depth) | 
| 
e4d1b5cbd429
added support for "specification" and "ax_specification" constructs to Nitpick
 blanchet parents: 
35718diff
changeset | 960 | (nondef_props_for_const thy true choice_spec_table x) accum | 
| 37256 
0dca1ec52999
thread along context instead of theory for typedef lookup
 blanchet parents: 
37253diff
changeset | 961 | else if is_abs_fun ctxt x then | 
| 38215 
1c7d7eaebdf2
quotient types registered as codatatypes are no longer quotient types
 blanchet parents: 
38207diff
changeset | 962 | accum |> fold (add_nondef_axiom depth) | 
| 
1c7d7eaebdf2
quotient types registered as codatatypes are no longer quotient types
 blanchet parents: 
38207diff
changeset | 963 | (nondef_props_for_const thy false nondef_table x) | 
| 38240 
a44d108a8d39
local versions of Nitpick.register_xxx functions
 blanchet parents: 
38215diff
changeset | 964 | |> (is_funky_typedef ctxt (range_type T) orelse | 
| 38215 
1c7d7eaebdf2
quotient types registered as codatatypes are no longer quotient types
 blanchet parents: 
38207diff
changeset | 965 | range_type T = nat_T) | 
| 
1c7d7eaebdf2
quotient types registered as codatatypes are no longer quotient types
 blanchet parents: 
38207diff
changeset | 966 | ? fold (add_maybe_def_axiom depth) | 
| 
1c7d7eaebdf2
quotient types registered as codatatypes are no longer quotient types
 blanchet parents: 
38207diff
changeset | 967 | (nondef_props_for_const thy true | 
| 41791 
01d722707a36
always unfold constant defitions marked with "nitpick_def" -- to prevent unfolding, there's already "nitpick_simp"
 blanchet parents: 
41052diff
changeset | 968 | (extra_table def_tables s) x) | 
| 37256 
0dca1ec52999
thread along context instead of theory for typedef lookup
 blanchet parents: 
37253diff
changeset | 969 | else if is_rep_fun ctxt x then | 
| 38215 
1c7d7eaebdf2
quotient types registered as codatatypes are no longer quotient types
 blanchet parents: 
38207diff
changeset | 970 | accum |> fold (add_nondef_axiom depth) | 
| 
1c7d7eaebdf2
quotient types registered as codatatypes are no longer quotient types
 blanchet parents: 
38207diff
changeset | 971 | (nondef_props_for_const thy false nondef_table x) | 
| 38240 
a44d108a8d39
local versions of Nitpick.register_xxx functions
 blanchet parents: 
38215diff
changeset | 972 | |> (is_funky_typedef ctxt (range_type T) orelse | 
| 38215 
1c7d7eaebdf2
quotient types registered as codatatypes are no longer quotient types
 blanchet parents: 
38207diff
changeset | 973 | range_type T = nat_T) | 
| 
1c7d7eaebdf2
quotient types registered as codatatypes are no longer quotient types
 blanchet parents: 
38207diff
changeset | 974 | ? fold (add_maybe_def_axiom depth) | 
| 
1c7d7eaebdf2
quotient types registered as codatatypes are no longer quotient types
 blanchet parents: 
38207diff
changeset | 975 | (nondef_props_for_const thy true | 
| 41791 
01d722707a36
always unfold constant defitions marked with "nitpick_def" -- to prevent unfolding, there's already "nitpick_simp"
 blanchet parents: 
41052diff
changeset | 976 | (extra_table def_tables s) x) | 
| 38215 
1c7d7eaebdf2
quotient types registered as codatatypes are no longer quotient types
 blanchet parents: 
38207diff
changeset | 977 | |> add_axioms_for_term depth | 
| 
1c7d7eaebdf2
quotient types registered as codatatypes are no longer quotient types
 blanchet parents: 
38207diff
changeset | 978 | (Const (mate_of_rep_fun ctxt x)) | 
| 
1c7d7eaebdf2
quotient types registered as codatatypes are no longer quotient types
 blanchet parents: 
38207diff
changeset | 979 | |> fold (add_def_axiom depth) | 
| 
1c7d7eaebdf2
quotient types registered as codatatypes are no longer quotient types
 blanchet parents: 
38207diff
changeset | 980 | (inverse_axioms_for_rep_fun ctxt x) | 
| 69593 | 981 | else if s = \<^const_name>\<open>Pure.type\<close> then | 
| 37253 | 982 | accum | 
| 41791 
01d722707a36
always unfold constant defitions marked with "nitpick_def" -- to prevent unfolding, there's already "nitpick_simp"
 blanchet parents: 
41052diff
changeset | 983 | else case def_of_const thy def_tables x of | 
| 39345 | 984 | SOME _ => | 
| 38202 
379fb08da97b
prevent the expansion of too large definitions -- use equations for these instead
 blanchet parents: 
38190diff
changeset | 985 | fold (add_eq_axiom depth) (equational_fun_axioms hol_ctxt x) | 
| 
379fb08da97b
prevent the expansion of too large definitions -- use equations for these instead
 blanchet parents: 
38190diff
changeset | 986 | accum | 
| 
379fb08da97b
prevent the expansion of too large definitions -- use equations for these instead
 blanchet parents: 
38190diff
changeset | 987 | | NONE => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 988 | accum |> user_axioms <> SOME false | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 989 | ? fold (add_nondef_axiom depth) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 990 | (nondef_props_for_const thy false nondef_table x) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 991 | end) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 992 | |> add_axioms_for_type depth T | 
| 47669 | 993 | | Free (_, T) => | 
| 38170 | 994 | (if member (op aconv) seen t then | 
| 995 | accum | |
| 47669 | 996 | else case AList.lookup (op =) def_assm_table t of | 
| 38170 | 997 | SOME t => add_def_axiom depth t accum | 
| 998 | | NONE => accum) | |
| 999 | |> add_axioms_for_type depth T | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1000 | | Var (_, T) => add_axioms_for_type depth T accum | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1001 | | Bound _ => accum | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1002 | | Abs (_, T, t) => accum |> add_axioms_for_term depth t | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1003 | |> add_axioms_for_type depth T | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1004 | and add_axioms_for_type depth T = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1005 | case T of | 
| 69593 | 1006 | Type (\<^type_name>\<open>fun\<close>, Ts) => fold (add_axioms_for_type depth) Ts | 
| 1007 | | Type (\<^type_name>\<open>prod\<close>, Ts) => fold (add_axioms_for_type depth) Ts | |
| 1008 | | Type (\<^type_name>\<open>set\<close>, Ts) => fold (add_axioms_for_type depth) Ts | |
| 1009 | | \<^typ>\<open>prop\<close> => I | |
| 1010 | | \<^typ>\<open>bool\<close> => I | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1011 | | TFree (_, S) => add_axioms_for_sort depth T S | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1012 | | TVar (_, S) => add_axioms_for_sort depth T S | 
| 35280 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 blanchet parents: 
35220diff
changeset | 1013 | | Type (z as (_, Ts)) => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1014 | fold (add_axioms_for_type depth) Ts | 
| 37256 
0dca1ec52999
thread along context instead of theory for typedef lookup
 blanchet parents: 
37253diff
changeset | 1015 | #> (if is_pure_typedef ctxt T then | 
| 
0dca1ec52999
thread along context instead of theory for typedef lookup
 blanchet parents: 
37253diff
changeset | 1016 | fold (add_maybe_def_axiom depth) (optimized_typedef_axioms ctxt z) | 
| 38240 
a44d108a8d39
local versions of Nitpick.register_xxx functions
 blanchet parents: 
38215diff
changeset | 1017 | else if is_quot_type ctxt T then | 
| 55888 | 1018 | fold (add_def_axiom depth) (optimized_quot_type_axioms ctxt z) | 
| 38240 
a44d108a8d39
local versions of Nitpick.register_xxx functions
 blanchet parents: 
38215diff
changeset | 1019 | else if max_bisim_depth >= 0 andalso is_codatatype ctxt T then | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1020 | fold (add_maybe_def_axiom depth) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1021 | (codatatype_bisim_axioms hol_ctxt T) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1022 | else | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1023 | I) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1024 | and add_axioms_for_sort depth T S = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1025 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1026 | val supers = Sign.complete_sort thy S | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1027 | val class_axioms = | 
| 59582 | 1028 | maps (fn class => map Thm.prop_of (Axclass.get_info thy class |> #axioms | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1029 | handle ERROR _ => [])) supers | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1030 | val monomorphic_class_axioms = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1031 | map (fn t => case Term.add_tvars t [] of | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1032 | [] => t | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1033 | | [(x, S)] => | 
| 61770 | 1034 | Envir.subst_term_types (Vartab.make [(x, (S, T))]) t | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1035 |                        | _ => raise TERM ("Nitpick_Preproc.axioms_for_term.\
 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1036 | \add_axioms_for_sort", [t])) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1037 | class_axioms | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1038 | in fold (add_nondef_axiom depth) monomorphic_class_axioms end | 
| 42415 
10accf397ab6
use "Spec_Rules" for finding axioms -- more reliable and cleaner
 blanchet parents: 
42361diff
changeset | 1039 | val (mono_nondefs, poly_nondefs) = | 
| 
10accf397ab6
use "Spec_Rules" for finding axioms -- more reliable and cleaner
 blanchet parents: 
42361diff
changeset | 1040 | List.partition (null o Term.hidden_polymorphism) nondefs | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1041 | val eval_axioms = map2 eval_axiom_for_term (index_seq 0 (length evals)) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1042 | evals | 
| 38170 | 1043 | val (seen, (defs, nondefs)) = | 
| 38169 
b51784515471
optimize local "def"s by treating them as definitions
 blanchet parents: 
38166diff
changeset | 1044 | ([], ([], [])) | 
| 
b51784515471
optimize local "def"s by treating them as definitions
 blanchet parents: 
38166diff
changeset | 1045 | |> add_axioms_for_term 1 neg_t | 
| 
b51784515471
optimize local "def"s by treating them as definitions
 blanchet parents: 
38166diff
changeset | 1046 | |> fold_rev (add_nondef_axiom 1) nondef_assm_ts | 
| 
b51784515471
optimize local "def"s by treating them as definitions
 blanchet parents: 
38166diff
changeset | 1047 | |> fold_rev (add_def_axiom 1) eval_axioms | 
| 42415 
10accf397ab6
use "Spec_Rules" for finding axioms -- more reliable and cleaner
 blanchet parents: 
42361diff
changeset | 1048 | |> user_axioms = SOME true ? fold (add_nondef_axiom 1) mono_nondefs | 
| 38170 | 1049 | val defs = defs @ special_congruence_axioms hol_ctxt seen | 
| 35386 
45a4e19d3ebd
more work on the new monotonicity stuff in Nitpick
 blanchet parents: 
35385diff
changeset | 1050 | val got_all_mono_user_axioms = | 
| 42415 
10accf397ab6
use "Spec_Rules" for finding axioms -- more reliable and cleaner
 blanchet parents: 
42361diff
changeset | 1051 | (user_axioms = SOME true orelse null mono_nondefs) | 
| 
10accf397ab6
use "Spec_Rules" for finding axioms -- more reliable and cleaner
 blanchet parents: 
42361diff
changeset | 1052 | in (neg_t :: nondefs, defs, got_all_mono_user_axioms, null poly_nondefs) end | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1053 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1054 | (** Simplification of constructor/selector terms **) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1055 | |
| 37256 
0dca1ec52999
thread along context instead of theory for typedef lookup
 blanchet parents: 
37253diff
changeset | 1056 | fun simplify_constrs_and_sels ctxt t = | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1057 | let | 
| 61324 
d4ec7594f558
avoid unsound simplification of (C (s x)) when s is a selector but not C's
 blanchet parents: 
60352diff
changeset | 1058 | fun is_nth_sel_on constr_s t' n (Const (s, _) $ t) = | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1059 | (t = t' andalso is_sel_like_and_no_discr s andalso | 
| 61324 
d4ec7594f558
avoid unsound simplification of (C (s x)) when s is a selector but not C's
 blanchet parents: 
60352diff
changeset | 1060 | constr_name_for_sel_like s = constr_s andalso sel_no_from_name s = n) | 
| 
d4ec7594f558
avoid unsound simplification of (C (s x)) when s is a selector but not C's
 blanchet parents: 
60352diff
changeset | 1061 | | is_nth_sel_on _ _ _ _ = false | 
| 69593 | 1062 | fun do_term (Const (\<^const_name>\<open>Rep_Frac\<close>, _) | 
| 1063 | $ (Const (\<^const_name>\<open>Abs_Frac\<close>, _) $ t1)) [] = | |
| 47909 
5f1afeebafbc
fixed "real" after they were redefined as a 'quotient_type'
 blanchet parents: 
47754diff
changeset | 1064 | do_term t1 [] | 
| 69593 | 1065 | | do_term (Const (\<^const_name>\<open>Abs_Frac\<close>, _) | 
| 1066 | $ (Const (\<^const_name>\<open>Rep_Frac\<close>, _) $ t1)) [] = | |
| 47909 
5f1afeebafbc
fixed "real" after they were redefined as a 'quotient_type'
 blanchet parents: 
47754diff
changeset | 1067 | do_term t1 [] | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1068 | | do_term (t1 $ t2) args = do_term t1 (do_term t2 [] :: args) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1069 | | do_term (t as Const (x as (s, T))) (args as _ :: _) = | 
| 55889 | 1070 | ((if is_nonfree_constr ctxt x then | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1071 | if length args = num_binder_types T then | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1072 | case hd args of | 
| 35280 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 blanchet parents: 
35220diff
changeset | 1073 | Const (_, T') $ t' => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1074 | if domain_type T' = body_type T andalso | 
| 61324 
d4ec7594f558
avoid unsound simplification of (C (s x)) when s is a selector but not C's
 blanchet parents: 
60352diff
changeset | 1075 | forall (uncurry (is_nth_sel_on s t')) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1076 | (index_seq 0 (length args) ~~ args) then | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1077 | t' | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1078 | else | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1079 | raise SAME () | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1080 | | _ => raise SAME () | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1081 | else | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1082 | raise SAME () | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1083 | else if is_sel_like_and_no_discr s then | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1084 | case strip_comb (hd args) of | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1085 | (Const (x' as (s', T')), ts') => | 
| 55889 | 1086 | if is_free_constr ctxt x' andalso | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1087 | constr_name_for_sel_like s = s' andalso | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1088 | not (exists is_pair_type (binder_types T')) then | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1089 | list_comb (nth ts' (sel_no_from_name s), tl args) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1090 | else | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1091 | raise SAME () | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1092 | | _ => raise SAME () | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1093 | else | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1094 | raise SAME ()) | 
| 37476 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 1095 | handle SAME () => s_betapplys [] (t, args)) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1096 | | do_term (Abs (s, T, t')) args = | 
| 37476 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 1097 | s_betapplys [] (Abs (s, T, do_term t' []), args) | 
| 
0681e46b4022
optimized code generated for datatype cases + more;
 blanchet parents: 
37271diff
changeset | 1098 | | do_term t args = s_betapplys [] (t, args) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1099 | in do_term t [] end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1100 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1101 | (** Quantifier massaging: Distributing quantifiers **) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1102 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1103 | fun distribute_quantifiers t = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1104 | case t of | 
| 69593 | 1105 | (t0 as Const (\<^const_name>\<open>All\<close>, T0)) $ Abs (s, T1, t1) => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1106 | (case t1 of | 
| 69597 | 1107 | (t10 as \<^const>\<open>HOL.conj\<close>) $ t11 $ t12 => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1108 | t10 $ distribute_quantifiers (t0 $ Abs (s, T1, t11)) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1109 | $ distribute_quantifiers (t0 $ Abs (s, T1, t12)) | 
| 69597 | 1110 | | (t10 as \<^const>\<open>Not\<close>) $ t11 => | 
| 69593 | 1111 | t10 $ distribute_quantifiers (Const (\<^const_name>\<open>Ex\<close>, T0) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1112 | $ Abs (s, T1, t11)) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1113 | | t1 => | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1114 | if not (loose_bvar1 (t1, 0)) then | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1115 | distribute_quantifiers (incr_boundvars ~1 t1) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1116 | else | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1117 | t0 $ Abs (s, T1, distribute_quantifiers t1)) | 
| 69593 | 1118 | | (t0 as Const (\<^const_name>\<open>Ex\<close>, T0)) $ Abs (s, T1, t1) => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1119 | (case distribute_quantifiers t1 of | 
| 69597 | 1120 | (t10 as \<^const>\<open>HOL.disj\<close>) $ t11 $ t12 => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1121 | t10 $ distribute_quantifiers (t0 $ Abs (s, T1, t11)) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1122 | $ distribute_quantifiers (t0 $ Abs (s, T1, t12)) | 
| 69597 | 1123 | | (t10 as \<^const>\<open>HOL.implies\<close>) $ t11 $ t12 => | 
| 69593 | 1124 | t10 $ distribute_quantifiers (Const (\<^const_name>\<open>All\<close>, T0) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1125 | $ Abs (s, T1, t11)) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1126 | $ distribute_quantifiers (t0 $ Abs (s, T1, t12)) | 
| 69597 | 1127 | | (t10 as \<^const>\<open>Not\<close>) $ t11 => | 
| 69593 | 1128 | t10 $ distribute_quantifiers (Const (\<^const_name>\<open>All\<close>, T0) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1129 | $ Abs (s, T1, t11)) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1130 | | t1 => | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1131 | if not (loose_bvar1 (t1, 0)) then | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1132 | distribute_quantifiers (incr_boundvars ~1 t1) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1133 | else | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1134 | t0 $ Abs (s, T1, distribute_quantifiers t1)) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1135 | | t1 $ t2 => distribute_quantifiers t1 $ distribute_quantifiers t2 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1136 | | Abs (s, T, t') => Abs (s, T, distribute_quantifiers t') | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1137 | | _ => t | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1138 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1139 | (** Quantifier massaging: Pushing quantifiers inward **) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1140 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1141 | fun renumber_bounds j n f t = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1142 | case t of | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1143 | t1 $ t2 => renumber_bounds j n f t1 $ renumber_bounds j n f t2 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1144 | | Abs (s, T, t') => Abs (s, T, renumber_bounds (j + 1) n f t') | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1145 | | Bound j' => | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1146 | Bound (if j' >= j andalso j' < j + n then f (j' - j) + j else j') | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1147 | | _ => t | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1148 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1149 | (* Maximum number of quantifiers in a cluster for which the exponential | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1150 | algorithm is used. Larger clusters use a heuristic inspired by Claessen & | 
| 35386 
45a4e19d3ebd
more work on the new monotonicity stuff in Nitpick
 blanchet parents: 
35385diff
changeset | 1151 | Soerensson's polynomial binary splitting procedure (p. 5 of their MODEL 2003 | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1152 | paper). *) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1153 | val quantifier_cluster_threshold = 7 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1154 | |
| 35280 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 blanchet parents: 
35220diff
changeset | 1155 | val push_quantifiers_inward = | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1156 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1157 | fun aux quant_s ss Ts t = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1158 | (case t of | 
| 35280 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 blanchet parents: 
35220diff
changeset | 1159 | Const (s0, _) $ Abs (s1, T1, t1 as _ $ _) => | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1160 | if s0 = quant_s then | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1161 | aux s0 (s1 :: ss) (T1 :: Ts) t1 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1162 | else if quant_s = "" andalso | 
| 69593 | 1163 | (s0 = \<^const_name>\<open>All\<close> orelse s0 = \<^const_name>\<open>Ex\<close>) then | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1164 | aux s0 [s1] [T1] t1 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1165 | else | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1166 | raise SAME () | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1167 | | _ => raise SAME ()) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1168 | handle SAME () => | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1169 | case t of | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1170 | t1 $ t2 => | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1171 | if quant_s = "" then | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1172 | aux "" [] [] t1 $ aux "" [] [] t2 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1173 | else | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1174 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1175 | fun big_union proj ps = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1176 | fold (fold (insert (op =)) o proj) ps [] | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1177 | val (ts, connective) = strip_any_connective t | 
| 41860 
49d0fc8c418c
improved "is_special_eligible_arg" further, by approximating the cardinality of the argument (as is done quite successfully elsewhere)
 blanchet parents: 
41803diff
changeset | 1178 | val T_costs = map typical_card_of_type Ts | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1179 | val t_costs = map size_of_term ts | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1180 | val num_Ts = length Ts | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1181 | val flip = curry (op -) (num_Ts - 1) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1182 | val t_boundss = map (map flip o loose_bnos) ts | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1183 | fun merge costly_boundss [] = costly_boundss | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1184 | | merge costly_boundss (j :: js) = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1185 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1186 | val (yeas, nays) = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1187 | List.partition (fn (bounds, _) => | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1188 | member (op =) bounds j) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1189 | costly_boundss | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1190 | val yeas_bounds = big_union fst yeas | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1191 | val yeas_cost = Integer.sum (map snd yeas) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1192 | * nth T_costs j | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1193 | in merge ((yeas_bounds, yeas_cost) :: nays) js end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1194 | val cost = Integer.sum o map snd oo merge | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1195 | fun heuristically_best_permutation _ [] = [] | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1196 | | heuristically_best_permutation costly_boundss js = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1197 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1198 | val (costly_boundss, (j, js)) = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1199 | js |> map (`(merge costly_boundss o single)) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1200 | |> sort (int_ord | 
| 59058 
a78612c67ec0
renamed "pairself" to "apply2", in accordance to @{apply 2};
 wenzelm parents: 
58634diff
changeset | 1201 | o apply2 (Integer.sum o map snd o fst)) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1202 | |> split_list |>> hd ||> pairf hd tl | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1203 | in | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1204 | j :: heuristically_best_permutation costly_boundss js | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1205 | end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1206 | val js = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1207 | if length Ts <= quantifier_cluster_threshold then | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1208 | all_permutations (index_seq 0 num_Ts) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1209 | |> map (`(cost (t_boundss ~~ t_costs))) | 
| 59058 
a78612c67ec0
renamed "pairself" to "apply2", in accordance to @{apply 2};
 wenzelm parents: 
58634diff
changeset | 1210 | |> sort (int_ord o apply2 fst) |> hd |> snd | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1211 | else | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1212 | heuristically_best_permutation (t_boundss ~~ t_costs) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1213 | (index_seq 0 num_Ts) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1214 | val back_js = map (fn j => find_index (curry (op =) j) js) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1215 | (index_seq 0 num_Ts) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1216 | val ts = map (renumber_bounds 0 num_Ts (nth back_js o flip)) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1217 | ts | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1218 | fun mk_connection [] = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1219 |                        raise ARG ("Nitpick_Preproc.push_quantifiers_inward.aux.\
 | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1220 | \mk_connection", "") | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1221 | | mk_connection ts_cum_bounds = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1222 | ts_cum_bounds |> map fst | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1223 | |> foldr1 (fn (t1, t2) => connective $ t1 $ t2) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1224 | fun build ts_cum_bounds [] = ts_cum_bounds |> mk_connection | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1225 | | build ts_cum_bounds (j :: js) = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1226 | let | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1227 | val (yeas, nays) = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1228 | List.partition (fn (_, bounds) => | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1229 | member (op =) bounds j) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1230 | ts_cum_bounds | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1231 | ||> map (apfst (incr_boundvars ~1)) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1232 | in | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1233 | if null yeas then | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1234 | build nays js | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1235 | else | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1236 | let val T = nth Ts (flip j) in | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1237 | build ((Const (quant_s, (T --> bool_T) --> bool_T) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1238 | $ Abs (nth ss (flip j), T, | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1239 | mk_connection yeas), | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1240 | big_union snd yeas) :: nays) js | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1241 | end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1242 | end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1243 | in build (ts ~~ t_boundss) js end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1244 | | Abs (s, T, t') => Abs (s, T, aux "" [] [] t') | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1245 | | _ => t | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1246 | in aux "" [] [] end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1247 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1248 | (** Preprocessor entry point **) | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1249 | |
| 37928 
24785fa2416c
do a better job at Skolemizing in Nitpick, for TPTP FOF
 blanchet parents: 
37704diff
changeset | 1250 | val max_skolem_depth = 3 | 
| 36389 
8228b3a4a2ba
remove "skolemize" option from Nitpick, since Skolemization is always useful
 blanchet parents: 
36388diff
changeset | 1251 | |
| 38169 
b51784515471
optimize local "def"s by treating them as definitions
 blanchet parents: 
38166diff
changeset | 1252 | fun preprocess_formulas | 
| 55888 | 1253 |         (hol_ctxt as {ctxt, binary_ints, destroy_constrs, boxes, needs, ...})
 | 
| 1254 | assm_ts neg_t = | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1255 | let | 
| 35386 
45a4e19d3ebd
more work on the new monotonicity stuff in Nitpick
 blanchet parents: 
35385diff
changeset | 1256 | val (nondef_ts, def_ts, got_all_mono_user_axioms, no_poly_user_axioms) = | 
| 38169 
b51784515471
optimize local "def"s by treating them as definitions
 blanchet parents: 
38166diff
changeset | 1257 | neg_t |> unfold_defs_in_term hol_ctxt | 
| 
b51784515471
optimize local "def"s by treating them as definitions
 blanchet parents: 
38166diff
changeset | 1258 | |> close_form | 
| 
b51784515471
optimize local "def"s by treating them as definitions
 blanchet parents: 
38166diff
changeset | 1259 | |> skolemize_term_and_more hol_ctxt max_skolem_depth | 
| 38206 | 1260 | |> specialize_consts_in_term hol_ctxt false 0 | 
| 38169 
b51784515471
optimize local "def"s by treating them as definitions
 blanchet parents: 
38166diff
changeset | 1261 | |> axioms_for_term hol_ctxt assm_ts | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1262 | val binarize = | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1263 | case binary_ints of | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1264 | SOME false => false | 
| 35718 | 1265 | | _ => forall (may_use_binary_ints false) nondef_ts andalso | 
| 1266 | forall (may_use_binary_ints true) def_ts andalso | |
| 35220 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 1267 | (binary_ints = SOME true orelse | 
| 35386 
45a4e19d3ebd
more work on the new monotonicity stuff in Nitpick
 blanchet parents: 
35385diff
changeset | 1268 | exists should_use_binary_ints (nondef_ts @ def_ts)) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1269 | val box = exists (not_equal (SOME false) o snd) boxes | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1270 | val table = | 
| 35386 
45a4e19d3ebd
more work on the new monotonicity stuff in Nitpick
 blanchet parents: 
35385diff
changeset | 1271 | Termtab.empty | 
| 37256 
0dca1ec52999
thread along context instead of theory for typedef lookup
 blanchet parents: 
37253diff
changeset | 1272 | |> box ? fold (add_to_uncurry_table ctxt) (nondef_ts @ def_ts) | 
| 41803 
ef13e3b7cbaf
more work on "fix_datatype_vals" optimization (renamed "preconstruct")
 blanchet parents: 
41793diff
changeset | 1273 | fun do_middle def = | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1274 | binarize ? binarize_nat_and_int_in_term | 
| 36388 | 1275 | #> box ? uncurry_term table | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1276 | #> box ? box_fun_and_pair_in_term hol_ctxt def | 
| 41803 
ef13e3b7cbaf
more work on "fix_datatype_vals" optimization (renamed "preconstruct")
 blanchet parents: 
41793diff
changeset | 1277 | fun do_tail def = | 
| 46102 | 1278 | destroy_set_Collect | 
| 1279 | #> destroy_constrs ? (pull_out_universal_constrs hol_ctxt def | |
| 1280 | #> pull_out_existential_constrs hol_ctxt) | |
| 41994 
c567c860caf6
always destroy constructor patterns, since this seems to be always useful
 blanchet parents: 
41876diff
changeset | 1281 | #> destroy_pulled_out_constrs hol_ctxt def destroy_constrs | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1282 | #> curry_assms | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1283 | #> destroy_universal_equalities | 
| 35220 
2bcdae5f4fdb
added support for nonstandard "nat"s to Nitpick and fixed bugs in binary "nat"s and "int"s
 blanchet parents: 
35190diff
changeset | 1284 | #> destroy_existential_equalities hol_ctxt | 
| 37256 
0dca1ec52999
thread along context instead of theory for typedef lookup
 blanchet parents: 
37253diff
changeset | 1285 | #> simplify_constrs_and_sels ctxt | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1286 | #> distribute_quantifiers | 
| 35280 
54ab4921f826
fixed a few bugs in Nitpick and removed unreferenced variables
 blanchet parents: 
35220diff
changeset | 1287 | #> push_quantifiers_inward | 
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35070diff
changeset | 1288 | #> close_form | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1289 | #> Term.map_abs_vars shortest_name | 
| 41803 
ef13e3b7cbaf
more work on "fix_datatype_vals" optimization (renamed "preconstruct")
 blanchet parents: 
41793diff
changeset | 1290 | val nondef_ts = nondef_ts |> map (do_middle false) | 
| 41875 | 1291 | val need_ts = | 
| 41876 | 1292 | case needs of | 
| 1293 | SOME needs => | |
| 1294 | needs |> map (unfold_defs_in_term hol_ctxt #> do_middle false) | |
| 1295 | | NONE => [] (* FIXME: Implement inference. *) | |
| 41803 
ef13e3b7cbaf
more work on "fix_datatype_vals" optimization (renamed "preconstruct")
 blanchet parents: 
41793diff
changeset | 1296 | val nondef_ts = nondef_ts |> map (do_tail false) | 
| 
ef13e3b7cbaf
more work on "fix_datatype_vals" optimization (renamed "preconstruct")
 blanchet parents: 
41793diff
changeset | 1297 | val def_ts = def_ts |> map (do_middle true #> do_tail true) | 
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1298 | in | 
| 41875 | 1299 | (nondef_ts, def_ts, need_ts, got_all_mono_user_axioms, no_poly_user_axioms, | 
| 1300 | binarize) | |
| 35070 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1301 | end | 
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1302 | |
| 
96136eb6218f
split "nitpick_hol.ML" into two files to make it more manageable;
 blanchet parents: diff
changeset | 1303 | end; |