| author | wenzelm | 
| Tue, 03 Apr 2007 19:24:15 +0200 | |
| changeset 22569 | e5d7d9de7d85 | 
| parent 22363 | a9f56907eab7 | 
| child 22796 | 34c316d7b630 | 
| permissions | -rw-r--r-- | 
| 3987 | 1 | (* Title: Pure/pure_thy.ML | 
| 2 | ID: $Id$ | |
| 3 | Author: Markus Wenzel, TU Muenchen | |
| 4 | ||
| 16441 | 5 | Theorem storage. The ProtoPure theory. | 
| 3987 | 6 | *) | 
| 7 | ||
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 8 | signature BASIC_PURE_THY = | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 9 | sig | 
| 16493 | 10 | datatype interval = FromTo of int * int | From of int | Single of int | 
| 18031 | 11 | datatype thmref = | 
| 12 | Name of string | | |
| 13 | NameSelection of string * interval list | | |
| 14 | Fact of string | |
| 15456 
956d6acacf89
Specific theorems in a named list of theorems can now be referred to
 berghofe parents: 
15387diff
changeset | 15 | val get_thm: theory -> thmref -> thm | 
| 
956d6acacf89
Specific theorems in a named list of theorems can now be referred to
 berghofe parents: 
15387diff
changeset | 16 | val get_thms: theory -> thmref -> thm list | 
| 
956d6acacf89
Specific theorems in a named list of theorems can now be referred to
 berghofe parents: 
15387diff
changeset | 17 | val get_thmss: theory -> thmref list -> thm list | 
| 5091 | 18 | structure ProtoPure: | 
| 19 | sig | |
| 20 | val thy: theory | |
| 18031 | 21 | val prop_def: thm | 
| 19775 | 22 | val term_def: thm | 
| 19125 
59b26248547b
simplified Pure conjunction, based on actual const;
 wenzelm parents: 
19046diff
changeset | 23 | val conjunction_def: thm | 
| 5091 | 24 | end | 
| 4853 | 25 | end; | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 26 | |
| 3987 | 27 | signature PURE_THY = | 
| 28 | sig | |
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 29 | include BASIC_PURE_THY | 
| 18801 | 30 | val tag_rule: tag -> thm -> thm | 
| 31 | val untag_rule: string -> thm -> thm | |
| 32 | val tag: tag -> attribute | |
| 33 | val untag: string -> attribute | |
| 21964 | 34 | val has_name_hint: thm -> bool | 
| 21646 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 35 | val get_name_hint: thm -> string | 
| 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 36 | val put_name_hint: string -> thm -> thm | 
| 22251 | 37 | val has_kind: thm -> bool | 
| 18801 | 38 | val get_kind: thm -> string | 
| 39 | val kind_rule: string -> thm -> thm | |
| 40 | val kind: string -> attribute | |
| 41 | val kind_internal: attribute | |
| 42 | val has_internal: tag list -> bool | |
| 43 | val is_internal: thm -> bool | |
| 16023 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 44 | val string_of_thmref: thmref -> string | 
| 15456 
956d6acacf89
Specific theorems in a named list of theorems can now be referred to
 berghofe parents: 
15387diff
changeset | 45 | val get_thm_closure: theory -> thmref -> thm | 
| 
956d6acacf89
Specific theorems in a named list of theorems can now be referred to
 berghofe parents: 
15387diff
changeset | 46 | val get_thms_closure: theory -> thmref -> thm list | 
| 9564 | 47 | val single_thm: string -> thm list -> thm | 
| 16493 | 48 | val name_of_thmref: thmref -> string | 
| 49 | val map_name_of_thmref: (string -> string) -> thmref -> thmref | |
| 15456 
956d6acacf89
Specific theorems in a named list of theorems can now be referred to
 berghofe parents: 
15387diff
changeset | 50 | val select_thm: thmref -> thm list -> thm list | 
| 16023 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 51 | val selections: string * thm list -> (thmref * thm) list | 
| 17162 | 52 | val theorems_of: theory -> thm list NameSpace.table | 
| 16023 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 53 | val fact_index_of: theory -> FactIndex.T | 
| 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 54 | val valid_thms: theory -> thmref * thm list -> bool | 
| 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 55 | val thms_containing: theory -> FactIndex.spec -> (string * thm list) list | 
| 13646 | 56 | val thms_containing_consts: theory -> string list -> (string * thm) list | 
| 16336 | 57 | val thms_of: theory -> (string * thm) list | 
| 58 | val all_thms_of: theory -> (string * thm) list | |
| 12695 | 59 | val hide_thms: bool -> string list -> theory -> theory | 
| 21580 | 60 |   val map_facts: ('a -> 'b) -> ('c * ('a list * 'd) list) list -> ('c * ('b list * 'd) list) list
 | 
| 21567 | 61 |   val burrow_fact: ('a list -> 'b list) -> ('a list * 'c) list -> ('b list * 'c) list
 | 
| 21580 | 62 |   val burrow_facts: ('a list -> 'b list) ->
 | 
| 63 |     ('c * ('a list * 'd) list) list -> ('c * ('b list * 'd) list) list
 | |
| 64 | val name_multi: string -> 'a list -> (string * 'a) list | |
| 21646 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 65 | val name_thm: bool -> bool -> string -> thm -> thm | 
| 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 66 | val name_thms: bool -> bool -> string -> thm list -> thm list | 
| 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 67 | val name_thmss: bool -> string -> (thm list * 'a) list -> (thm list * 'a) list | 
| 18728 | 68 | val store_thm: (bstring * thm) * attribute list -> theory -> thm * theory | 
| 7405 | 69 | val smart_store_thms: (bstring * thm list) -> thm list | 
| 12138 
7cad58fbc866
renamed open_smart_store_thms to smart_store_thms_open;
 wenzelm parents: 
