| author | wenzelm | 
| Tue, 13 Oct 2020 20:28:43 +0200 | |
| changeset 72470 | e2e9ef9aa2df | 
| parent 72098 | 8c547eac8381 | 
| child 74232 | 1091880266e5 | 
| permissions | -rw-r--r-- | 
| 39557 
fe5722fce758
renamed structure PureThy to Pure_Thy and moved most content to Global_Theory, to emphasize that this is global-only;
 wenzelm parents: 
39507diff
changeset | 1 | (* Title: Pure/global_theory.ML | 
| 
fe5722fce758
renamed structure PureThy to Pure_Thy and moved most content to Global_Theory, to emphasize that this is global-only;
 wenzelm parents: 
39507diff
changeset | 2 | Author: Makarius | 
| 3987 | 3 | |
| 39557 
fe5722fce758
renamed structure PureThy to Pure_Thy and moved most content to Global_Theory, to emphasize that this is global-only;
 wenzelm parents: 
39507diff
changeset | 4 | Global theory content: stored facts. | 
| 3987 | 5 | *) | 
| 6 | ||
| 39557 
fe5722fce758
renamed structure PureThy to Pure_Thy and moved most content to Global_Theory, to emphasize that this is global-only;
 wenzelm parents: 
39507diff
changeset | 7 | signature GLOBAL_THEORY = | 
| 3987 | 8 | sig | 
| 27198 | 9 | val facts_of: theory -> Facts.T | 
| 56003 | 10 | val check_fact: theory -> xstring * Position.T -> string | 
| 26666 | 11 | val intern_fact: theory -> xstring -> string | 
| 26693 | 12 | val defined_fact: theory -> string -> bool | 
| 57887 | 13 | val alias_fact: binding -> string -> theory -> theory | 
| 27198 | 14 | val hide_fact: bool -> string -> theory -> theory | 
| 70574 | 15 | val dest_thms: bool -> theory list -> theory -> (Thm_Name.T * thm) list | 
| 72098 
8c547eac8381
more robust treatment of thm_names, with strict check after all theories are loaded;
 wenzelm parents: 
72055diff
changeset | 16 | val get_thm_names: theory -> Thm_Name.T Inttab.table | 
| 70904 | 17 | val dest_thm_names: theory -> (Proofterm.thm_id * Thm_Name.T) list | 
| 70574 | 18 | val lookup_thm_id: theory -> Proofterm.thm_id -> Thm_Name.T option | 
| 70594 | 19 | val lookup_thm: theory -> thm -> (Proofterm.thm_id * Thm_Name.T) option | 
| 26344 
04dacc6809b6
simplified get_thm(s): back to plain name argument;
 wenzelm parents: 
26336diff
changeset | 20 | val get_thms: theory -> xstring -> thm list | 
| 
04dacc6809b6
simplified get_thm(s): back to plain name argument;
 wenzelm parents: 
26336diff
changeset | 21 | val get_thm: theory -> xstring -> thm | 
| 61054 | 22 | val transfer_theories: theory -> thm -> thm | 
| 56161 | 23 | val all_thms_of: theory -> bool -> (string * thm) list | 
| 70574 | 24 | val get_thm_name: theory -> Thm_Name.T * Position.T -> thm | 
| 21567 | 25 |   val burrow_fact: ('a list -> 'b list) -> ('a list * 'c) list -> ('b list * 'c) list
 | 
| 21580 | 26 |   val burrow_facts: ('a list -> 'b list) ->
 | 
| 27 |     ('c * ('a list * 'd) list) list -> ('c * ('b list * 'd) list) list
 | |
| 70550 | 28 | val name_multi: string * Position.T -> thm list -> ((string * Position.T) * thm) list | 
| 70430 | 29 | type name_flags | 
| 30 | val unnamed: name_flags | |
| 70427 | 31 | val official1: name_flags | 
| 32 | val official2: name_flags | |
| 33 | val unofficial1: name_flags | |
| 34 | val unofficial2: name_flags | |
| 70494 | 35 | val name_thm: name_flags -> string * Position.T -> thm -> thm | 
| 36 | val name_thms: name_flags -> string * Position.T -> thm list -> thm list | |
| 68661 | 37 | val check_thms_lazy: thm list lazy -> thm list lazy | 
| 67671 
857da80611ab
support for lazy notes in global/local context and Element.Lazy_Notes: name binding and fact without attributes;
 wenzelm parents: 
67663diff
changeset | 38 | val add_thms_lazy: string -> (binding * thm list lazy) -> theory -> theory | 
| 29579 | 39 | val store_thm: binding * thm -> theory -> thm * theory | 
| 40 | val store_thm_open: binding * thm -> theory -> thm * theory | |
| 41 | val add_thms: ((binding * thm) * attribute list) list -> theory -> thm list * theory | |
| 42 | val add_thm: (binding * thm) * attribute list -> theory -> thm * theory | |
| 43 | val add_thmss: ((binding * thm list) * attribute list) list -> theory -> thm list list * theory | |
| 57929 
c5063c033a5a
tuned signature -- proper Local_Theory.add_thms_dynamic;
 wenzelm parents: 
