| author | wenzelm | 
| Mon, 18 Dec 2023 12:02:58 +0100 | |
| changeset 79278 | 8943cc46a66f | 
| parent 79232 | 99bc2dd45111 | 
| child 79382 | 703201dbd413 | 
| permissions | -rw-r--r-- | 
| 9460 | 1 | (* Title: Pure/logic.ML | 
| 2 | Author: Lawrence C Paulson, Cambridge University Computer Laboratory | |
| 29276 | 3 | Author: Makarius | 
| 0 | 4 | |
| 9460 | 5 | Abstract syntax operations of the Pure meta-logic. | 
| 0 | 6 | *) | 
| 7 | ||
| 9460 | 8 | signature LOGIC = | 
| 4345 | 9 | sig | 
| 46217 
7b19666f0e3d
renamed Term.all to Logic.all_const, in accordance to HOLogic.all_const;
 wenzelm parents: 
46215diff
changeset | 10 | val all_const: typ -> term | 
| 27334 | 11 | val all: term -> term -> term | 
| 61655 
f217bbe4e93e
avoid vacuous quantification, as usual for shared variable scope;
 wenzelm parents: 
61654diff
changeset | 12 | val dependent_all_name: string * term -> term -> term | 
| 27334 | 13 | val is_all: term -> bool | 
| 74525 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 wenzelm parents: 
74509diff
changeset | 14 | val dest_all_global: term -> (string * typ) * term | 
| 46218 
ecf6375e2abb
renamed Term.list_all to Logic.list_all, in accordance to HOLogic.list_all;
 wenzelm parents: 
46217diff
changeset | 15 | val list_all: (string * typ) list * term -> term | 
| 60454 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 16 | val all_constraint: (string -> typ option) -> string * string -> term -> term | 
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 17 | val dependent_all_constraint: (string -> typ option) -> string * string -> term -> term | 
| 18181 | 18 | val mk_equals: term * term -> term | 
| 19 | val dest_equals: term -> term * term | |
| 27334 | 20 | val implies: term | 
| 18181 | 21 | val mk_implies: term * term -> term | 
| 22 | val dest_implies: term -> term * term | |
| 23 | val list_implies: term list * term -> term | |
| 24 | val strip_imp_prems: term -> term list | |
| 25 | val strip_imp_concl: term -> term | |
| 26 | val strip_prems: int * term list * term -> term list * term | |
| 21576 | 27 | val count_prems: term -> int | 
| 74509 | 28 | val no_prems: term -> bool | 
| 18181 | 29 | val nth_prem: int * term -> term | 
| 63056 
9b95ae9ec671
defs are closed, which leads to proper auto_bind_facts;
 wenzelm parents: 
61655diff
changeset | 30 | val close_term: (string * term) list -> term -> term | 
| 
9b95ae9ec671
defs are closed, which leads to proper auto_bind_facts;
 wenzelm parents: 
61655diff
changeset | 31 | val close_prop: (string * term) list -> term list -> term -> term | 
| 63063 | 32 | val close_prop_constraint: (string -> typ option) -> | 
| 33 | (string * string) list -> term list -> term -> term | |
| 23418 | 34 | val true_prop: term | 
| 19125 
59b26248547b
simplified Pure conjunction, based on actual const;
 wenzelm parents: 
19103diff
changeset | 35 | val conjunction: term | 
| 18181 | 36 | val mk_conjunction: term * term -> term | 
| 12757 | 37 | val mk_conjunction_list: term list -> term | 
| 23418 | 38 | val mk_conjunction_balanced: term list -> term | 
| 18469 | 39 | val dest_conjunction: term -> term * term | 
| 19425 | 40 | val dest_conjunction_list: term -> term list | 
| 23418 | 41 | val dest_conjunction_balanced: int -> term -> term list | 
| 18469 | 42 | val dest_conjunctions: term -> term list | 
| 18181 | 43 | val strip_horn: term -> term list * term | 
| 21520 | 44 | val mk_type: typ -> term | 
| 18938 | 45 | val dest_type: term -> typ | 
| 21520 | 46 | val type_map: (term -> term) -> typ -> typ | 
| 76785 | 47 | val class_suffix: string | 
| 18938 | 48 | val const_of_class: class -> string | 
| 49 | val class_of_const: string -> class | |
| 31943 
5e960a0780a2
renamed inclass/Inclass to of_class/OfClass, in accordance to of_sort;
 wenzelm parents: 
30554diff
changeset | 50 | val mk_of_class: typ * class -> term | 
| 
5e960a0780a2
renamed inclass/Inclass to of_class/OfClass, in accordance to of_sort;
 wenzelm parents: 
30554diff
changeset | 51 | val dest_of_class: term -> typ * class | 
| 35854 | 52 | val mk_of_sort: typ * sort -> term list | 
| 20630 | 53 | val name_classrel: string * string -> string | 
| 19406 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 54 | val mk_classrel: class * class -> term | 
| 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 55 | val dest_classrel: term -> class * class | 
| 20630 | 56 | val name_arities: arity -> string list | 
| 57 | val name_arity: string * sort list * class -> string | |
| 58 | val mk_arities: arity -> term list | |
| 70384 
8ce08b154aa1
clarified export of sort algebra: avoid logical operations in Isabelle/Scala;
 wenzelm parents: 
69023diff
changeset | 59 | val mk_arity: string * sort list * class -> term | 
| 19406 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 60 | val dest_arity: term -> string * sort list * class | 
| 70811 
785a2112f861
clarified signature -- some operations to support fully explicit proof terms;
 wenzelm parents: 
70438diff
changeset | 61 | val dummy_tfree: sort -> typ | 
| 70436 | 62 | type unconstrain_context = | 
| 63 |    {present_map: (typ * typ) list,
 | |
| 70438 
99024c9c83f6
proper constrains_map -- for shyps that are covered by present variables (amending 251f1fb44ccd);
 wenzelm parents: 
70437diff
changeset | 64 | constraints_map: (sort * typ) list, | 
| 70436 | 65 | atyp_map: typ -> typ, | 
| 70437 | 66 | map_atyps: typ -> typ, | 
| 70435 | 67 | constraints: ((typ * class) * term) list, | 
| 70436 | 68 | outer_constraints: (typ * class) list}; | 
| 77869 | 69 | val unconstrainT: sort list -> term -> unconstrain_context * term | 
| 18181 | 70 | val protectC: term | 
| 71 | val protect: term -> term | |
| 72 | val unprotect: term -> term | |
| 19775 | 73 | val mk_term: term -> term | 
| 74 | val dest_term: term -> term | |
| 18181 | 75 | val occs: term * term -> bool | 
| 76 | val close_form: term -> term | |
| 18938 | 77 | val combound: term * int * int -> term | 
| 78 | val rlist_abs: (string * typ) list * term -> term | |
| 32023 | 79 | val incr_tvar_same: int -> typ Same.operation | 
| 80 | val incr_tvar: int -> typ -> typ | |
| 79232 | 81 |   val incr_indexes_operation: {fixed: string list, Ts: typ list, inc: int, level: int} ->
 | 
| 82 | term Same.operation | |
| 83 | val incr_indexes: typ list * int -> term -> term | |
| 18181 | 84 | val lift_abs: int -> term -> term -> term | 
| 85 | val lift_all: int -> term -> term -> term | |
| 86 | val strip_assums_hyp: term -> term list | |
| 9460 | 87 | val strip_assums_concl: term -> term | 
| 18181 | 88 | val strip_params: term -> (string * typ) list | 
| 23597 | 89 | val has_meta_prems: term -> bool | 
| 18181 | 90 | val flatten_params: int -> term -> term | 
| 45328 | 91 | val list_rename_params: string list -> term -> term | 
| 92 | val assum_pairs: int * term -> (term * term) list | |
| 30554 
73f8bd5f0af8
substantial speedup of assumption and elim-resolution: Logic.assum_problems refrains from eager application of parameters, discriminate via Term.could_unify before invoking full unification (assumes terms in beta-normal form, as do higher term net operations anyway);
 wenzelm parents: 
30364diff
changeset | 93 | val assum_problems: int * term -> (term -> term) * term list * term | 
| 69023 
cef000855cf4
clarified standardization of variables, with proper treatment of local variables;
 wenzelm parents: 
67721diff
changeset | 94 | val bad_schematic: indexname -> string | 
| 
cef000855cf4
clarified standardization of variables, with proper treatment of local variables;
 wenzelm parents: 
67721diff
changeset | 95 | val bad_fixed: string -> string | 
| 35845 
e5980f0ad025
renamed varify/unvarify operations to varify_global/unvarify_global to emphasize that these only work in a global situation;
 wenzelm parents: 
32784diff
changeset | 96 | val varifyT_global: typ -> typ | 
| 
e5980f0ad025
renamed varify/unvarify operations to varify_global/unvarify_global to emphasize that these only work in a global situation;
 wenzelm parents: 
32784diff
changeset | 97 | val unvarifyT_global: typ -> typ | 
| 45344 
e209da839ff4
added Logic.varify_types_global/unvarify_types_global, which avoids somewhat expensive Term.map_types;
 wenzelm parents: 
45328diff
changeset | 98 | val varify_types_global: term -> term | 
| 
e209da839ff4
added Logic.varify_types_global/unvarify_types_global, which avoids somewhat expensive Term.map_types;
 wenzelm parents: 