12123diff
changeset | 70 | val smart_store_thms_open: (bstring * thm list) -> thm list | 
| 7899 | 71 | val forall_elim_var: int -> thm -> thm | 
| 72 | val forall_elim_vars: int -> thm -> thm | |
| 18728 | 73 | val add_thms: ((bstring * thm) * attribute list) list -> theory -> thm list * theory | 
| 74 | val add_thmss: ((bstring * thm list) * attribute list) list -> theory -> thm list list * theory | |
| 18801 | 75 | val note_thmss: string -> ((bstring * attribute list) * | 
| 18728 | 76 | (thmref * attribute list) list) list -> theory -> (bstring * thm list) list * theory | 
| 18801 | 77 | val note_thmss_i: string -> ((bstring * attribute list) * | 
| 78 | (thm list * attribute list) list) list -> theory -> (bstring * thm list) list * theory | |
| 79 | val note_thmss_qualified: string -> string -> ((bstring * attribute list) * | |
| 18728 | 80 | (thm list * attribute list) list) list -> theory -> (bstring * thm list) list * theory | 
| 81 | val add_axioms: ((bstring * string) * attribute list) list -> theory -> thm list * theory | |
| 82 | val add_axioms_i: ((bstring * term) * attribute list) list -> theory -> thm list * theory | |
| 83 | val add_axiomss: ((bstring * string list) * attribute list) list -> | |
| 84 | theory -> thm list list * theory | |
| 85 | val add_axiomss_i: ((bstring * term list) * attribute list) list -> | |
| 86 | theory -> thm list list * theory | |
| 87 | val add_defs: bool -> ((bstring * string) * attribute list) list -> | |
| 18377 | 88 | theory -> thm list * theory | 
| 18728 | 89 | val add_defs_i: bool -> ((bstring * term) * attribute list) list -> | 
| 18377 | 90 | theory -> thm list * theory | 
| 19629 | 91 | val add_defs_unchecked: bool -> ((bstring * string) * attribute list) list -> | 
| 92 | theory -> thm list * theory | |
| 93 | val add_defs_unchecked_i: bool -> ((bstring * term) * attribute list) list -> | |
| 94 | theory -> thm list * theory | |
| 18728 | 95 | val add_defss: bool -> ((bstring * string list) * attribute list) list -> | 
| 18377 | 96 | theory -> thm list list * theory | 
| 18728 | 97 | val add_defss_i: bool -> ((bstring * term list) * attribute list) list -> | 
| 18358 | 98 | theory -> thm list list * theory | 
| 3987 | 99 | end; | 
| 100 | ||
| 101 | structure PureThy: PURE_THY = | |
| 102 | struct | |
| 103 | ||
| 104 | ||
| 18801 | 105 | (*** theorem tags ***) | 
| 106 | ||
| 107 | (* add / delete tags *) | |
| 108 | ||
| 21646 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 109 | fun tag_rule tg = Thm.map_tags (insert (op =) tg); | 
| 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 110 | fun untag_rule s = Thm.map_tags (filter_out (fn (s', _) => s = s')); | 
| 18801 | 111 | |
| 112 | fun tag tg x = Thm.rule_attribute (K (tag_rule tg)) x; | |
| 113 | fun untag s x = Thm.rule_attribute (K (untag_rule s)) x; | |
| 114 | ||
| 115 | fun simple_tag name x = tag (name, []) x; | |
| 116 | ||
| 117 | ||
| 21646 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 118 | (* unofficial theorem names *) | 
| 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 119 | |
| 22251 | 120 | fun the_name_hint thm = | 
| 21646 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 121 | (case AList.lookup (op =) (Thm.get_tags thm) "name" of | 
| 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 122 | SOME (k :: _) => k | 
| 22251 | 123 | | _ => raise Option); | 
| 124 | ||
| 125 | val has_name_hint = can the_name_hint; | |
| 126 | val get_name_hint = the_default "??.unknown" o try the_name_hint; | |
| 21646 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 127 | |
| 21964 | 128 | fun put_name_hint name = untag_rule "name" #> tag_rule ("name", [name]);
 | 
| 129 | ||
| 21646 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 130 | |
| 18801 | 131 | (* theorem kinds *) | 
| 132 | ||
| 22251 | 133 | fun the_kind thm = | 
| 21646 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 134 | (case AList.lookup (op =) (Thm.get_tags thm) "kind" of | 
| 18801 | 135 | SOME (k :: _) => k | 
| 22251 | 136 | | _ => raise Option); | 
| 137 | ||
| 138 | val has_kind = can the_kind; | |
| 139 | val get_kind = the_default "??.unknown" o try the_kind; | |
| 18801 | 140 | |
| 141 | fun kind_rule k = tag_rule ("kind", [k]) o untag_rule "kind";
 | |
| 142 | fun kind k x = if k = "" then x else Thm.rule_attribute (K (kind_rule k)) x; | |
| 22363 | 143 | fun kind_internal x = kind Thm.internalK x; | 
| 144 | fun has_internal tags = exists (fn ("kind", [k]) => k = Thm.internalK | _ => false) tags;
 | |
| 21646 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 145 | val is_internal = has_internal o Thm.get_tags; | 
| 18801 | 146 | |
| 147 | ||
| 148 | ||
| 4922 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 149 | (*** theorem database ***) | 
| 3987 | 150 | |
| 16441 | 151 | (** dataype theorems **) | 
| 3987 | 152 | |
| 16441 | 153 | structure TheoremsData = TheoryDataFun | 
| 154 | (struct | |
| 5005 | 155 | val name = "Pure/theorems"; | 
| 156 | type T = | |
| 16441 | 157 |    {theorems: thm list NameSpace.table,
 | 
| 158 | index: FactIndex.T} ref; | |
| 3987 | 159 | |
| 4853 | 160 | fun mk_empty _ = | 
| 16336 | 161 |     ref {theorems = NameSpace.empty_table, index = FactIndex.empty}: T;
 | 
| 3987 | 162 | |
| 5005 | 163 | val empty = mk_empty (); | 
| 6547 | 164 | fun copy (ref x) = ref x; | 
| 16441 | 165 | val extend = mk_empty; | 
| 166 | fun merge _ = mk_empty; | |
| 19426 
b9289b560446
moved print_theorems/theory to Isar/proof_display.ML;
 wenzelm parents: 
19391diff
changeset | 167 | fun print _ _ = (); | 
| 16441 | 168 | end); | 
| 3987 | 169 | |
| 16493 | 170 | val get_theorems_ref = TheoremsData.get; | 
| 171 | val get_theorems = ! o get_theorems_ref; | |
| 17162 | 172 | val theorems_of = #theorems o get_theorems; | 
| 16493 | 173 | val fact_index_of = #index o get_theorems; | 
| 16023 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 174 | |
| 6367 | 175 | |
| 3987 | 176 | |
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 177 | (** retrieve theorems **) | 
| 3987 | 178 | |
| 15531 | 179 | fun the_thms _ (SOME thms) = thms | 
| 180 |   | the_thms name NONE = error ("Unknown theorem(s) " ^ quote name);
 | |
| 4037 | 181 | |
| 9564 | 182 | fun single_thm _ [thm] = thm | 
| 183 |   | single_thm name _ = error ("Single theorem expected " ^ quote name);
 | |
| 184 | ||
| 15703 | 185 | |
| 16023 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 186 | (* datatype interval *) | 
| 15703 | 187 | |
| 188 | datatype interval = | |
| 189 | FromTo of int * int | | |
| 190 | From of int | | |
| 191 | Single of int; | |
| 192 | ||
| 193 | fun interval _ (FromTo (i, j)) = i upto j | |
| 194 | | interval n (From i) = i upto n | |
| 195 | | interval _ (Single i) = [i]; | |
| 196 | ||
| 16023 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 197 | fun string_of_interval (FromTo (i, j)) = string_of_int i ^ "-" ^ string_of_int j | 
| 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 198 | | string_of_interval (From i) = string_of_int i ^ "-" | 
| 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 199 | | string_of_interval (Single i) = string_of_int i; | 
| 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 200 | |
| 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 201 | |
| 16493 | 202 | (* datatype thmref *) | 
| 203 | ||
| 204 | datatype thmref = | |
| 205 | Name of string | | |
| 18031 | 206 | NameSelection of string * interval list | | 
| 207 | Fact of string; | |
| 15703 | 208 | |
| 16493 | 209 | fun name_of_thmref (Name name) = name | 
| 18031 | 210 | | name_of_thmref (NameSelection (name, _)) = name | 
| 18678 | 211 | | name_of_thmref (Fact _) = error "Illegal literal fact"; | 
| 16023 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 212 | |
| 16493 | 213 | fun map_name_of_thmref f (Name name) = Name (f name) | 
| 18031 | 214 | | map_name_of_thmref f (NameSelection (name, is)) = NameSelection (f name, is) | 
| 215 | | map_name_of_thmref _ thmref = thmref; | |
| 16493 | 216 | |
| 217 | fun string_of_thmref (Name name) = name | |
| 218 | | string_of_thmref (NameSelection (name, is)) = | |
| 18031 | 219 |       name ^ enclose "(" ")" (commas (map string_of_interval is))
 | 
| 18678 | 220 | | string_of_thmref (Fact _) = error "Illegal literal fact"; | 
| 16023 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 221 | |
| 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 222 | |
| 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 223 | (* select_thm *) | 
| 15703 | 224 | |
| 16493 | 225 | fun select_thm (Name _) thms = thms | 
| 18031 | 226 | | select_thm (Fact _) thms = thms | 
| 16493 | 227 | | select_thm (NameSelection (name, is)) thms = | 
| 16023 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 228 | let | 
| 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 229 | val n = length thms; | 
| 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 230 | fun select i = | 
| 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 231 | if i < 1 orelse i > n then | 
| 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 232 |             error ("Bad subscript " ^ string_of_int i ^ " for " ^
 | 
| 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 233 | quote name ^ " (length " ^ string_of_int n ^ ")") | 
| 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 234 | else List.nth (thms, i - 1); | 
| 19482 
9f11af8f7ef9
tuned basic list operators (flat, maps, map_filter);
 wenzelm parents: 
19473diff
changeset | 235 | in map select (maps (interval n) is) end; | 
| 15703 | 236 | |
| 16023 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 237 | |
| 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 238 | (* selections *) | 
| 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 239 | |
| 16493 | 240 | fun selections (name, [thm]) = [(Name name, thm)] | 
| 16023 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 241 | | selections (name, thms) = (1 upto length thms, thms) |> ListPair.map (fn (i, thm) => | 
| 16493 | 242 | (NameSelection (name, [Single i]), thm)); | 
| 15456 
956d6acacf89
Specific theorems in a named list of theorems can now be referred to
 berghofe parents: 
15387diff
changeset | 243 | |
| 9564 | 244 | |
| 9808 | 245 | (* get_thm(s)_closure -- statically scoped versions *) | 
| 9564 | 246 | |
| 247 | (*beware of proper order of evaluation!*) | |
| 4922 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 248 | |
| 9564 | 249 | fun lookup_thms thy = | 
| 250 | let | |
| 16441 | 251 | val thy_ref = Theory.self_ref thy; | 
| 16493 | 252 | val (space, thms) = #theorems (get_theorems thy); | 
| 9564 | 253 | in | 
| 254 | fn name => | |
| 17221 | 255 | Option.map (map (Thm.transfer (Theory.deref thy_ref))) (*dynamic identity*) | 
| 17418 | 256 | (Symtab.lookup thms (NameSpace.intern space name)) (*static content*) | 
| 9564 | 257 | end; | 
| 3987 | 258 | |
| 9564 | 259 | fun get_thms_closure thy = | 
| 16441 | 260 | let val closures = map lookup_thms (thy :: Theory.ancestors_of thy) in | 
| 16493 | 261 | fn thmref => | 
| 18031 | 262 | let val name = name_of_thmref thmref; | 
| 16493 | 263 | in select_thm thmref (the_thms name (get_first (fn f => f name) closures)) end | 
| 15456 
956d6acacf89
Specific theorems in a named list of theorems can now be referred to
 berghofe parents: 
15387diff
changeset | 264 | end; | 
| 9564 | 265 | |
| 9808 | 266 | fun get_thm_closure thy = | 
| 267 | let val get = get_thms_closure thy | |
| 16493 | 268 | in fn thmref => single_thm (name_of_thmref thmref) (get thmref) end; | 
| 9808 | 269 | |
| 9564 | 270 | |
| 16441 | 271 | (* get_thms etc. *) | 
| 9564 | 272 | |
| 16493 | 273 | fun get_thms theory thmref = | 
| 274 | let val name = name_of_thmref thmref in | |
| 275 | get_first (fn thy => lookup_thms thy name) (theory :: Theory.ancestors_of theory) | |
| 276 | |> the_thms name |> select_thm thmref |> map (Thm.transfer theory) | |
| 277 | end; | |
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 278 | |
| 19482 
9f11af8f7ef9
tuned basic list operators (flat, maps, map_filter);
 wenzelm parents: 
19473diff
changeset | 279 | fun get_thmss thy thmrefs = maps (get_thms thy) thmrefs; | 
| 16493 | 280 | fun get_thm thy thmref = single_thm (name_of_thmref thmref) (get_thms thy thmref); | 
| 4783 | 281 | |
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 282 | |
| 16023 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 283 | (* thms_containing etc. *) | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 284 | |
| 16023 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 285 | fun valid_thms thy (thmref, ths) = | 
| 18678 | 286 | (case try (get_thms thy) thmref of | 
| 16023 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 287 | NONE => false | 
| 16132 | 288 | | SOME ths' => Thm.eq_thms (ths, ths')); | 
| 3987 | 289 | |
| 16023 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 290 | fun thms_containing theory spec = | 
| 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 291 | (theory :: Theory.ancestors_of theory) | 
| 19482 
9f11af8f7ef9
tuned basic list operators (flat, maps, map_filter);
 wenzelm parents: 
