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