45328diff
changeset | 99 | val unvarify_types_global: term -> term | 
| 35845 
e5980f0ad025
renamed varify/unvarify operations to varify_global/unvarify_global to emphasize that these only work in a global situation;
 wenzelm parents: 
32784diff
changeset | 100 | val varify_global: term -> term | 
| 
e5980f0ad025
renamed varify/unvarify operations to varify_global/unvarify_global to emphasize that these only work in a global situation;
 wenzelm parents: 
32784diff
changeset | 101 | val unvarify_global: term -> term | 
| 18181 | 102 | val get_goal: term -> int -> term | 
| 103 | val goal_params: term -> int -> term * term list | |
| 104 | val prems_of_goal: term -> int -> term list | |
| 105 | val concl_of_goal: term -> int -> term | |
| 4345 | 106 | end; | 
| 0 | 107 | |
| 1500 | 108 | structure Logic : LOGIC = | 
| 0 | 109 | struct | 
| 398 
41f279b477e2
added mk_type, dest_type, mk_inclass, dest_inclass (for axclasses);
 wenzelm parents: 
210diff
changeset | 110 | |
| 4345 | 111 | |
| 0 | 112 | (*** Abstract syntax operations on the meta-connectives ***) | 
| 113 | ||
| 23238 | 114 | (** all **) | 
| 5041 
a1d0a6d555cd
Goals may now contain assumptions, which are not returned.
 nipkow parents: 
4822diff
changeset | 115 | |
| 56245 | 116 | fun all_const T = Const ("Pure.all", (T --> propT) --> propT);
 | 
| 46217 
7b19666f0e3d
renamed Term.all to Logic.all_const, in accordance to HOLogic.all_const;
 wenzelm parents: 
46215diff
changeset | 117 | |
| 
7b19666f0e3d
renamed Term.all to Logic.all_const, in accordance to HOLogic.all_const;
 wenzelm parents: 
46215diff
changeset | 118 | fun all v t = all_const (Term.fastype_of v) $ lambda v t; | 
| 61655 
f217bbe4e93e
avoid vacuous quantification, as usual for shared variable scope;
 wenzelm parents: 
61654diff
changeset | 119 | |
| 
f217bbe4e93e
avoid vacuous quantification, as usual for shared variable scope;
 wenzelm parents: 
61654diff
changeset | 120 | fun dependent_all_name (x, v) t = | 
| 
f217bbe4e93e
avoid vacuous quantification, as usual for shared variable scope;
 wenzelm parents: 
61654diff
changeset | 121 | let | 
| 
f217bbe4e93e
avoid vacuous quantification, as usual for shared variable scope;
 wenzelm parents: 
61654diff
changeset | 122 | val x' = if x = "" then Term.term_name v else x; | 
| 
f217bbe4e93e
avoid vacuous quantification, as usual for shared variable scope;
 wenzelm parents: 
61654diff
changeset | 123 | val T = Term.fastype_of v; | 
| 
f217bbe4e93e
avoid vacuous quantification, as usual for shared variable scope;
 wenzelm parents: 
61654diff
changeset | 124 | val t' = Term.abstract_over (v, t); | 
| 
f217bbe4e93e
avoid vacuous quantification, as usual for shared variable scope;
 wenzelm parents: 
61654diff
changeset | 125 | in if Term.is_dependent t' then all_const T $ Abs (x', T, t') else t end; | 
| 27334 | 126 | |
| 56245 | 127 | fun is_all (Const ("Pure.all", _) $ Abs _) = true
 | 
| 27334 | 128 | | is_all _ = false; | 
| 129 | ||
| 74525 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 wenzelm parents: 
74509diff
changeset | 130 | fun dest_all_global t = | 
| 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 wenzelm parents: 
74509diff
changeset | 131 | (case t of | 
| 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 wenzelm parents: 
74509diff
changeset | 132 |     Const ("Pure.all", _) $ (u as Abs _) => Term.dest_abs_global u
 | 
| 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 wenzelm parents: 
74509diff
changeset | 133 |   | _ => raise TERM ("dest_all", [t]));
 | 
| 18762 | 134 | |
| 46218 
ecf6375e2abb
renamed Term.list_all to Logic.list_all, in accordance to HOLogic.list_all;
 wenzelm parents: 
46217diff
changeset | 135 | fun list_all ([], t) = t | 
| 
ecf6375e2abb
renamed Term.list_all to Logic.list_all, in accordance to HOLogic.list_all;
 wenzelm parents: 
46217diff
changeset | 136 | | list_all ((a, T) :: vars, t) = all_const T $ Abs (a, T, list_all (vars, t)); | 
| 
ecf6375e2abb
renamed Term.list_all to Logic.list_all, in accordance to HOLogic.list_all;
 wenzelm parents: 
46217diff
changeset | 137 | |
| 18762 | 138 | |
| 60454 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 139 | (* operations before type-inference *) | 
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 140 | |
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 141 | local | 
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 142 | |
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 143 | fun abs_body default_type z tm = | 
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 144 | let | 
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 145 | fun abs lev (Abs (x, T, b)) = Abs (x, T, abs (lev + 1) b) | 
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 146 | | abs lev (t $ u) = abs lev t $ abs lev u | 
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 147 | | abs lev (a as Free (x, T)) = | 
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 148 | if x = z then | 
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 149 | Type.constraint (the_default dummyT (default_type x)) | 
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 150 | (Type.constraint T (Bound lev)) | 
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 151 | else a | 
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 152 | | abs _ a = a; | 
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 153 | in abs 0 (Term.incr_boundvars 1 tm) end; | 
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 154 | |
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 155 | in | 
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 156 | |
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 157 | fun all_constraint default_type (y, z) t = | 
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 158 | all_const dummyT $ Abs (y, dummyT, abs_body default_type z t); | 
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 159 | |
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 160 | fun dependent_all_constraint default_type (y, z) t = | 
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 161 | let val t' = abs_body default_type z t | 
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 162 | in if Term.is_dependent t' then all_const dummyT $ Abs (y, dummyT, t') else t end; | 
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 163 | |
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 164 | end; | 
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 165 | |
| 
a4c6b278f3a7
eliminated slightly odd Element.close_form: toplevel specifications have different policies than proof text elements;
 wenzelm parents: 
59787diff
changeset | 166 | |
| 0 | 167 | (** equality **) | 
| 168 | ||
| 27334 | 169 | fun mk_equals (t, u) = | 
| 170 | let val T = Term.fastype_of t | |
| 56245 | 171 |   in Const ("Pure.eq", T --> T --> propT) $ t $ u end;
 | 
| 0 | 172 | |
| 56245 | 173 | fun dest_equals (Const ("Pure.eq", _) $ t $ u) = (t, u)
 | 
| 20883 | 174 |   | dest_equals t = raise TERM ("dest_equals", [t]);
 | 
| 637 | 175 | |
| 176 | ||
| 70811 
785a2112f861
clarified signature -- some operations to support fully explicit proof terms;
 wenzelm parents: 
70438diff
changeset | 177 | |
| 0 | 178 | (** implies **) | 
| 179 | ||
| 56245 | 180 | val implies = Const ("Pure.imp", propT --> propT --> propT);
 | 
| 27334 | 181 | |
| 20883 | 182 | fun mk_implies (A, B) = implies $ A $ B; | 
| 0 | 183 | |
| 56245 | 184 | fun dest_implies (Const ("Pure.imp", _) $ A $ B) = (A, B)
 | 
| 20883 | 185 |   | dest_implies A = raise TERM ("dest_implies", [A]);
 | 
| 5041 
a1d0a6d555cd
Goals may now contain assumptions, which are not returned.
 nipkow parents: 
4822diff
changeset | 186 | |
| 4822 | 187 | |
| 0 | 188 | (** nested implications **) | 
| 189 | ||
| 67721 | 190 | (* [A1,...,An], B goes to A1\<Longrightarrow>...An\<Longrightarrow>B *) | 
| 18181 | 191 | fun list_implies ([], B) = B | 
| 192 | | list_implies (A::As, B) = implies $ A $ list_implies(As,B); | |
| 0 | 193 | |
| 67721 | 194 | (* A1\<Longrightarrow>...An\<Longrightarrow>B goes to [A1,...,An], where B is not an implication *) | 
| 56245 | 195 | fun strip_imp_prems (Const("Pure.imp", _) $ A $ B) = A :: strip_imp_prems B
 | 
| 0 | 196 | | strip_imp_prems _ = []; | 
| 197 | ||
| 67721 | 198 | (* A1\<Longrightarrow>...An\<Longrightarrow>B goes to B, where B is not an implication *) | 
| 56245 | 199 | fun strip_imp_concl (Const("Pure.imp", _) $ A $ B) = strip_imp_concl B
 | 
| 0 | 200 | | strip_imp_concl A = A : term; | 
| 201 | ||
| 67721 | 202 | (*Strip and return premises: (i, [], A1\<Longrightarrow>...Ai\<Longrightarrow>B) | 
| 9460 | 203 | goes to ([Ai, A(i-1),...,A1] , B) (REVERSED) | 
| 0 | 204 | if i<0 or else i too big then raises TERM*) | 
| 9460 | 205 | fun strip_prems (0, As, B) = (As, B) | 
| 56245 | 206 |   | strip_prems (i, As, Const("Pure.imp", _) $ A $ B) =
 | 