19473diff
changeset | 292 | |> maps (fn thy => | 
| 16023 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 293 | FactIndex.find (fact_index_of thy) spec | 
| 16493 | 294 | |> List.filter (fn (name, ths) => valid_thms theory (Name name, ths)) | 
| 19482 
9f11af8f7ef9
tuned basic list operators (flat, maps, map_filter);
 wenzelm parents: 
19473diff
changeset | 295 | |> distinct (eq_fst (op =))); | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 296 | |
| 13646 | 297 | fun thms_containing_consts thy consts = | 
| 19482 
9f11af8f7ef9
tuned basic list operators (flat, maps, map_filter);
 wenzelm parents: 
19473diff
changeset | 298 | thms_containing thy (consts, []) |> maps #2 | 
| 21646 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 299 | |> map (`(get_name_hint)); | 
| 13646 | 300 | |
| 15882 
a191d2bee3e1
new thms_containing that searches for patterns instead of constants
 kleing parents: 
15801diff
changeset | 301 | |
| 16336 | 302 | (* thms_of etc. *) | 
| 15882 
a191d2bee3e1
new thms_containing that searches for patterns instead of constants
 kleing parents: 
15801diff
changeset | 303 | |
| 16023 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 304 | fun thms_of thy = | 
| 17162 | 305 | let val thms = #2 (theorems_of thy) | 
| 21646 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 306 | in map (`(get_name_hint)) (maps snd (Symtab.dest thms)) end; | 
| 15703 | 307 | |
| 19482 
9f11af8f7ef9
tuned basic list operators (flat, maps, map_filter);
 wenzelm parents: 