57887diff
changeset | 44 | val add_thms_dynamic': Context.generic -> binding * (Context.generic -> thm list) -> | 
| 
c5063c033a5a
tuned signature -- proper Local_Theory.add_thms_dynamic;
 wenzelm parents: 
57887diff
changeset | 45 | theory -> string * theory | 
| 29579 | 46 | val add_thms_dynamic: binding * (Context.generic -> thm list) -> theory -> theory | 
| 67713 | 47 | val note_thms: string -> Thm.binding * (thm list * attribute list) list -> theory -> | 
| 48 | (string * thm list) * theory | |
| 49 | val note_thmss: string -> (Thm.binding * (thm list * attribute list) list) list -> theory -> | |
| 50 | (string * thm list) list * theory | |
| 29579 | 51 | val add_defs: bool -> ((binding * term) * attribute list) list -> | 
| 18377 | 52 | theory -> thm list * theory | 
| 29579 | 53 | val add_defs_unchecked: bool -> ((binding * term) * attribute list) list -> | 
| 54 | theory -> thm list * theory | |
| 3987 | 55 | end; | 
| 56 | ||
| 39557 
fe5722fce758
renamed structure PureThy to Pure_Thy and moved most content to Global_Theory, to emphasize that this is global-only;
 wenzelm parents: 
39507diff
changeset | 57 | structure Global_Theory: GLOBAL_THEORY = | 
| 3987 | 58 | struct | 
| 59 | ||
| 27198 | 60 | (** theory data **) | 
| 26282 
305d5ca4fa9d
replaced obsolete FactIndex.T by Facts.T (cumulative version, assumes that facts are only added to unfinished theories);
 wenzelm parents: 
26050diff
changeset | 61 | |
| 39557 
fe5722fce758
renamed structure PureThy to Pure_Thy and moved most content to Global_Theory, to emphasize that this is global-only;
 wenzelm parents: 