| 9460 | 207 | strip_prems (i-1, A::As, B) | 
| 0 | 208 |   | strip_prems (_, As, A) = raise TERM("strip_prems", A::As);
 | 
| 209 | ||
| 16130 | 210 | (*Count premises -- quicker than (length o strip_prems) *) | 
| 56245 | 211 | fun count_prems (Const ("Pure.imp", _) $ _ $ B) = 1 + count_prems B
 | 
| 21576 | 212 | | count_prems _ = 0; | 
| 0 | 213 | |
| 74509 | 214 | fun no_prems (Const ("Pure.imp", _) $ _ $ _) = false
 | 
| 215 | | no_prems _ = true; | |
| 216 | ||
| 67721 | 217 | (*Select Ai from A1\<Longrightarrow>...Ai\<Longrightarrow>B*) | 
| 56245 | 218 | fun nth_prem (1, Const ("Pure.imp", _) $ A $ _) = A
 | 
| 219 |   | nth_prem (i, Const ("Pure.imp", _) $ _ $ B) = nth_prem (i - 1, B)
 | |
| 16130 | 220 |   | nth_prem (_, A) = raise TERM ("nth_prem", [A]);
 | 
| 221 | ||
| 13659 
3cf622f6b0b2
Removed obsolete functions dealing with flex-flex constraints.
 berghofe parents: 
12902diff
changeset | 222 | (*strip a proof state (Horn clause): | 
| 67721 | 223 | B1 \<Longrightarrow> ... Bn \<Longrightarrow> C goes to ([B1, ..., Bn], C) *) | 
| 13659 
3cf622f6b0b2
Removed obsolete functions dealing with flex-flex constraints.
 berghofe parents: 
12902diff
changeset | 224 | fun strip_horn A = (strip_imp_prems A, strip_imp_concl A); | 
| 
3cf622f6b0b2
Removed obsolete functions dealing with flex-flex constraints.
 berghofe parents: 
12902diff
changeset | 225 | |
| 4822 | 226 | |
| 63063 | 227 | (* close -- omit vacuous quantifiers *) | 
| 63056 
9b95ae9ec671
defs are closed, which leads to proper auto_bind_facts;
 wenzelm parents: 
61655diff
changeset | 228 | |
| 
9b95ae9ec671
defs are closed, which leads to proper auto_bind_facts;
 wenzelm parents: 
61655diff
changeset | 229 | val close_term = fold_rev Term.dependent_lambda_name; | 
| 63063 | 230 | |
| 231 | fun close_prop xs As B = | |
| 232 | fold_rev dependent_all_name xs (list_implies (As, B)); | |
| 233 | ||
| 234 | fun close_prop_constraint default_type xs As B = | |
| 235 | fold_rev (dependent_all_constraint default_type) xs (list_implies (As, B)); | |
| 63056 
9b95ae9ec671
defs are closed, which leads to proper auto_bind_facts;
 wenzelm parents: 
61655diff
changeset | 236 | |
| 23418 | 237 | |
| 12137 | 238 | (** conjunction **) | 
| 239 | ||
| 46217 
7b19666f0e3d
renamed Term.all to Logic.all_const, in accordance to HOLogic.all_const;
 wenzelm parents: 
46215diff
changeset | 240 | val true_prop = all_const propT $ Abs ("dummy", propT, mk_implies (Bound 0, Bound 0));
 | 
| 26424 | 241 | val conjunction = Const ("Pure.conjunction", propT --> propT --> propT);
 | 
| 19125 
59b26248547b
simplified Pure conjunction, based on actual const;
 wenzelm parents: 
19103diff
changeset | 242 | |
| 23418 | 243 | |
| 28856 
5e009a80fe6d
Pure syntax: more coherent treatment of aprop, permanent TERM and &&&;
 wenzelm parents: 
28448diff
changeset | 244 | (*A &&& B*) | 
| 19125 
59b26248547b
simplified Pure conjunction, based on actual const;
 wenzelm parents: 
19103diff
changeset | 245 | fun mk_conjunction (A, B) = conjunction $ A $ B; | 
| 12137 | 246 | |
| 28856 
5e009a80fe6d
Pure syntax: more coherent treatment of aprop, permanent TERM and &&&;
 wenzelm parents: 
28448diff
changeset | 247 | (*A &&& B &&& C -- improper*) | 
| 23418 | 248 | fun mk_conjunction_list [] = true_prop | 
| 12757 | 249 | | mk_conjunction_list ts = foldr1 mk_conjunction ts; | 
| 12137 | 250 | |
| 28856 
5e009a80fe6d
Pure syntax: more coherent treatment of aprop, permanent TERM and &&&;
 wenzelm parents: 
28448diff
changeset | 251 | (*(A &&& B) &&& (C &&& D) -- balanced*) | 
| 23418 | 252 | fun mk_conjunction_balanced [] = true_prop | 
| 32765 | 253 | | mk_conjunction_balanced ts = Balanced_Tree.make mk_conjunction ts; | 
| 23418 | 254 | |
| 18499 | 255 | |
| 28856 
5e009a80fe6d
Pure syntax: more coherent treatment of aprop, permanent TERM and &&&;
 wenzelm parents: 
28448diff
changeset | 256 | (*A &&& B*) | 
| 26424 | 257 | fun dest_conjunction (Const ("Pure.conjunction", _) $ A $ B) = (A, B)
 | 
| 18469 | 258 |   | dest_conjunction t = raise TERM ("dest_conjunction", [t]);
 | 
| 259 | ||
| 28856 
5e009a80fe6d
Pure syntax: more coherent treatment of aprop, permanent TERM and &&&;
 wenzelm parents: 
28448diff
changeset | 260 | (*A &&& B &&& C -- improper*) | 
| 19425 | 261 | fun dest_conjunction_list t = | 
| 262 | (case try dest_conjunction t of | |
| 263 | NONE => [t] | |
| 264 | | SOME (A, B) => A :: dest_conjunction_list B); | |
| 265 | ||
| 28856 
5e009a80fe6d
Pure syntax: more coherent treatment of aprop, permanent TERM and &&&;
 wenzelm parents: 
28448diff
changeset | 266 | (*(A &&& B) &&& (C &&& D) -- balanced*) | 
| 23418 | 267 | fun dest_conjunction_balanced 0 _ = [] | 
| 32765 | 268 | | dest_conjunction_balanced n t = Balanced_Tree.dest dest_conjunction n t; | 
| 23418 | 269 | |
| 28856 
5e009a80fe6d
Pure syntax: more coherent treatment of aprop, permanent TERM and &&&;
 wenzelm parents: 
28448diff
changeset | 270 | (*((A &&& B) &&& C) &&& D &&& E -- flat*) | 
| 18469 | 271 | fun dest_conjunctions t = | 
| 272 | (case try dest_conjunction t of | |
| 273 | NONE => [t] | |
| 274 | | SOME (A, B) => dest_conjunctions A @ dest_conjunctions B); | |
| 275 | ||
| 276 | ||
| 12137 | 277 | |
| 398 
41f279b477e2
added mk_type, dest_type, mk_inclass, dest_inclass (for axclasses);
 wenzelm parents: 
210diff
changeset | 278 | (** types as terms **) | 
| 
41f279b477e2
added mk_type, dest_type, mk_inclass, dest_inclass (for axclasses);
 wenzelm parents: 
210diff
changeset | 279 | |
| 56243 | 280 | fun mk_type ty = Const ("Pure.type", Term.itselfT ty);
 | 
| 398 
41f279b477e2
added mk_type, dest_type, mk_inclass, dest_inclass (for axclasses);
 wenzelm parents: 
210diff
changeset | 281 | |
| 56243 | 282 | fun dest_type (Const ("Pure.type", Type ("itself", [ty]))) = ty
 | 
| 398 
41f279b477e2
added mk_type, dest_type, mk_inclass, dest_inclass (for axclasses);
 wenzelm parents: 
210diff
changeset | 283 |   | dest_type t = raise TERM ("dest_type", [t]);
 | 
| 
41f279b477e2
added mk_type, dest_type, mk_inclass, dest_inclass (for axclasses);
 wenzelm parents: 
210diff
changeset | 284 | |
| 21520 | 285 | fun type_map f = dest_type o f o mk_type; | 
| 286 | ||
| 4822 | 287 | |
| 19406 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 288 | |
| 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 289 | (** type classes **) | 
| 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 290 | |
| 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 291 | (* const names *) | 
| 398 
41f279b477e2
added mk_type, dest_type, mk_inclass, dest_inclass (for axclasses);
 wenzelm parents: 
210diff
changeset | 292 | |
| 76785 | 293 | val class_suffix = "_class"; | 
| 18938 | 294 | |
| 76785 | 295 | val const_of_class = suffix class_suffix; | 
| 19406 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 296 | |
| 76785 | 297 | fun class_of_const c = unsuffix class_suffix c | 
| 18938 | 298 |   handle Fail _ => raise TERM ("class_of_const: bad name " ^ quote c, []);
 | 
| 299 | ||
| 19406 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 300 | |
| 35854 | 301 | (* class/sort membership *) | 
| 19406 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 302 | |
| 31943 
5e960a0780a2
renamed inclass/Inclass to of_class/OfClass, in accordance to of_sort;
 wenzelm parents: 