19473diff
changeset | 308 | fun all_thms_of thy = maps thms_of (thy :: Theory.ancestors_of thy); | 
| 16336 | 309 | |
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 310 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 311 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 312 | (** store theorems **) (*DESTRUCTIVE*) | 
| 3987 | 313 | |
| 16441 | 314 | (* hiding -- affects current theory node only *) | 
| 12695 | 315 | |
| 13424 | 316 | fun hide_thms fully names thy = | 
| 12695 | 317 | let | 
| 16493 | 318 |     val r as ref {theorems = (space, thms), index} = get_theorems_ref thy;
 | 
| 16132 | 319 | val space' = fold (NameSpace.hide fully) names space; | 
| 16336 | 320 |   in r := {theorems = (space', thms), index = index}; thy end;
 | 
| 12695 | 321 | |
| 322 | ||
| 21580 | 323 | (* fact specifications *) | 
| 324 | ||
| 325 | fun map_facts f = map (apsnd (map (apfst (map f)))); | |
| 326 | fun burrow_fact f = split_list #>> burrow f #> op ~~; | |
| 327 | fun burrow_facts f = split_list ##> burrow (burrow_fact f) #> op ~~; | |
| 328 | ||
| 329 | ||
| 4853 | 330 | (* naming *) | 
| 331 | ||
| 18614 | 332 | fun gen_names _ len "" = replicate len "" | 
| 333 | | gen_names j len name = map (fn i => name ^ "_" ^ string_of_int i) (j + 1 upto j + len); | |
| 4853 | 334 | |
| 18801 | 335 | fun name_multi name [x] = [(name, x)] | 
| 336 | | name_multi name xs = gen_names 0 (length xs) name ~~ xs; | |
| 12235 
5fa04fc9b254
Further restructuring of theorem naming functions.
 berghofe parents: 
12138diff
changeset | 337 | |
| 21646 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 338 | fun name_thm pre official name thm = thm | 
| 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 339 | |> (if Thm.get_name thm <> "" andalso pre orelse not official then I else Thm.put_name name) | 
| 21964 | 340 | |> (if has_name_hint thm andalso pre orelse name = "" then I else put_name_hint name); | 
| 12872 
0855c3ab2047
Theorems are only "pre-named" if the do not already have names.
 berghofe parents: 
12711diff
changeset | 341 | |
| 21646 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 342 | fun name_thms pre official name xs = | 
| 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 343 | map (uncurry (name_thm pre official)) (name_multi name xs); | 
| 12235 
5fa04fc9b254
Further restructuring of theorem naming functions.
 berghofe parents: 
12138diff
changeset | 344 | |
| 21646 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 345 | fun name_thmss official name fact = | 
| 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 346 | burrow_fact (name_thms true official name) fact; | 
| 4853 | 347 | |
| 348 | ||
| 11998 | 349 | (* enter_thms *) | 
| 4853 | 350 | |
| 7470 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 wenzelm parents: 
7405diff
changeset | 351 | fun warn_overwrite name = warning ("Replaced old copy of theorems " ^ quote name);
 | 
| 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 wenzelm parents: 
7405diff
changeset | 352 | fun warn_same name = warning ("Theorem database already contains a copy of " ^ quote name);
 | 
| 3987 | 353 | |
| 18418 
bf448d999b7e
re-arranged tuples (theory * 'a) to ('a * theory) in Pure
 haftmann parents: 
18377diff
changeset | 354 | fun enter_thms _ _ app_att ("", thms) thy = app_att (thy, thms) |> swap
 | 
| 16441 | 355 | | enter_thms pre_name post_name app_att (bname, thms) thy = | 
| 7470 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 wenzelm parents: 
7405diff
changeset | 356 | let | 
| 16441 | 357 | val name = Sign.full_name thy bname; | 
| 358 | val (thy', thms') = apsnd (post_name name) (app_att (thy, pre_name name thms)); | |
| 16513 
f38693aad717
enter_thms: use theorem database of thy *after* attribute application;
 wenzelm parents: 
16493diff
changeset | 359 |         val r as ref {theorems = (space, theorems), index} = get_theorems_ref thy';
 | 
| 
f38693aad717
enter_thms: use theorem database of thy *after* attribute application;
 wenzelm parents: 
16493diff
changeset | 360 | val space' = Sign.declare_name thy' name space; | 
| 17418 | 361 | val theorems' = Symtab.update (name, thms') theorems; | 
| 18031 | 362 | val index' = FactIndex.add_global (name, thms') index; | 
| 13274 | 363 | in | 
| 17418 | 364 | (case Symtab.lookup theorems name of | 
| 15531 | 365 | NONE => () | 
| 16441 | 366 | | SOME thms'' => | 
| 367 | if Thm.eq_thms (thms', thms'') then warn_same name | |
| 13274 | 368 | else warn_overwrite name); | 
| 16336 | 369 |         r := {theorems = (space', theorems'), index = index'};
 | 
| 18418 
bf448d999b7e
re-arranged tuples (theory * 'a) to ('a * theory) in Pure
 haftmann parents: 
18377diff
changeset | 370 | (thms', thy') | 
| 11998 | 371 | end; | 
| 3987 | 372 | |
| 16023 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 373 | |
| 6091 | 374 | (* add_thms(s) *) | 
| 4853 | 375 | |
| 16441 | 376 | fun add_thms_atts pre_name ((bname, thms), atts) = | 
| 21646 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 377 | enter_thms pre_name (name_thms false true) | 
| 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 378 | (foldl_map (Thm.theory_attributes atts)) (bname, thms); | 
| 4853 | 379 | |
| 18377 | 380 | fun gen_add_thmss pre_name = | 
| 381 | fold_map (add_thms_atts pre_name); | |
| 5907 | 382 | |
| 12235 
5fa04fc9b254
Further restructuring of theorem naming functions.
 berghofe parents: 
12138diff
changeset | 383 | fun gen_add_thms pre_name args = | 
| 18377 | 384 | apfst (map hd) o gen_add_thmss pre_name (map (apfst (apsnd single)) args); | 
| 12235 
5fa04fc9b254
Further restructuring of theorem naming functions.
 berghofe parents: 
12138diff
changeset | 385 | |
| 21646 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 386 | val add_thmss = gen_add_thmss (name_thms true true); | 
| 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 387 | val add_thms = gen_add_thms (name_thms true true); | 
| 5907 | 388 | |
| 389 | ||
| 14564 | 390 | (* note_thmss(_i) *) | 
| 5907 | 391 | |
| 9192 | 392 | local | 
| 12711 | 393 | |
| 18801 | 394 | fun gen_note_thmss get k = fold_map (fn ((bname, more_atts), ths_atts) => fn thy => | 
| 12711 | 395 | let | 
| 18728 | 396 | fun app (x, (ths, atts)) = foldl_map (Thm.theory_attributes atts) (x, ths); | 
| 18418 
bf448d999b7e
re-arranged tuples (theory * 'a) to ('a * theory) in Pure
 haftmann parents: 
18377diff
changeset | 397 | val (thms, thy') = thy |> enter_thms | 
| 21646 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 398 | (name_thmss true) (name_thms false true) (apsnd flat o foldl_map app) | 
| 18801 | 399 | (bname, map (fn (ths, atts) => (get thy ths, atts @ more_atts @ [kind k])) ths_atts); | 
| 400 | in ((bname, thms), thy') end); | |
| 12711 | 401 | |
| 9192 | 402 | in | 
| 12711 | 403 | |
| 18418 
bf448d999b7e
re-arranged tuples (theory * 'a) to ('a * theory) in Pure
 haftmann parents: 
18377diff
changeset | 404 | val note_thmss = gen_note_thmss get_thms; | 
| 
bf448d999b7e
re-arranged tuples (theory * 'a) to ('a * theory) in Pure
 haftmann parents: 
18377diff
changeset | 405 | val note_thmss_i = gen_note_thmss (K I); | 
| 12711 | 406 | |
| 21438 | 407 | end; | 
| 408 | ||
| 18801 | 409 | fun note_thmss_qualified k path facts thy = | 
| 410 | thy | |
| 411 | |> Theory.add_path path | |
| 412 | |> Theory.no_base_names | |
| 413 | |> note_thmss_i k facts | |
| 414 | ||> Theory.restore_naming thy; | |
| 415 | ||
| 5280 | 416 | |
| 6091 | 417 | (* store_thm *) | 
| 5280 | 418 | |
| 11998 | 419 | fun store_thm ((bname, thm), atts) thy = | 
| 21646 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 420 | let val ([th'], thy') = add_thms_atts (name_thms true true) ((bname, [thm]), atts) thy | 
| 18358 | 421 | in (th', thy') end; | 
| 3987 | 422 | |
| 423 | ||
| 16441 | 424 | (* smart_store_thms(_open) *) | 
| 3987 | 425 | |
| 16441 | 426 | local | 
| 427 | ||
| 428 | fun smart_store _ (name, []) = | |
| 11516 
a0633bdcd015
Added equality axioms and initialization of proof term package.
 berghofe parents: 
10667diff
changeset | 429 |       error ("Cannot store empty list of theorems: " ^ quote name)
 | 
| 21646 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 430 | | smart_store official (name, [thm]) = | 
| 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 431 | fst (enter_thms (name_thms true official) (name_thms false official) I (name, [thm]) | 
| 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 432 | (Thm.theory_of_thm thm)) | 
| 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 433 | | smart_store official (name, thms) = | 
| 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 434 | let val thy = Theory.merge_list (map Thm.theory_of_thm thms) in | 
| 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 435 | fst (enter_thms (name_thms true official) (name_thms false official) I (name, thms) thy) | 
| 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 436 | end; | 
| 11516 
a0633bdcd015
Added equality axioms and initialization of proof term package.
 berghofe parents: 
10667diff
changeset | 437 | |
| 16441 | 438 | in | 
| 439 | ||
| 21646 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 440 | val smart_store_thms = smart_store true; | 
| 
c07b5b0e8492
thm/prf: separate official name vs. additional tags;
 wenzelm parents: 
21606diff
changeset | 441 | val smart_store_thms_open = smart_store false; | 
| 16441 | 442 | |
| 443 | end; | |
| 3987 | 444 | |
| 445 | ||
| 16722 
040728f6a103
tuned forall_elim_var(s): avoid expensive Term.add_vars;
 wenzelm parents: 
16536diff
changeset | 446 | (* forall_elim_var(s) -- belongs to drule.ML *) | 
| 7899 | 447 | |
| 16722 
040728f6a103
tuned forall_elim_var(s): avoid expensive Term.add_vars;
 wenzelm parents: 
16536diff
changeset | 448 | fun forall_elim_vars_aux strip_vars i th = | 
| 
040728f6a103
tuned forall_elim_var(s): avoid expensive Term.add_vars;
 wenzelm parents: 
16536diff
changeset | 449 | let | 
| 
040728f6a103
tuned forall_elim_var(s): avoid expensive Term.add_vars;
 wenzelm parents: 
16536diff
changeset | 450 |     val {thy, tpairs, prop, ...} = Thm.rep_thm th;
 | 
| 16787 | 451 | val add_used = Term.fold_aterms | 
| 20853 | 452 | (fn Var ((x, j), _) => if i = j then insert (op =) x else I | _ => I); | 
| 16722 
040728f6a103
tuned forall_elim_var(s): avoid expensive Term.add_vars;
 wenzelm parents: 
16536diff
changeset | 453 | val used = fold (fn (t, u) => add_used t o add_used u) tpairs (add_used prop []); | 
| 
040728f6a103
tuned forall_elim_var(s): avoid expensive Term.add_vars;
 wenzelm parents: 
16536diff
changeset | 454 | val vars = strip_vars prop; | 
| 20071 
8f3e1ddb50e6
replaced Term.variant(list) by Name.variant(_list);
 wenzelm parents: 
20057diff
changeset | 455 | val cvars = (Name.variant_list used (map #1 vars), vars) | 
| 16722 
040728f6a103
tuned forall_elim_var(s): avoid expensive Term.add_vars;
 wenzelm parents: 
16536diff
changeset | 456 | |> ListPair.map (fn (x, (_, T)) => Thm.cterm_of thy (Var ((x, i), T))); | 
| 
040728f6a103
tuned forall_elim_var(s): avoid expensive Term.add_vars;
 wenzelm parents: 
16536diff
changeset | 457 | in fold Thm.forall_elim cvars th end; | 
| 7899 | 458 | |
| 16722 
040728f6a103
tuned forall_elim_var(s): avoid expensive Term.add_vars;
 wenzelm parents: 
16536diff
changeset | 459 | val forall_elim_vars = forall_elim_vars_aux Term.strip_all_vars; | 
| 
040728f6a103
tuned forall_elim_var(s): avoid expensive Term.add_vars;
 wenzelm parents: 
16536diff
changeset | 460 | |
| 
040728f6a103
tuned forall_elim_var(s): avoid expensive Term.add_vars;
 wenzelm parents: 
16536diff
changeset | 461 | fun forall_elim_var i th = forall_elim_vars_aux | 
| 
040728f6a103
tuned forall_elim_var(s): avoid expensive Term.add_vars;
 wenzelm parents: 
16536diff
changeset | 462 |   (fn Const ("all", _) $ Abs (a, T, _) => [(a, T)]
 | 
| 
040728f6a103
tuned forall_elim_var(s): avoid expensive Term.add_vars;
 wenzelm parents: 
16536diff
changeset | 463 |   | _ => raise THM ("forall_elim_vars", i, [th])) i th;
 | 
| 7899 | 464 | |
| 465 | ||
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 466 | (* store axioms as theorems *) | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 467 | |
| 4853 | 468 | local | 
| 17418 | 469 | fun get_ax thy (name, _) = Thm.get_axiom_i thy (Sign.full_name thy name); | 
| 470 | fun get_axs thy named_axs = map (forall_elim_vars 0 o get_ax thy) named_axs; | |
| 18377 | 471 | fun add_single add ((name, ax), atts) thy = | 
| 4853 | 472 | let | 
| 11998 | 473 | val named_ax = [(name, ax)]; | 
| 7753 | 474 | val thy' = add named_ax thy; | 
| 475 | val thm = hd (get_axs thy' named_ax); | |
| 18377 | 476 | in apfst hd (gen_add_thms (K I) [((name, thm), atts)] thy') end; | 
| 477 | fun add_multi add ((name, axs), atts) thy = | |
| 7753 | 478 | let | 
| 479 | val named_axs = name_multi name axs; | |
| 4853 | 480 | val thy' = add named_axs thy; | 
| 7753 | 481 | val thms = get_axs thy' named_axs; | 
| 18377 | 482 | in apfst hd (gen_add_thmss (K I) [((name, thms), atts)] thy') end; | 
| 483 | fun add_singles add = fold_map (add_single add); | |
| 484 | fun add_multis add = fold_map (add_multi add); | |
| 4853 | 485 | in | 
| 19629 | 486 | val add_axioms = add_singles Theory.add_axioms; | 
| 487 | val add_axioms_i = add_singles Theory.add_axioms_i; | |
| 488 | val add_axiomss = add_multis Theory.add_axioms; | |
| 489 | val add_axiomss_i = add_multis Theory.add_axioms_i; | |
| 490 | val add_defs = add_singles o (Theory.add_defs false); | |
| 491 | val add_defs_i = add_singles o (Theory.add_defs_i false); | |
| 492 | val add_defs_unchecked = add_singles o (Theory.add_defs true); | |
| 493 | val add_defs_unchecked_i = add_singles o (Theory.add_defs_i true); | |
| 494 | val add_defss = add_multis o (Theory.add_defs false); | |
| 495 | val add_defss_i = add_multis o (Theory.add_defs_i false); | |
| 4853 | 496 | end; | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 497 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 498 | |
| 3987 | 499 | |
| 5091 | 500 | (*** the ProtoPure theory ***) | 
| 3987 | 501 | |
| 16441 | 502 | val aT = TFree ("'a", []);
 | 
| 503 | val A = Free ("A", propT);
 | |
| 504 | ||
| 3987 | 505 | val proto_pure = | 
| 16493 | 506 | Context.pre_pure_thy | 
| 16987 | 507 | |> Compress.init_data | 
| 16536 | 508 | |> Sign.init_data | 
| 509 | |> Theory.init_data | |
| 510 | |> Proofterm.init_data | |
| 16023 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 511 | |> TheoremsData.init | 
| 3987 | 512 | |> Theory.add_types | 
| 4922 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 513 |    [("fun", 2, NoSyn),
 | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 514 |     ("prop", 0, NoSyn),
 | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 515 |     ("itself", 1, NoSyn),
 | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 516 |     ("dummy", 0, NoSyn)]
 | 
| 18713 | 517 | |> Theory.add_nonterminals Syntax.basic_nonterms | 
| 3987 | 518 | |> Theory.add_syntax | 
| 18713 | 519 |    [("_lambda",     "[pttrns, 'a] => logic",     Mixfix ("(3%_./ _)", [0, 3], 3)),
 | 
| 520 |     ("_abs",        "'a",                        NoSyn),
 | |
| 521 |     ("",            "'a => args",                Delimfix "_"),
 | |
| 522 |     ("_args",       "['a, args] => args",        Delimfix "_,/ _"),
 | |
| 523 |     ("",            "id => idt",                 Delimfix "_"),
 | |
| 524 |     ("_idtdummy",   "idt",                       Delimfix "'_"),
 | |
| 525 |     ("_idtyp",      "[id, type] => idt",         Mixfix ("_::_", [], 0)),
 | |
| 526 |     ("_idtypdummy", "type => idt",               Mixfix ("'_()::_", [], 0)),
 | |
| 527 |     ("",            "idt => idt",                Delimfix "'(_')"),
 | |
| 528 |     ("",            "idt => idts",               Delimfix "_"),
 | |
| 529 |     ("_idts",       "[idt, idts] => idts",       Mixfix ("_/ _", [1, 0], 0)),
 | |
| 530 |     ("",            "idt => pttrn",              Delimfix "_"),
 | |
| 531 |     ("",            "pttrn => pttrns",           Delimfix "_"),
 | |
| 532 |     ("_pttrns",     "[pttrn, pttrns] => pttrns", Mixfix ("_/ _", [1, 0], 0)),
 | |
| 533 |     ("",            "id => aprop",               Delimfix "_"),
 | |
| 534 |     ("",            "longid => aprop",           Delimfix "_"),
 | |
| 535 |     ("",            "var => aprop",              Delimfix "_"),
 | |
| 536 |     ("_DDDOT",      "aprop",                     Delimfix "..."),
 | |
| 537 |     ("_aprop",      "aprop => prop",             Delimfix "PROP _"),
 | |
| 538 |     ("_asm",        "prop => asms",              Delimfix "_"),
 | |
| 539 |     ("_asms",       "[prop, asms] => asms",      Delimfix "_;/ _"),
 | |
| 540 |     ("_bigimpl",    "[asms, prop] => prop",      Mixfix ("((3[| _ |])/ ==> _)", [0, 1], 1)),
 | |
| 541 |     ("_ofclass",    "[type, logic] => prop",     Delimfix "(1OFCLASS/(1'(_,/ _')))"),
 | |
| 542 |     ("_mk_ofclass", "_",                         NoSyn),
 | |
| 543 |     ("_TYPE",       "type => logic",             Delimfix "(1TYPE/(1'(_')))"),
 | |
| 544 |     ("",            "id => logic",               Delimfix "_"),
 | |
| 545 |     ("",            "longid => logic",           Delimfix "_"),
 | |
| 546 |     ("",            "var => logic",              Delimfix "_"),
 | |
| 547 |     ("_DDDOT",      "logic",                     Delimfix "..."),
 | |
| 548 |     ("_constify",   "num => num_const",          Delimfix "_"),
 | |
| 549 |     ("_indexnum",   "num_const => index",        Delimfix "\\<^sub>_"),
 | |
| 550 |     ("_index",      "logic => index",            Delimfix "(00\\<^bsub>_\\<^esub>)"),
 | |
| 551 |     ("_indexdefault", "index",                   Delimfix ""),
 | |
| 552 |     ("_indexvar",   "index",                     Delimfix "'\\<index>"),
 | |
| 553 |     ("_struct",     "index => logic",            Mixfix ("\\<struct>_", [1000], 1000)),
 | |
| 554 |     ("==>",         "prop => prop => prop",      Delimfix "op ==>"),
 | |
| 555 | (Term.dummy_patternN, "aprop", Delimfix "'_")] | |
| 556 | |> Theory.add_syntax Syntax.appl_syntax | |
| 557 | |> Theory.add_modesyntax (Symbol.xsymbolsN, true) | |
| 558 |    [("fun",      "[type, type] => type",  Mixfix ("(_/ \\<Rightarrow> _)", [1, 0], 0)),
 | |
| 559 |     ("_bracket", "[types, type] => type", Mixfix ("([_]/ \\<Rightarrow> _)", [0, 0], 0)),
 | |
| 560 |     ("_ofsort",  "[tid, sort] => type",   Mixfix ("_\\<Colon>_", [1000, 0], 1000)),
 | |
| 561 |     ("_constrain", "['a, type] => 'a",    Mixfix ("_\\<Colon>_", [4, 0], 3)),
 | |
| 21524 | 562 |     ("_idtyp",    "[id, type] => idt",    Mixfix ("_\\<Colon>_", [], 0)),
 | 
| 18713 | 563 |     ("_idtypdummy", "type => idt",        Mixfix ("'_()\\<Colon>_", [], 0)),
 | 
| 19577 | 564 |     ("_type_constraint_", "'a",           NoSyn),
 | 
| 18713 | 565 |     ("_lambda",  "[pttrns, 'a] => logic", Mixfix ("(3\\<lambda>_./ _)", [0, 3], 3)),
 | 
| 566 |     ("==",       "['a, 'a] => prop",      InfixrName ("\\<equiv>", 2)),
 | |
| 21524 | 567 |     ("all_binder", "[idts, prop] => prop", Mixfix ("(3\\<And>_./ _)", [0, 0], 0)),
 | 
| 18713 | 568 |     ("==>",      "[prop, prop] => prop",  InfixrName ("\\<Longrightarrow>", 1)),
 | 
| 569 |     ("_DDDOT",   "aprop",                 Delimfix "\\<dots>"),
 | |
| 570 |     ("_bigimpl", "[asms, prop] => prop",  Mixfix ("((1\\<lbrakk>_\\<rbrakk>)/ \\<Longrightarrow> _)", [0, 1], 1)),
 | |
| 571 |     ("_DDDOT",   "logic",                 Delimfix "\\<dots>")]
 | |
| 572 |   |> Theory.add_modesyntax ("", false)
 | |
| 573 |    [("prop", "prop => prop", Mixfix ("_", [0], 0)),
 | |
| 19775 | 574 |     ("ProtoPure.term", "'a => prop", Delimfix "TERM _"),
 | 
| 19125 
59b26248547b
simplified Pure conjunction, based on actual const;
 wenzelm parents: 
19046diff
changeset | 575 |     ("ProtoPure.conjunction", "prop => prop => prop", InfixrName ("&&", 2))]
 | 
| 18713 | 576 |   |> Theory.add_modesyntax ("HTML", false)
 | 
| 577 |    [("_lambda",  "[pttrns, 'a] => logic", Mixfix ("(3\\<lambda>_./ _)", [0, 3], 3))]
 | |
| 3987 | 578 | |> Theory.add_consts | 
| 16441 | 579 |    [("==", "'a => 'a => prop", InfixrName ("==", 2)),
 | 
| 580 |     ("==>", "prop => prop => prop", Mixfix ("(_/ ==> _)", [2, 1], 1)),
 | |
| 3987 | 581 |     ("all", "('a => prop) => prop", Binder ("!!", 0, 0)),
 | 
| 18031 | 582 |     ("prop", "prop => prop", NoSyn),
 | 
| 6547 | 583 |     ("TYPE", "'a itself", NoSyn),
 | 
| 9534 | 584 | (Term.dummy_patternN, "'a", Delimfix "'_")] | 
| 14223 
0ee05eef881b
Added support for making constants final, that is, ensuring that no
 skalberg parents: 
13800diff
changeset | 585 | |> Theory.add_finals_i false | 
| 16441 | 586 |     [Const ("==", [aT, aT] ---> propT),
 | 
| 587 |      Const ("==>", [propT, propT] ---> propT),
 | |
| 588 |      Const ("all", (aT --> propT) --> propT),
 | |
| 19391 | 589 |      Const ("TYPE", Term.a_itselfT),
 | 
| 17703 | 590 | Const (Term.dummy_patternN, aT)] | 
| 18838 | 591 | |> Theory.add_trfuns Syntax.pure_trfuns | 
| 592 | |> Theory.add_trfunsT Syntax.pure_trfunsT | |
| 16441 | 593 | |> Sign.local_path | 
| 19125 
59b26248547b
simplified Pure conjunction, based on actual const;
 wenzelm parents: 
19046diff
changeset | 594 | |> Theory.add_consts | 
| 19775 | 595 |    [("term", "'a => prop", NoSyn),
 | 
| 596 |     ("conjunction", "prop => prop => prop", NoSyn)]
 | |
| 19125 
59b26248547b
simplified Pure conjunction, based on actual const;
 wenzelm parents: 
19046diff
changeset | 597 | |> (add_defs false o map Thm.no_attributes) | 
| 
59b26248547b
simplified Pure conjunction, based on actual const;
 wenzelm parents: 
19046diff
changeset | 598 |    [("prop_def", "prop(A) == A"),
 | 
| 19775 | 599 |     ("term_def", "term(x) == (!!A. PROP A ==> PROP A)"),
 | 
| 19125 
59b26248547b
simplified Pure conjunction, based on actual const;
 wenzelm parents: 
19046diff
changeset | 600 |     ("conjunction_def",
 | 
| 
59b26248547b
simplified Pure conjunction, based on actual const;
 wenzelm parents: 
19046diff
changeset | 601 | "conjunction(A, B) == (!!C. (PROP A ==> PROP B ==> PROP C) ==> PROP C)")] |> snd | 
| 19775 | 602 | |> Sign.hide_consts false ["conjunction", "term"] | 
| 18377 | 603 |   |> add_thmss [(("nothing", []), [])] |> snd
 | 
| 11516 
a0633bdcd015
Added equality axioms and initialization of proof term package.
 berghofe parents: 
10667diff
changeset | 604 | |> Theory.add_axioms_i Proofterm.equality_axms | 
| 16493 | 605 | |> Theory.end_theory; | 
| 3987 | 606 | |
| 5091 | 607 | structure ProtoPure = | 
| 608 | struct | |
| 609 | val thy = proto_pure; | |
| 18031 | 610 | val prop_def = get_axiom thy "prop_def"; | 
| 19775 | 611 | val term_def = get_axiom thy "term_def"; | 
| 19125 
59b26248547b
simplified Pure conjunction, based on actual const;
 wenzelm parents: 
19046diff
changeset | 612 | val conjunction_def = get_axiom thy "conjunction_def"; | 
| 5091 | 613 | end; | 
| 3987 | 614 | |
| 615 | end; | |
| 616 | ||
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 617 | structure BasicPureThy: BASIC_PURE_THY = PureThy; | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 618 | open BasicPureThy; |