39507diff
changeset | 62 | structure Data = Theory_Data | 
| 24713 | 63 | ( | 
| 70574 | 64 | type T = Facts.T * Thm_Name.T Inttab.table lazy option; | 
| 70552 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 65 | val empty: T = (Facts.empty, NONE); | 
| 72055 | 66 | val extend = I; | 
| 70552 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 67 | fun merge ((facts1, _), (facts2, _)) = (Facts.merge (facts1, facts2), NONE); | 
| 24713 | 68 | ); | 
| 3987 | 69 | |
| 70552 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 70 | |
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 71 | (* facts *) | 
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 72 | |
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 73 | val facts_of = #1 o Data.get; | 
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 74 | val map_facts = Data.map o apfst; | 
| 26666 | 75 | |
| 56003 | 76 | fun check_fact thy = Facts.check (Context.Theory thy) (facts_of thy); | 
| 26666 | 77 | val intern_fact = Facts.intern o facts_of; | 
| 26693 | 78 | val defined_fact = Facts.defined o facts_of; | 
| 16023 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 79 | |
| 57887 | 80 | fun alias_fact binding name thy = | 
| 70544 | 81 | map_facts (Facts.alias (Sign.naming_of thy) binding name) thy; | 
| 57887 | 82 | |
| 70544 | 83 | fun hide_fact fully name = map_facts (Facts.hide fully name); | 
| 6367 | 84 | |
| 70552 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 85 | fun dest_thms verbose prev_thys thy = | 
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 86 | Facts.dest_static verbose (map facts_of prev_thys) (facts_of thy) | 
| 70574 | 87 | |> maps (uncurry Thm_Name.make_list); | 
| 70552 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 88 | |
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 89 | |
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 90 | (* thm_name vs. derivation_id *) | 
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 91 | |
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 92 | val thm_names_of = #2 o Data.get; | 
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 93 | val map_thm_names = Data.map o apsnd; | 
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 94 | |
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 95 | fun make_thm_names thy = | 
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 96 | (dest_thms true (Theory.parents_of thy) thy, Inttab.empty) | 
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 97 | |-> fold (fn (thm_name, thm) => fn thm_names => | 
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 98 | (case Thm.derivation_id (Thm.transfer thy thm) of | 
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 99 | NONE => thm_names | 
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 100 |     | SOME {serial, theory_name} =>
 | 
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 101 | if Context.theory_long_name thy <> theory_name then | 
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 102 |           raise THM ("Bad theory name for derivation", 0, [thm])
 | 
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 103 | else | 
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 104 | (case Inttab.lookup thm_names serial of | 
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 105 | SOME thm_name' => | 
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 106 |               raise THM ("Duplicate use of derivation identity for " ^
 | 
| 70574 | 107 | Thm_Name.print thm_name ^ " vs. " ^ | 
| 108 | Thm_Name.print thm_name', 0, [thm]) | |
| 70552 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 109 | | NONE => Inttab.update (serial, thm_name) thm_names))); | 
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 110 | |
| 72098 
8c547eac8381
more robust treatment of thm_names, with strict check after all theories are loaded;
 wenzelm parents: 
72055diff
changeset | 111 | fun lazy_thm_names thy = | 
| 70552 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 112 | (case thm_names_of thy of | 
| 70555 
c1fde53e5e82
clarified lookup operations: more scalable for multiple retrieval;
 wenzelm parents: 
70552diff
changeset | 113 | NONE => Lazy.lazy (fn () => make_thm_names thy) | 
| 
c1fde53e5e82
clarified lookup operations: more scalable for multiple retrieval;
 wenzelm parents: 
70552diff
changeset | 114 | | SOME lazy_tab => lazy_tab); | 
| 70552 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 115 | |
| 72098 
8c547eac8381
more robust treatment of thm_names, with strict check after all theories are loaded;
 wenzelm parents: 
72055diff
changeset | 116 | val get_thm_names = Lazy.force o lazy_thm_names; | 
| 
8c547eac8381
more robust treatment of thm_names, with strict check after all theories are loaded;
 wenzelm parents: 
72055diff
changeset | 117 | |
| 70904 | 118 | fun dest_thm_names thy = | 
| 119 | let | |
| 120 | val theory_name = Context.theory_long_name thy; | |
| 121 | fun thm_id i = Proofterm.make_thm_id (i, theory_name); | |
| 72098 
8c547eac8381
more robust treatment of thm_names, with strict check after all theories are loaded;
 wenzelm parents: 
72055diff
changeset | 122 | in Inttab.fold_rev (fn (i, thm_name) => cons (thm_id i, thm_name)) (get_thm_names thy) [] end; | 
| 70552 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 123 | |
| 70555 
c1fde53e5e82
clarified lookup operations: more scalable for multiple retrieval;
 wenzelm parents: 
70552diff
changeset | 124 | fun lookup_thm_id thy = | 
| 
c1fde53e5e82
clarified lookup operations: more scalable for multiple retrieval;
 wenzelm parents: 
70552diff
changeset | 125 | let | 
| 
c1fde53e5e82
clarified lookup operations: more scalable for multiple retrieval;
 wenzelm parents: 
70552diff
changeset | 126 | val theories = | 
| 72098 
8c547eac8381
more robust treatment of thm_names, with strict check after all theories are loaded;
 wenzelm parents: 
72055diff
changeset | 127 | fold (fn thy' => Symtab.update (Context.theory_long_name thy', lazy_thm_names thy')) | 
| 70555 
c1fde53e5e82
clarified lookup operations: more scalable for multiple retrieval;
 wenzelm parents: 
70552diff
changeset | 128 | (Theory.nodes_of thy) Symtab.empty; | 
| 
c1fde53e5e82
clarified lookup operations: more scalable for multiple retrieval;
 wenzelm parents: 
70552diff
changeset | 129 | fun lookup (thm_id: Proofterm.thm_id) = | 
| 
c1fde53e5e82
clarified lookup operations: more scalable for multiple retrieval;
 wenzelm parents: 
70552diff
changeset | 130 | (case Symtab.lookup theories (#theory_name thm_id) of | 
| 
c1fde53e5e82
clarified lookup operations: more scalable for multiple retrieval;
 wenzelm parents: 
70552diff
changeset | 131 | NONE => NONE | 
| 
c1fde53e5e82
clarified lookup operations: more scalable for multiple retrieval;
 wenzelm parents: 
70552diff
changeset | 132 | | SOME lazy_tab => Inttab.lookup (Lazy.force lazy_tab) (#serial thm_id)); | 
| 
c1fde53e5e82
clarified lookup operations: more scalable for multiple retrieval;
 wenzelm parents: 
70552diff
changeset | 133 | in lookup end; | 
| 
c1fde53e5e82
clarified lookup operations: more scalable for multiple retrieval;
 wenzelm parents: 
70552diff
changeset | 134 | |
| 
c1fde53e5e82
clarified lookup operations: more scalable for multiple retrieval;
 wenzelm parents: 
70552diff
changeset | 135 | fun lookup_thm thy = | 
| 70594 | 136 | let val lookup = lookup_thm_id thy in | 
| 137 | fn thm => | |
| 138 | (case Thm.derivation_id thm of | |
| 139 | NONE => NONE | |
| 140 | | SOME thm_id => | |
| 141 | (case lookup thm_id of | |
| 142 | NONE => NONE | |
| 143 | | SOME thm_name => SOME (thm_id, thm_name))) | |
| 144 | end; | |
| 70552 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 145 | |
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 146 | val _ = | 
| 72098 
8c547eac8381
more robust treatment of thm_names, with strict check after all theories are loaded;
 wenzelm parents: 
72055diff
changeset | 147 | Theory.setup | 
| 
8c547eac8381
more robust treatment of thm_names, with strict check after all theories are loaded;
 wenzelm parents: 
72055diff
changeset | 148 | (Theory.at_begin (fn thy => | 
| 
8c547eac8381
more robust treatment of thm_names, with strict check after all theories are loaded;
 wenzelm parents: 
72055diff
changeset | 149 | if is_none (thm_names_of thy) then NONE | 
| 
8c547eac8381
more robust treatment of thm_names, with strict check after all theories are loaded;
 wenzelm parents: 
72055diff
changeset | 150 | else SOME (map_thm_names (K NONE) thy)) #> | 
| 
8c547eac8381
more robust treatment of thm_names, with strict check after all theories are loaded;
 wenzelm parents: 
72055diff
changeset | 151 | Theory.at_end (fn thy => | 
| 
8c547eac8381
more robust treatment of thm_names, with strict check after all theories are loaded;
 wenzelm parents: 
72055diff
changeset | 152 | if is_some (thm_names_of thy) then NONE | 
| 
8c547eac8381
more robust treatment of thm_names, with strict check after all theories are loaded;
 wenzelm parents: 
72055diff
changeset | 153 | else | 
| 
8c547eac8381
more robust treatment of thm_names, with strict check after all theories are loaded;
 wenzelm parents: 
72055diff
changeset | 154 | let | 
| 
8c547eac8381
more robust treatment of thm_names, with strict check after all theories are loaded;
 wenzelm parents: 
72055diff
changeset | 155 | val lazy_tab = | 
| 
8c547eac8381
more robust treatment of thm_names, with strict check after all theories are loaded;
 wenzelm parents: 
72055diff
changeset | 156 | if Future.proofs_enabled 1 | 
| 
8c547eac8381
more robust treatment of thm_names, with strict check after all theories are loaded;
 wenzelm parents: 
72055diff
changeset | 157 | then Lazy.lazy (fn () => make_thm_names thy) | 
| 
8c547eac8381
more robust treatment of thm_names, with strict check after all theories are loaded;
 wenzelm parents: 
72055diff
changeset | 158 | else Lazy.value (make_thm_names thy); | 
| 
8c547eac8381
more robust treatment of thm_names, with strict check after all theories are loaded;
 wenzelm parents: 
72055diff
changeset | 159 | in SOME (map_thm_names (K (SOME lazy_tab)) thy) end)); | 
| 70552 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 160 | |
| 3987 | 161 | |
| 56140 
ed92ce2ac88e
just one cumulative Proof_Context.facts, with uniform retrieval (including PIDE markup, completion etc.);
 wenzelm parents: 
56003diff
changeset | 162 | (* retrieve theorems *) | 
| 27198 | 163 | |
| 56140 
ed92ce2ac88e
just one cumulative Proof_Context.facts, with uniform retrieval (including PIDE markup, completion etc.);
 wenzelm parents: 
56003diff
changeset | 164 | fun get_thms thy xname = | 
| 57942 
e5bec882fdd0
more informative Token.Fact: retain name of dynamic fact (without selection);
 wenzelm parents: 
57929diff
changeset | 165 | #thms (Facts.retrieve (Context.Theory thy) (facts_of thy) (xname, Position.none)); | 
| 26344 
04dacc6809b6
simplified get_thm(s): back to plain name argument;
 wenzelm parents: 
26336diff
changeset | 166 | |
| 56140 
ed92ce2ac88e
just one cumulative Proof_Context.facts, with uniform retrieval (including PIDE markup, completion etc.);
 wenzelm parents: 
56003diff
changeset | 167 | fun get_thm thy xname = | 
| 
ed92ce2ac88e
just one cumulative Proof_Context.facts, with uniform retrieval (including PIDE markup, completion etc.);
 wenzelm parents: 
56003diff
changeset | 168 | Facts.the_single (xname, Position.none) (get_thms thy xname); | 
| 4783 | 169 | |
| 61054 | 170 | fun transfer_theories thy = | 
| 171 | let | |
| 172 | val theories = | |
| 173 | fold (fn thy' => Symtab.update (Context.theory_name thy', thy')) | |
| 174 | (Theory.nodes_of thy) Symtab.empty; | |
| 175 | fun transfer th = | |
| 65458 | 176 | Thm.transfer (the_default thy (Symtab.lookup theories (Thm.theory_name th))) th; | 
| 61054 | 177 | in transfer end; | 
| 178 | ||
| 56161 | 179 | fun all_thms_of thy verbose = | 
| 180 | let | |
| 61054 | 181 | val transfer = transfer_theories thy; | 
| 56161 | 182 | val facts = facts_of thy; | 
| 183 | fun add (name, ths) = | |
| 184 | if not verbose andalso Facts.is_concealed facts name then I | |
| 61054 | 185 | else append (map (`(Thm.get_name_hint) o transfer) ths); | 
| 56161 | 186 | in Facts.fold_static add facts [] end; | 
| 16336 | 187 | |
| 70574 | 188 | fun get_thm_name thy ((name, i), pos) = | 
| 189 | let | |
| 190 | val facts = facts_of thy; | |
| 191 | fun print_name () = | |
| 192 | Facts.markup_extern (Proof_Context.init_global thy) facts name |-> Markup.markup; | |
| 193 | in | |
| 194 | (case (Facts.lookup (Context.Theory thy) facts name, i) of | |
| 195 |       (NONE, _) => error ("Undefined fact " ^ quote (print_name ()) ^ Position.here pos)
 | |
| 196 |     | (SOME {thms = [thm], ...}, 0) => thm
 | |
| 197 |     | (SOME {thms, ...}, 0) => Facts.err_single (print_name (), pos) thms
 | |
| 198 |     | (SOME {thms, ...}, _) =>
 | |
| 199 | if i > 0 andalso i <= length thms then nth thms (i - 1) | |
| 200 | else Facts.err_selection (print_name (), pos) i thms) | |
| 70894 | 201 | |> Thm.transfer thy | 
| 70574 | 202 | end; | 
| 203 | ||
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 204 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 205 | |
| 26488 
b497e3187ec7
eliminated destructive/critical theorem database;
 wenzelm parents: 
26471diff
changeset | 206 | (** store theorems **) | 
| 3987 | 207 | |
| 21580 | 208 | (* fact specifications *) | 
| 209 | ||
| 210 | fun burrow_fact f = split_list #>> burrow f #> op ~~; | |
| 211 | fun burrow_facts f = split_list ##> burrow (burrow_fact f) #> op ~~; | |
| 212 | ||
| 213 | ||
| 70430 | 214 | (* name theorems *) | 
| 4853 | 215 | |
| 70430 | 216 | abstype name_flags = No_Name_Flags | Name_Flags of {pre: bool, official: bool}
 | 
| 217 | with | |
| 12235 
5fa04fc9b254
Further restructuring of theorem naming functions.
 berghofe parents: 
12138diff
changeset | 218 | |
| 70430 | 219 | val unnamed = No_Name_Flags; | 
| 220 | val official1 = Name_Flags {pre = true, official = true};
 | |
| 221 | val official2 = Name_Flags {pre = false, official = true};
 | |
| 222 | val unofficial1 = Name_Flags {pre = true, official = false};
 | |
| 223 | val unofficial2 = Name_Flags {pre = false, official = false};
 | |
| 70427 | 224 | |
| 70494 | 225 | fun name_thm name_flags (name, pos) = | 
| 70459 
f0a445c5a82c
maintain sort constraints from type instantiations, with pro-forma derivation to collect oracles/thms;
 wenzelm parents: 
70431diff
changeset | 226 | Thm.solve_constraints #> (fn thm => | 
| 
f0a445c5a82c
maintain sort constraints from type instantiations, with pro-forma derivation to collect oracles/thms;
 wenzelm parents: 
70431diff
changeset | 227 | (case name_flags of | 
| 
f0a445c5a82c
maintain sort constraints from type instantiations, with pro-forma derivation to collect oracles/thms;
 wenzelm parents: 
70431diff
changeset | 228 | No_Name_Flags => thm | 
| 
f0a445c5a82c
maintain sort constraints from type instantiations, with pro-forma derivation to collect oracles/thms;
 wenzelm parents: 
70431diff
changeset | 229 |     | Name_Flags {pre, official} =>
 | 
| 
f0a445c5a82c
maintain sort constraints from type instantiations, with pro-forma derivation to collect oracles/thms;
 wenzelm parents: 
70431diff
changeset | 230 | thm | 
| 70543 
33749040b6f8
clarified derivation_name vs. raw_derivation_name;
 wenzelm parents: 
70494diff
changeset | 231 | |> (official andalso (not pre orelse Thm.raw_derivation_name thm = "")) ? | 
| 70494 | 232 | Thm.name_derivation (name, pos) | 
| 70459 
f0a445c5a82c
maintain sort constraints from type instantiations, with pro-forma derivation to collect oracles/thms;
 wenzelm parents: 
70431diff
changeset | 233 | |> (name <> "" andalso (not pre orelse not (Thm.has_name_hint thm))) ? | 
| 
f0a445c5a82c
maintain sort constraints from type instantiations, with pro-forma derivation to collect oracles/thms;
 wenzelm parents: 
70431diff
changeset | 234 | Thm.put_name_hint name)); | 
| 12872 
0855c3ab2047
Theorems are only "pre-named" if the do not already have names.
 berghofe parents: 
12711diff
changeset | 235 | |
| 70430 | 236 | end; | 
| 70427 | 237 | |
| 70550 | 238 | fun name_multi (name, pos) = | 
| 70574 | 239 | Thm_Name.make_list name #> (map o apfst) (fn thm_name => (Thm_Name.flatten thm_name, pos)); | 
| 70427 | 240 | |
| 70550 | 241 | fun name_thms name_flags name_pos = | 
| 242 | name_multi name_pos #> map (uncurry (name_thm name_flags)); | |
| 12235 
5fa04fc9b254
Further restructuring of theorem naming functions.
 berghofe parents: 
12138diff
changeset | 243 | |
| 4853 | 244 | |
| 70424 | 245 | (* apply theorems and attributes *) | 
| 4853 | 246 | |
| 67671 
857da80611ab
support for lazy notes in global/local context and Element.Lazy_Notes: name binding and fact without attributes;
 wenzelm parents: 
67663diff
changeset | 247 | fun register_proofs thms thy = (thms, Thm.register_proofs (Lazy.value thms) thy); | 
| 49010 | 248 | |
| 70494 | 249 | fun bind_name thy b = (Sign.full_name thy b, Binding.default_pos_of b); | 
| 250 | ||
| 68244 
e0cd57aeb60c
more checks for global facts: disallow undeclared frees (as in Export_Theory.export_fact);
 wenzelm parents: 
67779diff
changeset | 251 | fun add_facts (b, fact) thy = | 
| 
e0cd57aeb60c
more checks for global facts: disallow undeclared frees (as in Export_Theory.export_fact);
 wenzelm parents: 
67779diff
changeset | 252 | let | 
| 70494 | 253 | val (full_name, pos) = bind_name thy b; | 
| 68540 | 254 | fun check fact = | 
| 255 | fact |> map_index (fn (i, thm) => | |
| 256 | let | |
| 257 | fun err msg = | |
| 258 |             error ("Malformed global fact " ^
 | |
| 259 | quote (full_name ^ | |
| 260 |                 (if length fact = 1 then "" else "(" ^ string_of_int (i + 1) ^ ")")) ^
 | |
| 261 | Position.here pos ^ "\n" ^ msg); | |
| 262 | val prop = Thm.plain_prop_of thm | |
| 263 | handle THM _ => | |
| 264 | thm | |
| 265 | |> Thm.check_hyps (Context.Theory thy) | |
| 266 | |> Thm.full_prop_of; | |
| 267 | in | |
| 268 | ignore (Logic.unvarify_global (Term_Subst.zero_var_indexes prop)) | |
| 269 | handle TYPE (msg, _, _) => err msg | |
| 270 | | TERM (msg, _) => err msg | |
| 271 | | ERROR msg => err msg | |
| 272 | end); | |
| 273 | val arg = (b, Lazy.map_finished (tap check) fact); | |
| 68244 
e0cd57aeb60c
more checks for global facts: disallow undeclared frees (as in Export_Theory.export_fact);
 wenzelm parents: 
67779diff
changeset | 274 | in | 
| 70544 | 275 |     thy |> map_facts (Facts.add_static (Context.Theory thy) {strict = true, index = false} arg #> #2)
 | 
| 68244 
e0cd57aeb60c
more checks for global facts: disallow undeclared frees (as in Export_Theory.export_fact);
 wenzelm parents: 
67779diff
changeset | 276 | end; | 
| 67671 
857da80611ab
support for lazy notes in global/local context and Element.Lazy_Notes: name binding and fact without attributes;
 wenzelm parents: 
67663diff
changeset | 277 | |
| 68661 | 278 | fun check_thms_lazy (thms: thm list lazy) = | 
| 68701 
be936cf061ab
more robust: do not defer potentially slow/big lazy facts to the very end;
 wenzelm parents: 
68699diff
changeset | 279 | if Proofterm.proofs_enabled () orelse Options.default_bool "strict_facts" | 
| 
be936cf061ab
more robust: do not defer potentially slow/big lazy facts to the very end;
 wenzelm parents: 
68699diff
changeset | 280 | then Lazy.force_value thms else thms; | 
| 68661 | 281 | |
| 67671 
857da80611ab
support for lazy notes in global/local context and Element.Lazy_Notes: name binding and fact without attributes;
 wenzelm parents: 
67663diff
changeset | 282 | fun add_thms_lazy kind (b, thms) thy = | 
| 68661 | 283 | if Binding.is_empty b then Thm.register_proofs (check_thms_lazy thms) thy | 
| 30211 | 284 | else | 
| 285 | let | |
| 70494 | 286 | val name_pos = bind_name thy b; | 
| 68661 | 287 | val thms' = | 
| 288 | check_thms_lazy thms | |
| 70494 | 289 | |> Lazy.map_finished (name_thms official1 name_pos #> map (Thm.kind_rule kind)); | 
| 67671 
857da80611ab
support for lazy notes in global/local context and Element.Lazy_Notes: name binding and fact without attributes;
 wenzelm parents: 
67663diff
changeset | 290 | in thy |> Thm.register_proofs thms' |> add_facts (b, thms') end; | 
| 
857da80611ab
support for lazy notes in global/local context and Element.Lazy_Notes: name binding and fact without attributes;
 wenzelm parents: 
67663diff
changeset | 291 | |
| 70424 | 292 | val app_facts = | 
| 70552 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 293 | apfst flat oo fold_map (fn (thms, atts) => fn thy => | 
| 
8d7a531a6b58
maintain thm_name vs. derivation_id for global facts;
 wenzelm parents: 
70550diff
changeset | 294 | fold_map (Thm.theory_attributes atts) (map (Thm.transfer thy) thms) thy); | 
| 70424 | 295 | |
| 70430 | 296 | fun apply_facts name_flags1 name_flags2 (b, facts) thy = | 
| 71018 
d32ed8927a42
more robust expose_proofs corresponding to register_proofs/consolidate_theory;
 wenzelm parents: 
71006diff
changeset | 297 | if Binding.is_empty b then app_facts facts thy |-> register_proofs | 
| 67671 
857da80611ab
support for lazy notes in global/local context and Element.Lazy_Notes: name binding and fact without attributes;
 wenzelm parents: 
67663diff
changeset | 298 | else | 
| 
857da80611ab
support for lazy notes in global/local context and Element.Lazy_Notes: name binding and fact without attributes;
 wenzelm parents: 
67663diff
changeset | 299 | let | 
| 70985 
2866fee241ee
proper export of unnamed proof boxes for unnamed toplevel declarations, e.g. rulify/defn rules in theory IFOL and HOL;
 wenzelm parents: 
70904diff
changeset | 300 | val name_pos = bind_name thy b; | 
| 70424 | 301 | val (thms', thy') = thy | 
| 70494 | 302 | |> app_facts (map (apfst (name_thms name_flags1 name_pos)) facts) | 
| 303 | |>> name_thms name_flags2 name_pos |-> register_proofs; | |
| 67671 
857da80611ab
support for lazy notes in global/local context and Element.Lazy_Notes: name binding and fact without attributes;
 wenzelm parents: 
67663diff
changeset | 304 | val thy'' = thy' |> add_facts (b, Lazy.value thms'); | 
| 67663 | 305 | in (map (Thm.transfer thy'') thms', thy'') end; | 
| 26488 
b497e3187ec7
eliminated destructive/critical theorem database;
 wenzelm parents: 
26471diff
changeset | 306 | |
| 
b497e3187ec7
eliminated destructive/critical theorem database;
 wenzelm parents: 
26471diff
changeset | 307 | |
| 67715 | 308 | (* store_thm *) | 
| 26488 
b497e3187ec7
eliminated destructive/critical theorem database;
 wenzelm parents: 
26471diff
changeset | 309 | |
| 67715 | 310 | fun store_thm (b, th) = | 
| 70430 | 311 | apply_facts official1 official2 (b, [([th], [])]) #>> the_single; | 
| 26488 
b497e3187ec7
eliminated destructive/critical theorem database;
 wenzelm parents: 
26471diff
changeset | 312 | |
| 29579 | 313 | fun store_thm_open (b, th) = | 
| 70430 | 314 | apply_facts unofficial1 unofficial2 (b, [([th], [])]) #>> the_single; | 
| 3987 | 315 | |
| 16023 
66561f6814bd
added string_of_thmref, selections, fact_index_of, valid_thms;
 wenzelm parents: 
15975diff
changeset | 316 | |
| 6091 | 317 | (* add_thms(s) *) | 
| 4853 | 318 | |
| 70428 | 319 | val add_thmss = | 
| 70430 | 320 | fold_map (fn ((b, thms), atts) => apply_facts official1 official2 (b, [(thms, atts)])); | 
| 5907 | 321 | |
| 70428 | 322 | fun add_thms args = | 
| 323 | add_thmss (map (apfst (apsnd single)) args) #>> map the_single; | |
| 12235 
5fa04fc9b254
Further restructuring of theorem naming functions.
 berghofe parents: 
12138diff
changeset | 324 | |
| 27683 | 325 | val add_thm = yield_singleton add_thms; | 
| 5907 | 326 | |
| 327 | ||
| 57929 
c5063c033a5a
tuned signature -- proper Local_Theory.add_thms_dynamic;
 wenzelm parents: 
57887diff
changeset | 328 | (* dynamic theorems *) | 
| 26488 
b497e3187ec7
eliminated destructive/critical theorem database;
 wenzelm parents: 
26471diff
changeset | 329 | |
| 57929 
c5063c033a5a
tuned signature -- proper Local_Theory.add_thms_dynamic;
 wenzelm parents: 
57887diff
changeset | 330 | fun add_thms_dynamic' context arg thy = | 
| 70544 | 331 | let val (name, facts') = Facts.add_dynamic context arg (facts_of thy) | 
| 332 | in (name, map_facts (K facts') thy) end; | |
| 57929 
c5063c033a5a
tuned signature -- proper Local_Theory.add_thms_dynamic;
 wenzelm parents: 
57887diff
changeset | 333 | |
| 
c5063c033a5a
tuned signature -- proper Local_Theory.add_thms_dynamic;
 wenzelm parents: 
57887diff
changeset | 334 | fun add_thms_dynamic arg thy = | 
| 
c5063c033a5a
tuned signature -- proper Local_Theory.add_thms_dynamic;
 wenzelm parents: 
57887diff
changeset | 335 | add_thms_dynamic' (Context.Theory thy) arg thy |> snd; | 
| 26488 
b497e3187ec7
eliminated destructive/critical theorem database;
 wenzelm parents: 
26471diff
changeset | 336 | |
| 
b497e3187ec7
eliminated destructive/critical theorem database;
 wenzelm parents: 
26471diff
changeset | 337 | |
| 27728 | 338 | (* note_thmss *) | 
| 5907 | 339 | |
| 67713 | 340 | fun note_thms kind ((b, more_atts), facts) thy = | 
| 12711 | 341 | let | 
| 28965 | 342 | val name = Sign.full_name thy b; | 
| 70424 | 343 | val facts' = facts |> map (apsnd (fn atts => surround (Thm.kind kind) (atts @ more_atts))); | 
| 70430 | 344 | val (thms', thy') = thy |> apply_facts official1 official2 (b, facts'); | 
| 70424 | 345 | in ((name, thms'), thy') end; | 
| 67713 | 346 | |
| 347 | val note_thmss = fold_map o note_thms; | |
| 12711 | 348 | |
| 5280 | 349 | |
| 62170 | 350 | (* old-style defs *) | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 351 | |
| 4853 | 352 | local | 
| 35985 
0bbf0d2348f9
moved Drule.forall_intr_frees to Thm.forall_intr_frees (in more_thm.ML, which is loaded before pure_thy.ML);
 wenzelm parents: 
35856diff
changeset | 353 | |
| 62169 | 354 | fun add unchecked overloaded = fold_map (fn ((b, prop), atts) => fn thy => | 
| 35985 
0bbf0d2348f9
moved Drule.forall_intr_frees to Thm.forall_intr_frees (in more_thm.ML, which is loaded before pure_thy.ML);
 wenzelm parents: 
35856diff
changeset | 355 | let | 
| 62170 | 356 | val context = Defs.global_context thy; | 
| 61262 
7bd1eb4b056e
tuned signature: eliminated pointless type Context.pretty;
 wenzelm parents: 
61261diff
changeset | 357 | val ((_, def), thy') = Thm.add_def context unchecked overloaded (b, prop) thy; | 
| 35985 
0bbf0d2348f9
moved Drule.forall_intr_frees to Thm.forall_intr_frees (in more_thm.ML, which is loaded before pure_thy.ML);
 wenzelm parents: 
35856diff
changeset | 358 | val thm = def | 
| 
0bbf0d2348f9
moved Drule.forall_intr_frees to Thm.forall_intr_frees (in more_thm.ML, which is loaded before pure_thy.ML);
 wenzelm parents: 
35856diff
changeset | 359 | |> Thm.forall_intr_frees | 
| 
0bbf0d2348f9
moved Drule.forall_intr_frees to Thm.forall_intr_frees (in more_thm.ML, which is loaded before pure_thy.ML);
 wenzelm parents: 
35856diff
changeset | 360 | |> Thm.forall_elim_vars 0 | 
| 
0bbf0d2348f9
moved Drule.forall_intr_frees to Thm.forall_intr_frees (in more_thm.ML, which is loaded before pure_thy.ML);
 wenzelm parents: 
35856diff
changeset | 361 | |> Thm.varifyT_global; | 
| 70430 | 362 | in thy' |> apply_facts unnamed official2 (b, [([thm], atts)]) |>> the_single end); | 
| 35985 
0bbf0d2348f9
moved Drule.forall_intr_frees to Thm.forall_intr_frees (in more_thm.ML, which is loaded before pure_thy.ML);
 wenzelm parents: 
35856diff
changeset | 363 | |
| 4853 | 364 | in | 
| 35985 
0bbf0d2348f9
moved Drule.forall_intr_frees to Thm.forall_intr_frees (in more_thm.ML, which is loaded before pure_thy.ML);
 wenzelm parents: 
35856diff
changeset | 365 | |
| 62169 | 366 | val add_defs = add false; | 
| 367 | val add_defs_unchecked = add true; | |
| 35985 
0bbf0d2348f9
moved Drule.forall_intr_frees to Thm.forall_intr_frees (in more_thm.ML, which is loaded before pure_thy.ML);
 wenzelm parents: 
35856diff
changeset | 368 | |
| 4853 | 369 | end; | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 370 | |
| 3987 | 371 | end; |