30554diff
changeset | 303 | fun mk_of_class (ty, c) = | 
| 19391 | 304 | Const (const_of_class c, Term.itselfT ty --> propT) $ mk_type ty; | 
| 398 
41f279b477e2
added mk_type, dest_type, mk_inclass, dest_inclass (for axclasses);
 wenzelm parents: 
210diff
changeset | 305 | |
| 32784 | 306 | fun dest_of_class (Const (c_class, _) $ ty) = (dest_type ty, class_of_const c_class) | 
| 31943 
5e960a0780a2
renamed inclass/Inclass to of_class/OfClass, in accordance to of_sort;
 wenzelm parents: 
30554diff
changeset | 307 |   | dest_of_class t = raise TERM ("dest_of_class", [t]);
 | 
| 398 
41f279b477e2
added mk_type, dest_type, mk_inclass, dest_inclass (for axclasses);
 wenzelm parents: 
210diff
changeset | 308 | |
| 35854 | 309 | fun mk_of_sort (ty, S) = map (fn c => mk_of_class (ty, c)) S; | 
| 310 | ||
| 0 | 311 | |
| 19406 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 312 | (* class relations *) | 
| 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 313 | |
| 20630 | 314 | fun name_classrel (c1, c2) = | 
| 30364 
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
 wenzelm parents: 
30280diff
changeset | 315 | Long_Name.base_name c1 ^ "_" ^ Long_Name.base_name c2; | 
| 20630 | 316 | |
| 31943 
5e960a0780a2
renamed inclass/Inclass to of_class/OfClass, in accordance to of_sort;
 wenzelm parents: 
30554diff
changeset | 317 | fun mk_classrel (c1, c2) = mk_of_class (Term.aT [c1], c2); | 
| 19406 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 318 | |
| 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 319 | fun dest_classrel tm = | 
| 31943 
5e960a0780a2
renamed inclass/Inclass to of_class/OfClass, in accordance to of_sort;
 wenzelm parents: 
30554diff
changeset | 320 | (case dest_of_class tm of | 
| 19406 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 321 | (TVar (_, [c1]), c2) => (c1, c2) | 
| 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 322 |   | _ => raise TERM ("dest_classrel", [tm]));
 | 
| 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 323 | |
| 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 324 | |
| 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 325 | (* type arities *) | 
| 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 326 | |
| 20630 | 327 | fun name_arities (t, _, S) = | 
| 30364 
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
 wenzelm parents: 
30280diff
changeset | 328 | let val b = Long_Name.base_name t | 
| 
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
 wenzelm parents: 
30280diff
changeset | 329 | in S |> map (fn c => Long_Name.base_name c ^ "_" ^ b) end; | 
| 20630 | 330 | |
| 331 | fun name_arity (t, dom, c) = hd (name_arities (t, dom, [c])); | |
| 332 | ||
| 19406 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 333 | fun mk_arities (t, Ss, S) = | 
| 43329 
84472e198515
tuned signature: Name.invent and Name.invent_names;
 wenzelm parents: 
37230diff
changeset | 334 | let val T = Type (t, ListPair.map TFree (Name.invent Name.context Name.aT (length Ss), Ss)) | 
| 31943 
5e960a0780a2
renamed inclass/Inclass to of_class/OfClass, in accordance to of_sort;
 wenzelm parents: 
30554diff
changeset | 335 | in map (fn c => mk_of_class (T, c)) S end; | 
| 19406 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 336 | |
| 70384 
8ce08b154aa1
clarified export of sort algebra: avoid logical operations in Isabelle/Scala;
 wenzelm parents: 
69023diff
changeset | 337 | fun mk_arity (t, Ss, c) = the_single (mk_arities (t, Ss, [c])); | 
| 
8ce08b154aa1
clarified export of sort algebra: avoid logical operations in Isabelle/Scala;
 wenzelm parents: 
69023diff
changeset | 338 | |
| 19406 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 339 | fun dest_arity tm = | 
| 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 340 | let | 
| 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 341 |     fun err () = raise TERM ("dest_arity", [tm]);
 | 
| 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 342 | |
| 31943 
5e960a0780a2
renamed inclass/Inclass to of_class/OfClass, in accordance to of_sort;
 wenzelm parents: 
30554diff
changeset | 343 | val (ty, c) = dest_of_class tm; | 
| 19406 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 344 | val (t, tvars) = | 
| 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 345 | (case ty of | 
| 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 346 | Type (t, tys) => (t, map dest_TVar tys handle TYPE _ => err ()) | 
| 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 347 | | _ => err ()); | 
| 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 348 | val Ss = | 
| 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 349 | if has_duplicates (eq_fst (op =)) tvars then err () | 
| 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 350 | else map snd tvars; | 
| 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 351 | in (t, Ss, c) end; | 
| 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 352 | |
| 
410b9d9bf9a1
added mk_classrel, dest_classrel, mk_arities, dest_arity (from axclass.ML);
 wenzelm parents: 
19391diff
changeset | 353 | |
| 36767 
d0095729e1f1
added Logic.unconstrain_allTs, based on calculations_for_thm_proof by krauss/schropp, but treat type variables uniformly as in strip_shyps (in thm.ML) or stripped_sorts (in more_thm.ML);
 wenzelm parents: 
35854diff
changeset | 354 | (* internalized sort constraints *) | 
| 
d0095729e1f1
added Logic.unconstrain_allTs, based on calculations_for_thm_proof by krauss/schropp, but treat type variables uniformly as in strip_shyps (in thm.ML) or stripped_sorts (in more_thm.ML);
 wenzelm parents: 
35854diff
changeset | 355 | |
| 70811 
785a2112f861
clarified signature -- some operations to support fully explicit proof terms;
 wenzelm parents: 
70438diff
changeset | 356 | fun dummy_tfree S = TFree ("'dummy", S);
 | 
| 
785a2112f861
clarified signature -- some operations to support fully explicit proof terms;
 wenzelm parents: 
70438diff
changeset | 357 | |
| 70436 | 358 | type unconstrain_context = | 
| 359 |  {present_map: (typ * typ) list,
 | |
| 70438 
99024c9c83f6
proper constrains_map -- for shyps that are covered by present variables (amending 251f1fb44ccd);
 wenzelm parents: 
70437diff
changeset | 360 | constraints_map: (sort * typ) list, | 
| 70436 | 361 | atyp_map: typ -> typ, | 
| 70437 | 362 | map_atyps: typ -> typ, | 
| 70436 | 363 | constraints: ((typ * class) * term) list, | 
| 364 | outer_constraints: (typ * class) list}; | |
| 365 | ||
| 36768 
46be86127972
just one version of Thm.unconstrainT, which affects all variables;
 wenzelm parents: 
36767diff
changeset | 366 | fun unconstrainT shyps prop = | 
| 36767 
d0095729e1f1
added Logic.unconstrain_allTs, based on calculations_for_thm_proof by krauss/schropp, but treat type variables uniformly as in strip_shyps (in thm.ML) or stripped_sorts (in more_thm.ML);
 wenzelm parents: 
35854diff
changeset | 367 | let | 
| 
d0095729e1f1
added Logic.unconstrain_allTs, based on calculations_for_thm_proof by krauss/schropp, but treat type variables uniformly as in strip_shyps (in thm.ML) or stripped_sorts (in more_thm.ML);
 wenzelm parents: 
35854diff
changeset | 368 | val present = rev ((fold_types o fold_atyps_sorts) (insert (eq_fst op =)) prop []); | 
| 77869 | 369 | val extra = fold (Sorts.remove_sort o #2) present shyps; | 
| 36767 
d0095729e1f1
added Logic.unconstrain_allTs, based on calculations_for_thm_proof by krauss/schropp, but treat type variables uniformly as in strip_shyps (in thm.ML) or stripped_sorts (in more_thm.ML);
 wenzelm parents: 
35854diff
changeset | 370 | |
| 
d0095729e1f1
added Logic.unconstrain_allTs, based on calculations_for_thm_proof by krauss/schropp, but treat type variables uniformly as in strip_shyps (in thm.ML) or stripped_sorts (in more_thm.ML);
 wenzelm parents: 
35854diff
changeset | 371 | val n = length present; | 
| 43329 
84472e198515
tuned signature: Name.invent and Name.invent_names;
 wenzelm parents: 
37230diff
changeset | 372 | val (names1, names2) = Name.invent Name.context Name.aT (n + length extra) |> chop n; | 
| 36767 
d0095729e1f1
added Logic.unconstrain_allTs, based on calculations_for_thm_proof by krauss/schropp, but treat type variables uniformly as in strip_shyps (in thm.ML) or stripped_sorts (in more_thm.ML);
 wenzelm parents: 
35854diff
changeset | 373 | |
| 
d0095729e1f1
added Logic.unconstrain_allTs, based on calculations_for_thm_proof by krauss/schropp, but treat type variables uniformly as in strip_shyps (in thm.ML) or stripped_sorts (in more_thm.ML);
 wenzelm parents: 
35854diff
changeset | 374 | val present_map = | 
| 
d0095729e1f1
added Logic.unconstrain_allTs, based on calculations_for_thm_proof by krauss/schropp, but treat type variables uniformly as in strip_shyps (in thm.ML) or stripped_sorts (in more_thm.ML);
 wenzelm parents: 
35854diff
changeset | 375 | map2 (fn (T, S) => fn a => (T, TVar ((a, 0), S))) present names1; | 
| 70438 
99024c9c83f6
proper constrains_map -- for shyps that are covered by present variables (amending 251f1fb44ccd);
 wenzelm parents: 
70437diff
changeset | 376 | val constraints_map = | 
| 
99024c9c83f6
proper constrains_map -- for shyps that are covered by present variables (amending 251f1fb44ccd);
 wenzelm parents: 
70437diff
changeset | 377 | map2 (fn (_, S) => fn a => (S, TVar ((a, 0), S))) present names1 @ | 
| 36767 
d0095729e1f1
added Logic.unconstrain_allTs, based on calculations_for_thm_proof by krauss/schropp, but treat type variables uniformly as in strip_shyps (in thm.ML) or stripped_sorts (in more_thm.ML);
 wenzelm parents: 
35854diff
changeset | 378 | map2 (fn S => fn a => (S, TVar ((a, 0), S))) extra names2; | 
| 
d0095729e1f1
added Logic.unconstrain_allTs, based on calculations_for_thm_proof by krauss/schropp, but treat type variables uniformly as in strip_shyps (in thm.ML) or stripped_sorts (in more_thm.ML);
 wenzelm parents: 
35854diff
changeset | 379 | |
| 
d0095729e1f1
added Logic.unconstrain_allTs, based on calculations_for_thm_proof by krauss/schropp, but treat type variables uniformly as in strip_shyps (in thm.ML) or stripped_sorts (in more_thm.ML);
 wenzelm parents: 
35854diff
changeset | 380 | fun atyp_map T = | 
| 
d0095729e1f1
added Logic.unconstrain_allTs, based on calculations_for_thm_proof by krauss/schropp, but treat type variables uniformly as in strip_shyps (in thm.ML) or stripped_sorts (in more_thm.ML);
 wenzelm parents: 
35854diff
changeset | 381 | (case AList.lookup (op =) present_map T of | 
| 
d0095729e1f1
added Logic.unconstrain_allTs, based on calculations_for_thm_proof by krauss/schropp, but treat type variables uniformly as in strip_shyps (in thm.ML) or stripped_sorts (in more_thm.ML);
 wenzelm parents: 
35854diff
changeset | 382 | SOME U => U | 
| 
d0095729e1f1
added Logic.unconstrain_allTs, based on calculations_for_thm_proof by krauss/schropp, but treat type variables uniformly as in strip_shyps (in thm.ML) or stripped_sorts (in more_thm.ML);
 wenzelm parents: 
35854diff
changeset | 383 | | NONE => | 
| 70438 
99024c9c83f6
proper constrains_map -- for shyps that are covered by present variables (amending 251f1fb44ccd);
 wenzelm parents: 
70437diff
changeset | 384 | (case AList.lookup (op =) constraints_map (Type.sort_of_atyp T) of | 
| 36767 
d0095729e1f1
added Logic.unconstrain_allTs, based on calculations_for_thm_proof by krauss/schropp, but treat type variables uniformly as in strip_shyps (in thm.ML) or stripped_sorts (in more_thm.ML);
 wenzelm parents: 
35854diff
changeset | 385 | SOME U => U | 
| 70811 
785a2112f861
clarified signature -- some operations to support fully explicit proof terms;
 wenzelm parents: 
70438diff
changeset | 386 |           | NONE => raise TYPE ("Dangling type variable ", [T], [prop])));
 | 
| 
785a2112f861
clarified signature -- some operations to support fully explicit proof terms;
 wenzelm parents: 
70438diff
changeset | 387 | |
| 
785a2112f861
clarified signature -- some operations to support fully explicit proof terms;
 wenzelm parents: 
70438diff
changeset | 388 | val map_atyps = Term.map_atyps (Type.strip_sorts o atyp_map); | 
| 36767 
d0095729e1f1
added Logic.unconstrain_allTs, based on calculations_for_thm_proof by krauss/schropp, but treat type variables uniformly as in strip_shyps (in thm.ML) or stripped_sorts (in more_thm.ML);
 wenzelm parents: 
35854diff
changeset | 389 | |
| 
d0095729e1f1
added Logic.unconstrain_allTs, based on calculations_for_thm_proof by krauss/schropp, but treat type variables uniformly as in strip_shyps (in thm.ML) or stripped_sorts (in more_thm.ML);
 wenzelm parents: 
35854diff
changeset | 390 | val constraints = | 
| 70436 | 391 | constraints_map |> maps (fn (_, T as TVar (ai, S)) => | 
| 392 | map (fn c => ((T, c), mk_of_class (TVar (ai, []), c))) S); | |
| 36767 
d0095729e1f1
added Logic.unconstrain_allTs, based on calculations_for_thm_proof by krauss/schropp, but treat type variables uniformly as in strip_shyps (in thm.ML) or stripped_sorts (in more_thm.ML);
 wenzelm parents: 
35854diff
changeset | 393 | |
| 37230 
7b548f137276
outer_constraints with original variable names, to ensure that argsP is consistent with args
 berghofe parents: 
36768diff
changeset | 394 | val outer_constraints = | 
| 70811 
785a2112f861
clarified signature -- some operations to support fully explicit proof terms;
 wenzelm parents: 
70438diff
changeset | 395 | maps (fn (T, S) => map (pair T) S) (present @ map (`dummy_tfree) extra); | 
| 37230 
7b548f137276
outer_constraints with original variable names, to ensure that argsP is consistent with args
 berghofe parents: 
36768diff
changeset | 396 | |
| 70437 | 397 | val ucontext = | 
| 70436 | 398 |      {present_map = present_map,
 | 
| 70438 
99024c9c83f6
proper constrains_map -- for shyps that are covered by present variables (amending 251f1fb44ccd);
 wenzelm parents: 
70437diff
changeset | 399 | constraints_map = constraints_map, | 
| 70436 | 400 | atyp_map = atyp_map, | 
| 70437 | 401 | map_atyps = map_atyps, | 
| 70436 | 402 | constraints = constraints, | 
| 403 | outer_constraints = outer_constraints}; | |
| 404 | val prop' = prop | |
| 70437 | 405 | |> Term.map_types map_atyps | 
| 406 | |> curry list_implies (map #2 constraints); | |
| 407 | in (ucontext, prop') end; | |
| 36767 
d0095729e1f1
added Logic.unconstrain_allTs, based on calculations_for_thm_proof by krauss/schropp, but treat type variables uniformly as in strip_shyps (in thm.ML) or stripped_sorts (in more_thm.ML);
 wenzelm parents: 
35854diff
changeset | 408 | |
| 
d0095729e1f1
added Logic.unconstrain_allTs, based on calculations_for_thm_proof by krauss/schropp, but treat type variables uniformly as in strip_shyps (in thm.ML) or stripped_sorts (in more_thm.ML);
 wenzelm parents: 
35854diff
changeset | 409 | |
| 18938 | 410 | |
| 28448 | 411 | (** protected propositions and embedded terms **) | 
| 9460 | 412 | |
| 56244 | 413 | val protectC = Const ("Pure.prop", propT --> propT);
 | 
| 18029 
19f1ad18bece
renamed Goal constant to prop, more general protect/unprotect interfaces;
 wenzelm parents: 
17120diff
changeset | 414 | fun protect t = protectC $ t; | 
| 9460 | 415 | |
| 56244 | 416 | fun unprotect (Const ("Pure.prop", _) $ t) = t
 | 
| 18029 
19f1ad18bece
renamed Goal constant to prop, more general protect/unprotect interfaces;
 wenzelm parents: 
17120diff
changeset | 417 |   | unprotect t = raise TERM ("unprotect", [t]);
 | 
| 9460 | 418 | |
| 419 | ||
| 26424 | 420 | fun mk_term t = Const ("Pure.term", Term.fastype_of t --> propT) $ t;
 | 
| 19775 | 421 | |
| 26424 | 422 | fun dest_term (Const ("Pure.term", _) $ t) = t
 | 
| 19775 | 423 |   | dest_term t = raise TERM ("dest_term", [t]);
 | 
| 424 | ||
| 425 | ||
| 18181 | 426 | |
| 0 | 427 | (*** Low-level term operations ***) | 
| 428 | ||
| 429 | (*Does t occur in u? Or is alpha-convertible to u? | |
| 430 | The term t must contain no loose bound variables*) | |
| 16846 | 431 | fun occs (t, u) = exists_subterm (fn s => t aconv s) u; | 
| 0 | 432 | |
| 433 | (*Close up a formula over all free variables by quantification*) | |
| 74281 | 434 | fun close_form A = | 
| 435 | fold_rev (all o Free) (Frees.build (Frees.add_frees A) |> Frees.list_set) A; | |
| 0 | 436 | |
| 437 | ||
| 18938 | 438 | |
| 0 | 439 | (*** Specialized operations for resolution... ***) | 
| 440 | ||
| 18938 | 441 | (*computes t(Bound(n+k-1),...,Bound(n)) *) | 
| 442 | fun combound (t, n, k) = | |
| 443 | if k>0 then combound (t,n+1,k-1) $ (Bound n) else t; | |
| 444 | ||
| 67721 | 445 | (* ([xn,...,x1], t) goes to \<lambda>x1 ... xn. t *) | 
| 18938 | 446 | fun rlist_abs ([], body) = body | 
| 447 | | rlist_abs ((a,T)::pairs, body) = rlist_abs(pairs, Abs(a, T, body)); | |
| 448 | ||
| 32026 | 449 | fun incr_tvar_same 0 = Same.same | 
| 79232 | 450 | | incr_tvar_same inc = Term_Subst.map_atypsT_same | 
| 451 | (fn TVar ((a, i), S) => TVar ((a, i + inc), S) | |
| 32026 | 452 | | _ => raise Same.SAME); | 
| 16879 
b81d3f2ee565
incr_tvar (from term.ML), incr_indexes: avoid garbage;
 wenzelm parents: 
16862diff
changeset | 453 | |
| 79232 | 454 | fun incr_tvar inc = Same.commit (incr_tvar_same inc); | 
| 32023 | 455 | |
| 0 | 456 | (*For all variables in the term, increment indexnames and lift over the Us | 
| 457 | result is ?Gidx(B.(lev+n-1),...,B.lev) where lev is abstraction level *) | |
| 79232 | 458 | fun incr_indexes_operation {fixed, Ts, inc, level} =
 | 
| 459 | if null fixed andalso null Ts andalso inc = 0 then Same.same | |
| 460 | else | |
| 461 | let | |
| 462 | val n = length Ts; | |
| 463 | val incrT = incr_tvar_same inc; | |
| 16879 
b81d3f2ee565
incr_tvar (from term.ML), incr_indexes: avoid garbage;
 wenzelm parents: 
16862diff
changeset | 464 | |
| 79232 | 465 | fun incr lev (Var ((x, i), T)) = | 
| 466 | combound (Var ((x, i + inc), Ts ---> Same.commit incrT T), lev, n) | |
| 467 | | incr lev (Free (x, T)) = | |
| 468 | if member (op =) fixed x then | |
| 469 | combound (Free (x, Ts ---> Same.commit incrT T), lev, n) | |
| 470 | else Free (x, incrT T) | |
| 471 | | incr lev (Abs (x, T, t)) = | |
| 472 | (Abs (x, incrT T, Same.commit (incr (lev + 1)) t) | |
| 473 | handle Same.SAME => Abs (x, T, incr (lev + 1) t)) | |
| 474 | | incr lev (t $ u) = | |
| 475 | (incr lev t $ Same.commit (incr lev) u | |
| 476 | handle Same.SAME => t $ incr lev u) | |
| 477 | | incr _ (Const (c, T)) = Const (c, incrT T) | |
| 478 | | incr _ (Bound _) = raise Same.SAME; | |
| 479 | in incr level end; | |
| 32026 | 480 | |
| 79232 | 481 | fun incr_indexes (Ts, inc) = | 
| 482 | if null Ts andalso inc = 0 then I | |
| 483 |   else Same.commit (incr_indexes_operation {fixed = [], Ts = Ts, inc = inc, level = 0});
 | |
| 16879 
b81d3f2ee565
incr_tvar (from term.ML), incr_indexes: avoid garbage;
 wenzelm parents: 
16862diff
changeset | 484 | |
| 0 | 485 | |
| 18248 | 486 | (* Lifting functions from subgoal and increment: | 
| 18029 
19f1ad18bece
renamed Goal constant to prop, more general protect/unprotect interfaces;
 wenzelm parents: 
17120diff
changeset | 487 | lift_abs operates on terms | 
| 
19f1ad18bece
renamed Goal constant to prop, more general protect/unprotect interfaces;
 wenzelm parents: 
17120diff
changeset | 488 | lift_all operates on propositions *) | 
| 
19f1ad18bece
renamed Goal constant to prop, more general protect/unprotect interfaces;
 wenzelm parents: 
17120diff
changeset | 489 | |
| 
19f1ad18bece
renamed Goal constant to prop, more general protect/unprotect interfaces;
 wenzelm parents: 
17120diff
changeset | 490 | fun lift_abs inc = | 
| 
19f1ad18bece
renamed Goal constant to prop, more general protect/unprotect interfaces;
 wenzelm parents: 
17120diff
changeset | 491 | let | 
| 56245 | 492 |     fun lift Ts (Const ("Pure.imp", _) $ _ $ B) t = lift Ts B t
 | 
| 493 |       | lift Ts (Const ("Pure.all", _) $ Abs (a, T, B)) t = Abs (a, T, lift (T :: Ts) B t)
 | |
| 79232 | 494 | | lift Ts _ t = incr_indexes (rev Ts, inc) t; | 
| 18029 
19f1ad18bece
renamed Goal constant to prop, more general protect/unprotect interfaces;
 wenzelm parents: 
17120diff
changeset | 495 | in lift [] end; | 
| 
19f1ad18bece
renamed Goal constant to prop, more general protect/unprotect interfaces;
 wenzelm parents: 
17120diff
changeset | 496 | |
| 
19f1ad18bece
renamed Goal constant to prop, more general protect/unprotect interfaces;
 wenzelm parents: 
17120diff
changeset | 497 | fun lift_all inc = | 
| 
19f1ad18bece
renamed Goal constant to prop, more general protect/unprotect interfaces;
 wenzelm parents: 
17120diff
changeset | 498 | let | 
| 56245 | 499 |     fun lift Ts ((c as Const ("Pure.imp", _)) $ A $ B) t = c $ A $ lift Ts B t
 | 
| 500 |       | lift Ts ((c as Const ("Pure.all", _)) $ Abs (a, T, B)) t = c $ Abs (a, T, lift (T :: Ts) B t)
 | |
| 79232 | 501 | | lift Ts _ t = incr_indexes (rev Ts, inc) t; | 
| 18029 
19f1ad18bece
renamed Goal constant to prop, more general protect/unprotect interfaces;
 wenzelm parents: 
17120diff
changeset | 502 | in lift [] end; | 
| 0 | 503 | |
| 504 | (*Strips assumptions in goal, yielding list of hypotheses. *) | |
| 21016 
430b35c9cd27
Repaired strip_assums_hyp (now also works for goals not
 berghofe parents: 
20883diff
changeset | 505 | fun strip_assums_hyp B = | 
| 
430b35c9cd27
Repaired strip_assums_hyp (now also works for goals not
 berghofe parents: 
20883diff
changeset | 506 | let | 
| 56245 | 507 |     fun strip Hs (Const ("Pure.imp", _) $ H $ B) = strip (H :: Hs) B
 | 
| 508 |       | strip Hs (Const ("Pure.all", _) $ Abs (a, T, t)) =
 | |
| 21016 
430b35c9cd27
Repaired strip_assums_hyp (now also works for goals not
 berghofe parents: 
20883diff
changeset | 509 | strip (map (incr_boundvars 1) Hs) t | 
| 
430b35c9cd27
Repaired strip_assums_hyp (now also works for goals not
 berghofe parents: 
20883diff
changeset | 510 | | strip Hs B = rev Hs | 
| 
430b35c9cd27
Repaired strip_assums_hyp (now also works for goals not
 berghofe parents: 
20883diff
changeset | 511 | in strip [] B end; | 
| 0 | 512 | |
| 513 | (*Strips assumptions in goal, yielding conclusion. *) | |
| 56245 | 514 | fun strip_assums_concl (Const("Pure.imp", _) $ H $ B) = strip_assums_concl B
 | 
| 60705 | 515 |   | strip_assums_concl (Const("Pure.all", _) $ Abs (a, T, t)) = strip_assums_concl t
 | 
| 0 | 516 | | strip_assums_concl B = B; | 
| 517 | ||
| 518 | (*Make a list of all the parameters in a subgoal, even if nested*) | |
| 56245 | 519 | fun strip_params (Const("Pure.imp", _) $ H $ B) = strip_params B
 | 
| 60705 | 520 |   | strip_params (Const("Pure.all", _) $ Abs (a, T, t)) = (a, T) :: strip_params t
 | 
| 0 | 521 | | strip_params B = []; | 
| 522 | ||
| 23597 | 523 | (*test for nested meta connectives in prems*) | 
| 524 | val has_meta_prems = | |
| 9667 | 525 | let | 
| 56245 | 526 |     fun is_meta (Const ("Pure.eq", _) $ _ $ _) = true
 | 
| 527 |       | is_meta (Const ("Pure.imp", _) $ _ $ _) = true
 | |
| 528 |       | is_meta (Const ("Pure.all", _) $ _) = true
 | |
| 9667 | 529 | | is_meta _ = false; | 
| 56245 | 530 |     fun ex_meta (Const ("Pure.imp", _) $ A $ B) = is_meta A orelse ex_meta B
 | 
| 531 |       | ex_meta (Const ("Pure.all", _) $ Abs (_, _, B)) = ex_meta B
 | |
| 23597 | 532 | | ex_meta _ = false; | 
| 533 | in ex_meta end; | |
| 9483 | 534 | |
| 0 | 535 | (*Removes the parameters from a subgoal and renumber bvars in hypotheses, | 
| 9460 | 536 | where j is the total number of parameters (precomputed) | 
| 0 | 537 | If n>0 then deletes assumption n. *) | 
| 9460 | 538 | fun remove_params j n A = | 
| 0 | 539 | if j=0 andalso n<=0 then A (*nothing left to do...*) | 
| 540 | else case A of | |
| 56245 | 541 |         Const("Pure.imp", _) $ H $ B =>
 | 
| 9460 | 542 | if n=1 then (remove_params j (n-1) B) | 
| 543 | else implies $ (incr_boundvars j H) $ (remove_params j (n-1) B) | |
| 56245 | 544 |       | Const("Pure.all",_)$Abs(a,T,t) => remove_params (j-1) n t
 | 
| 0 | 545 |       | _ => if n>0 then raise TERM("remove_params", [A])
 | 
| 546 | else A; | |
| 547 | ||
| 548 | (*Move all parameters to the front of the subgoal, renaming them apart; | |
| 549 | if n>0 then deletes assumption n. *) | |
| 550 | fun flatten_params n A = | |
| 551 | let val params = strip_params A; | |
| 25939 | 552 | val vars = ListPair.zip (Name.variant_list [] (map #1 params), | 
| 553 | map #2 params) | |
| 46218 
ecf6375e2abb
renamed Term.list_all to Logic.list_all, in accordance to HOLogic.list_all;
 wenzelm parents: 
46217diff
changeset | 554 | in list_all (vars, remove_params (length vars) n A) end; | 
| 0 | 555 | |
| 556 | (*Makes parameters in a goal have the names supplied by the list cs.*) | |
| 56245 | 557 | fun list_rename_params cs (Const ("Pure.imp", _) $ A $ B) =
 | 
| 45328 | 558 | implies $ A $ list_rename_params cs B | 
| 56245 | 559 |   | list_rename_params (c :: cs) ((a as Const ("Pure.all", _)) $ Abs (_, T, t)) =
 | 
| 45328 | 560 | a $ Abs (c, T, list_rename_params cs t) | 
| 561 | | list_rename_params cs B = B; | |
| 0 | 562 | |
| 32008 | 563 | |
| 564 | ||
| 19806 | 565 | (*** Treatment of "assume", "erule", etc. ***) | 
| 0 | 566 | |
| 16879 
b81d3f2ee565
incr_tvar (from term.ML), incr_indexes: avoid garbage;
 wenzelm parents: 
16862diff
changeset | 567 | (*Strips assumptions in goal yielding | 
| 15451 
c6c8786b9921
fixed thin_tac with higher-level assumptions by removing the old code to
 paulson parents: 
14137diff
changeset | 568 | HS = [Hn,...,H1], params = [xm,...,x1], and B, | 
| 16879 
b81d3f2ee565
incr_tvar (from term.ML), incr_indexes: avoid garbage;
 wenzelm parents: 
16862diff
changeset | 569 | where x1...xm are the parameters. This version (21.1.2005) REQUIRES | 
| 
b81d3f2ee565
incr_tvar (from term.ML), incr_indexes: avoid garbage;
 wenzelm parents: 
16862diff
changeset | 570 | the the parameters to be flattened, but it allows erule to work on | 
| 67721 | 571 | assumptions of the form \<And>x. phi. Any \<And> after the outermost string | 
| 15451 
c6c8786b9921
fixed thin_tac with higher-level assumptions by removing the old code to
 paulson parents: 
14137diff
changeset | 572 | will be regarded as belonging to the conclusion, and left untouched. | 
| 15454 | 573 | Used ONLY by assum_pairs. | 
| 574 | Unless nasms<0, it can terminate the recursion early; that allows | |
| 67721 | 575 | erule to work on assumptions of the form P\<Longrightarrow>Q.*) | 
| 15454 | 576 | fun strip_assums_imp (0, Hs, B) = (Hs, B) (*recursion terminated by nasms*) | 
| 56245 | 577 |   | strip_assums_imp (nasms, Hs, Const("Pure.imp", _) $ H $ B) =
 | 
| 15454 | 578 | strip_assums_imp (nasms-1, H::Hs, B) | 
| 579 | | strip_assums_imp (_, Hs, B) = (Hs, B); (*recursion terminated by B*) | |
| 580 | ||
| 32008 | 581 | (*Strips OUTER parameters only.*) | 
| 56245 | 582 | fun strip_assums_all (params, Const("Pure.all",_)$Abs(a,T,t)) =
 | 
| 15451 
c6c8786b9921
fixed thin_tac with higher-level assumptions by removing the old code to
 paulson parents: 
14137diff
changeset | 583 | strip_assums_all ((a,T)::params, t) | 
| 
c6c8786b9921
fixed thin_tac with higher-level assumptions by removing the old code to
 paulson parents: 
14137diff
changeset | 584 | | strip_assums_all (params, B) = (params, B); | 
| 0 | 585 | |
| 586 | (*Produces disagreement pairs, one for each assumption proof, in order. | |
| 587 | A is the first premise of the lifted rule, and thus has the form | |
| 67721 | 588 | H1 \<Longrightarrow> ... Hk \<Longrightarrow> B and the pairs are (H1,B),...,(Hk,B). | 
| 15454 | 589 | nasms is the number of assumptions in the original subgoal, needed when B | 
| 67721 | 590 | has the form B1 \<Longrightarrow> B2: it stops B1 from being taken as an assumption. *) | 
| 15454 | 591 | fun assum_pairs(nasms,A) = | 
| 15451 
c6c8786b9921
fixed thin_tac with higher-level assumptions by removing the old code to
 paulson parents: 
14137diff
changeset | 592 | let val (params, A') = strip_assums_all ([],A) | 
| 15454 | 593 | val (Hs,B) = strip_assums_imp (nasms,[],A') | 
| 18938 | 594 | fun abspar t = rlist_abs(params, t) | 
| 15451 
c6c8786b9921
fixed thin_tac with higher-level assumptions by removing the old code to
 paulson parents: 
14137diff
changeset | 595 | val D = abspar B | 
| 
c6c8786b9921
fixed thin_tac with higher-level assumptions by removing the old code to
 paulson parents: 
14137diff
changeset | 596 | fun pairrev ([], pairs) = pairs | 
| 
c6c8786b9921
fixed thin_tac with higher-level assumptions by removing the old code to
 paulson parents: 
14137diff
changeset | 597 | | pairrev (H::Hs, pairs) = pairrev(Hs, (abspar H, D) :: pairs) | 
| 
c6c8786b9921
fixed thin_tac with higher-level assumptions by removing the old code to
 paulson parents: 
14137diff
changeset | 598 | in pairrev (Hs,[]) | 
| 0 | 599 | end; | 
| 600 | ||
| 30554 
73f8bd5f0af8
substantial speedup of assumption and elim-resolution: Logic.assum_problems refrains from eager application of parameters, discriminate via Term.could_unify before invoking full unification (assumes terms in beta-normal form, as do higher term net operations anyway);
 wenzelm parents: 
30364diff
changeset | 601 | fun assum_problems (nasms, A) = | 
| 
73f8bd5f0af8
substantial speedup of assumption and elim-resolution: Logic.assum_problems refrains from eager application of parameters, discriminate via Term.could_unify before invoking full unification (assumes terms in beta-normal form, as do higher term net operations anyway);
 wenzelm parents: 
30364diff
changeset | 602 | let | 
| 
73f8bd5f0af8
substantial speedup of assumption and elim-resolution: Logic.assum_problems refrains from eager application of parameters, discriminate via Term.could_unify before invoking full unification (assumes terms in beta-normal form, as do higher term net operations anyway);
 wenzelm parents: 
30364diff
changeset | 603 | val (params, A') = strip_assums_all ([], A) | 
| 
73f8bd5f0af8
substantial speedup of assumption and elim-resolution: Logic.assum_problems refrains from eager application of parameters, discriminate via Term.could_unify before invoking full unification (assumes terms in beta-normal form, as do higher term net operations anyway);
 wenzelm parents: 
30364diff
changeset | 604 | val (Hs, B) = strip_assums_imp (nasms, [], A') | 
| 
73f8bd5f0af8
substantial speedup of assumption and elim-resolution: Logic.assum_problems refrains from eager application of parameters, discriminate via Term.could_unify before invoking full unification (assumes terms in beta-normal form, as do higher term net operations anyway);
 wenzelm parents: 
30364diff
changeset | 605 | fun abspar t = rlist_abs (params, t) | 
| 
73f8bd5f0af8
substantial speedup of assumption and elim-resolution: Logic.assum_problems refrains from eager application of parameters, discriminate via Term.could_unify before invoking full unification (assumes terms in beta-normal form, as do higher term net operations anyway);
 wenzelm parents: 
30364diff
changeset | 606 | in (abspar, rev Hs, B) end; | 
| 
73f8bd5f0af8
substantial speedup of assumption and elim-resolution: Logic.assum_problems refrains from eager application of parameters, discriminate via Term.could_unify before invoking full unification (assumes terms in beta-normal form, as do higher term net operations anyway);
 wenzelm parents: 
30364diff
changeset | 607 | |
| 19806 | 608 | |
| 609 | (* global schematic variables *) | |
| 610 | ||
| 611 | fun bad_schematic xi = "Illegal schematic variable: " ^ quote (Term.string_of_vname xi); | |
| 612 | fun bad_fixed x = "Illegal fixed variable: " ^ quote x; | |
| 613 | ||
| 35845 
e5980f0ad025
renamed varify/unvarify operations to varify_global/unvarify_global to emphasize that these only work in a global situation;
 wenzelm parents: 
32784diff
changeset | 614 | fun varifyT_global_same ty = ty | 
| 32020 | 615 | |> Term_Subst.map_atypsT_same | 
| 616 | (fn TFree (a, S) => TVar ((a, 0), S) | |
| 31981 
9c59cbb9c5a2
tuned varify/unvarify: use Term_Subst.map_XXX combinators;
 wenzelm parents: 
31943diff
changeset | 617 | | TVar (ai, _) => raise TYPE (bad_schematic ai, [ty], [])); | 
| 19806 | 618 | |
| 35845 
e5980f0ad025
renamed varify/unvarify operations to varify_global/unvarify_global to emphasize that these only work in a global situation;
 wenzelm parents: 
32784diff
changeset | 619 | fun unvarifyT_global_same ty = ty | 
| 32020 | 620 | |> Term_Subst.map_atypsT_same | 
| 621 | (fn TVar ((a, 0), S) => TFree (a, S) | |
| 31981 
9c59cbb9c5a2
tuned varify/unvarify: use Term_Subst.map_XXX combinators;
 wenzelm parents: 
31943diff
changeset | 622 | | TVar (ai, _) => raise TYPE (bad_schematic ai, [ty], []) | 
| 
9c59cbb9c5a2
tuned varify/unvarify: use Term_Subst.map_XXX combinators;
 wenzelm parents: 
31943diff
changeset | 623 | | TFree (a, _) => raise TYPE (bad_fixed a, [ty], [])); | 
| 0 | 624 | |
| 35845 
e5980f0ad025
renamed varify/unvarify operations to varify_global/unvarify_global to emphasize that these only work in a global situation;
 wenzelm parents: 
32784diff
changeset | 625 | val varifyT_global = Same.commit varifyT_global_same; | 
| 
e5980f0ad025
renamed varify/unvarify operations to varify_global/unvarify_global to emphasize that these only work in a global situation;
 wenzelm parents: 
32784diff
changeset | 626 | val unvarifyT_global = Same.commit unvarifyT_global_same; | 
| 31981 
9c59cbb9c5a2
tuned varify/unvarify: use Term_Subst.map_XXX combinators;
 wenzelm parents: 
31943diff
changeset | 627 | |
| 45344 
e209da839ff4
added Logic.varify_types_global/unvarify_types_global, which avoids somewhat expensive Term.map_types;
 wenzelm parents: 
45328diff
changeset | 628 | fun varify_types_global tm = tm | 
| 
e209da839ff4
added Logic.varify_types_global/unvarify_types_global, which avoids somewhat expensive Term.map_types;
 wenzelm parents: 
45328diff
changeset | 629 | |> Same.commit (Term_Subst.map_types_same varifyT_global_same) | 
| 
e209da839ff4
added Logic.varify_types_global/unvarify_types_global, which avoids somewhat expensive Term.map_types;
 wenzelm parents: 
45328diff
changeset | 630 | handle TYPE (msg, _, _) => raise TERM (msg, [tm]); | 
| 
e209da839ff4
added Logic.varify_types_global/unvarify_types_global, which avoids somewhat expensive Term.map_types;
 wenzelm parents: 
45328diff
changeset | 631 | |
| 
e209da839ff4
added Logic.varify_types_global/unvarify_types_global, which avoids somewhat expensive Term.map_types;
 wenzelm parents: 
45328diff
changeset | 632 | fun unvarify_types_global tm = tm | 
| 
e209da839ff4
added Logic.varify_types_global/unvarify_types_global, which avoids somewhat expensive Term.map_types;
 wenzelm parents: 
45328diff
changeset | 633 | |> Same.commit (Term_Subst.map_types_same unvarifyT_global_same) | 
| 
e209da839ff4
added Logic.varify_types_global/unvarify_types_global, which avoids somewhat expensive Term.map_types;
 wenzelm parents: 
45328diff
changeset | 634 | handle TYPE (msg, _, _) => raise TERM (msg, [tm]); | 
| 
e209da839ff4
added Logic.varify_types_global/unvarify_types_global, which avoids somewhat expensive Term.map_types;
 wenzelm parents: 
45328diff
changeset | 635 | |
| 35845 
e5980f0ad025
renamed varify/unvarify operations to varify_global/unvarify_global to emphasize that these only work in a global situation;
 wenzelm parents: 
32784diff
changeset | 636 | fun varify_global tm = tm | 
| 32020 | 637 | |> Same.commit (Term_Subst.map_aterms_same | 
| 638 | (fn Free (x, T) => Var ((x, 0), T) | |
| 19806 | 639 | | Var (xi, _) => raise TERM (bad_schematic xi, [tm]) | 
| 32020 | 640 | | _ => raise Same.SAME)) | 
| 45344 
e209da839ff4
added Logic.varify_types_global/unvarify_types_global, which avoids somewhat expensive Term.map_types;
 wenzelm parents: 
45328diff
changeset | 641 | |> varify_types_global; | 
| 19806 | 642 | |
| 35845 
e5980f0ad025
renamed varify/unvarify operations to varify_global/unvarify_global to emphasize that these only work in a global situation;
 wenzelm parents: 
32784diff
changeset | 643 | fun unvarify_global tm = tm | 
| 32020 | 644 | |> Same.commit (Term_Subst.map_aterms_same | 
| 645 | (fn Var ((x, 0), T) => Free (x, T) | |
| 19806 | 646 | | Var (xi, _) => raise TERM (bad_schematic xi, [tm]) | 
| 647 | | Free (x, _) => raise TERM (bad_fixed x, [tm]) | |
| 32020 | 648 | | _ => raise Same.SAME)) | 
| 45344 
e209da839ff4
added Logic.varify_types_global/unvarify_types_global, which avoids somewhat expensive Term.map_types;
 wenzelm parents: 
45328diff
changeset | 649 | |> unvarify_types_global; | 
| 19806 | 650 | |
| 13799 
77614fe09362
Moved get_goal, prems_of_goal and concl_of_goal from goals.ML to logic.ML
 berghofe parents: 
13659diff
changeset | 651 | |
| 16862 | 652 | (* goal states *) | 
| 653 | ||
| 49865 | 654 | fun get_goal st i = | 
| 655 | nth_prem (i, st) handle TERM _ => | |
| 656 |     error ("Subgoal number " ^ string_of_int i ^ " out of range (a total of " ^
 | |
| 657 | string_of_int (count_prems st) ^ " subgoals)"); | |
| 13799 
77614fe09362
Moved get_goal, prems_of_goal and concl_of_goal from goals.ML to logic.ML
 berghofe parents: 
13659diff
changeset | 658 | |
| 
77614fe09362
Moved get_goal, prems_of_goal and concl_of_goal from goals.ML to logic.ML
 berghofe parents: 
13659diff
changeset | 659 | (*reverses parameters for substitution*) | 
| 
77614fe09362
Moved get_goal, prems_of_goal and concl_of_goal from goals.ML to logic.ML
 berghofe parents: 
13659diff
changeset | 660 | fun goal_params st i = | 
| 
77614fe09362
Moved get_goal, prems_of_goal and concl_of_goal from goals.ML to logic.ML
 berghofe parents: 
13659diff
changeset | 661 | let val gi = get_goal st i | 
| 29276 | 662 | val rfrees = map Free (Term.rename_wrt_term gi (strip_params gi)) | 
| 13799 
77614fe09362
Moved get_goal, prems_of_goal and concl_of_goal from goals.ML to logic.ML
 berghofe parents: 
13659diff
changeset | 663 | in (gi, rfrees) end; | 
| 
77614fe09362
Moved get_goal, prems_of_goal and concl_of_goal from goals.ML to logic.ML
 berghofe parents: 
13659diff
changeset | 664 | |
| 
77614fe09362
Moved get_goal, prems_of_goal and concl_of_goal from goals.ML to logic.ML
 berghofe parents: 
13659diff
changeset | 665 | fun concl_of_goal st i = | 
| 
77614fe09362
Moved get_goal, prems_of_goal and concl_of_goal from goals.ML to logic.ML
 berghofe parents: 
13659diff
changeset | 666 | let val (gi, rfrees) = goal_params st i | 
| 
77614fe09362
Moved get_goal, prems_of_goal and concl_of_goal from goals.ML to logic.ML
 berghofe parents: 
13659diff
changeset | 667 | val B = strip_assums_concl gi | 
| 
77614fe09362
Moved get_goal, prems_of_goal and concl_of_goal from goals.ML to logic.ML
 berghofe parents: 
13659diff
changeset | 668 | in subst_bounds (rfrees, B) end; | 
| 
77614fe09362
Moved get_goal, prems_of_goal and concl_of_goal from goals.ML to logic.ML
 berghofe parents: 
13659diff
changeset | 669 | |
| 
77614fe09362
Moved get_goal, prems_of_goal and concl_of_goal from goals.ML to logic.ML
 berghofe parents: 
13659diff
changeset | 670 | fun prems_of_goal st i = | 
| 
77614fe09362
Moved get_goal, prems_of_goal and concl_of_goal from goals.ML to logic.ML
 berghofe parents: 
13659diff
changeset | 671 | let val (gi, rfrees) = goal_params st i | 
| 
77614fe09362
Moved get_goal, prems_of_goal and concl_of_goal from goals.ML to logic.ML
 berghofe parents: 
13659diff
changeset | 672 | val As = strip_assums_hyp gi | 
| 
77614fe09362
Moved get_goal, prems_of_goal and concl_of_goal from goals.ML to logic.ML
 berghofe parents: 
13659diff
changeset | 673 | in map (fn A => subst_bounds (rfrees, A)) As end; | 
| 
77614fe09362
Moved get_goal, prems_of_goal and concl_of_goal from goals.ML to logic.ML
 berghofe parents: 
13659diff
changeset | 674 | |
| 0 | 675 | end; |