| author | paulson | 
| Fri, 10 May 2002 10:22:45 +0200 | |
| changeset 13128 | 99f6a9f0328a | 
| parent 12872 | 0855c3ab2047 | 
| child 13274 | 191419fac368 | 
| permissions | -rw-r--r-- | 
| 3987 | 1 | (* Title: Pure/pure_thy.ML | 
| 2 | ID: $Id$ | |
| 3 | Author: Markus Wenzel, TU Muenchen | |
| 9318 | 4 | License: GPL (GNU GENERAL PUBLIC LICENSE) | 
| 3987 | 5 | |
| 5091 | 6 | Theorem database, derived theory operations, and the ProtoPure theory. | 
| 3987 | 7 | *) | 
| 8 | ||
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 9 | signature BASIC_PURE_THY = | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 10 | sig | 
| 5000 | 11 | val print_theorems: theory -> unit | 
| 12 | val print_theory: theory -> unit | |
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 13 | val get_thm: theory -> xstring -> thm | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 14 | val get_thms: theory -> xstring -> thm list | 
| 6094 | 15 | val get_thmss: theory -> xstring list -> thm list | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 16 | val thms_of: theory -> (string * thm) list | 
| 5091 | 17 | structure ProtoPure: | 
| 18 | sig | |
| 19 | val thy: theory | |
| 20 | val flexpair_def: thm | |
| 21 | val Goal_def: thm | |
| 22 | end | |
| 4853 | 23 | end; | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 24 | |
| 3987 | 25 | signature PURE_THY = | 
| 26 | sig | |
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 27 | include BASIC_PURE_THY | 
| 9808 | 28 | val get_thm_closure: theory -> xstring -> thm | 
| 9564 | 29 | val get_thms_closure: theory -> xstring -> thm list | 
| 30 | val single_thm: string -> thm list -> thm | |
| 6367 | 31 | val cond_extern_thm_sg: Sign.sg -> string -> xstring | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 32 | val thms_containing: theory -> string list -> (string * thm) list | 
| 12695 | 33 | val hide_thms: bool -> string list -> theory -> theory | 
| 6091 | 34 | val store_thm: (bstring * thm) * theory attribute list -> theory -> theory * thm | 
| 7405 | 35 | 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 | 36 | val smart_store_thms_open: (bstring * thm list) -> thm list | 
| 7899 | 37 | val forall_elim_var: int -> thm -> thm | 
| 38 | val forall_elim_vars: int -> thm -> thm | |
| 8419 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 wenzelm parents: 
8039diff
changeset | 39 | val add_thms: ((bstring * thm) * theory attribute list) list -> theory -> theory * thm list | 
| 12711 | 40 | val add_thmss: ((bstring * thm list) * theory attribute list) list -> theory | 
| 41 | -> theory * thm list list | |
| 42 | val have_thmss: theory attribute -> ((bstring * theory attribute list) * | |
| 43 | (xstring * theory attribute list) list) list -> theory -> theory * (bstring * thm list) list | |
| 44 | val have_thmss_i: theory attribute -> ((bstring * theory attribute list) * | |
| 45 | (thm list * theory attribute list) list) list -> theory -> theory * (bstring * thm list) list | |
| 8419 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 wenzelm parents: 
8039diff
changeset | 46 | val add_axioms: ((bstring * string) * theory attribute list) list -> theory -> theory * thm list | 
| 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 wenzelm parents: 
8039diff
changeset | 47 | val add_axioms_i: ((bstring * term) * theory attribute list) list -> theory -> theory * thm list | 
| 12711 | 48 | val add_axiomss: ((bstring * string list) * theory attribute list) list -> theory | 
| 49 | -> theory * thm list list | |
| 50 | val add_axiomss_i: ((bstring * term list) * theory attribute list) list -> theory | |
| 51 | -> theory * thm list list | |
| 9318 | 52 | val add_defs: bool -> ((bstring * string) * theory attribute list) list | 
| 53 | -> theory -> theory * thm list | |
| 54 | val add_defs_i: bool -> ((bstring * term) * theory attribute list) list | |
| 55 | -> theory -> theory * thm list | |
| 56 | val add_defss: bool -> ((bstring * string list) * theory attribute list) list | |
| 57 | -> theory -> theory * thm list list | |
| 58 | val add_defss_i: bool -> ((bstring * term list) * theory attribute list) list | |
| 59 | -> theory -> theory * thm list list | |
| 4963 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 60 | val get_name: theory -> string | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 61 | val put_name: string -> theory -> theory | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 62 | val global_path: theory -> theory | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 63 | val local_path: theory -> theory | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 64 | val begin_theory: string -> theory list -> theory | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 65 | val end_theory: theory -> theory | 
| 6682 | 66 | val checkpoint: theory -> theory | 
| 4922 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 67 | val add_typedecls: (bstring * string list * mixfix) list -> theory -> theory | 
| 3987 | 68 | end; | 
| 69 | ||
| 70 | structure PureThy: PURE_THY = | |
| 71 | struct | |
| 72 | ||
| 73 | ||
| 4922 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 74 | (*** theorem database ***) | 
| 3987 | 75 | |
| 4922 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 76 | (** data kind 'Pure/theorems' **) | 
| 3987 | 77 | |
| 5005 | 78 | structure TheoremsDataArgs = | 
| 79 | struct | |
| 80 | val name = "Pure/theorems"; | |
| 3987 | 81 | |
| 5005 | 82 | type T = | 
| 83 |     {space: NameSpace.T,
 | |
| 6091 | 84 | thms_tab: thm list Symtab.table, | 
| 85 | const_idx: int * (int * thm) list Symtab.table} ref; | |
| 3987 | 86 | |
| 4853 | 87 | fun mk_empty _ = | 
| 5005 | 88 |     ref {space = NameSpace.empty, thms_tab = Symtab.empty, const_idx = (0, Symtab.empty)} : T;
 | 
| 3987 | 89 | |
| 5005 | 90 | val empty = mk_empty (); | 
| 6547 | 91 | fun copy (ref x) = ref x; | 
| 5005 | 92 | val prep_ext = mk_empty; | 
| 93 | val merge = mk_empty; | |
| 94 | ||
| 8720 | 95 |   fun pretty sg (ref {space, thms_tab, const_idx = _}) =
 | 
| 4853 | 96 | let | 
| 10008 | 97 | val prt_thm = Display.pretty_thm_sg sg; | 
| 4853 | 98 | fun prt_thms (name, [th]) = | 
| 99 | Pretty.block [Pretty.str (name ^ ":"), Pretty.brk 1, prt_thm th] | |
| 100 | | prt_thms (name, ths) = Pretty.big_list (name ^ ":") (map prt_thm ths); | |
| 3987 | 101 | |
| 6846 | 102 | val thmss = NameSpace.cond_extern_table space thms_tab; | 
| 9215 | 103 | in Pretty.big_list "theorems:" (map prt_thms thmss) end; | 
| 8720 | 104 | |
| 9215 | 105 | fun print sg data = Pretty.writeln (pretty sg data); | 
| 3987 | 106 | end; | 
| 107 | ||
| 5005 | 108 | structure TheoremsData = TheoryDataFun(TheoremsDataArgs); | 
| 109 | val get_theorems_sg = TheoremsData.get_sg; | |
| 110 | val get_theorems = TheoremsData.get; | |
| 111 | ||
| 6367 | 112 | val cond_extern_thm_sg = NameSpace.cond_extern o #space o ! o get_theorems_sg; | 
| 113 | ||
| 3987 | 114 | |
| 5000 | 115 | (* print theory *) | 
| 3987 | 116 | |
| 5005 | 117 | val print_theorems = TheoremsData.print; | 
| 8720 | 118 | |
| 5000 | 119 | fun print_theory thy = | 
| 9215 | 120 | Display.pretty_full_theory thy @ | 
| 121 | [TheoremsDataArgs.pretty (Theory.sign_of thy) (get_theorems thy)] | |
| 8720 | 122 | |> Pretty.chunks |> Pretty.writeln; | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 123 | |
| 3987 | 124 | |
| 125 | ||
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 126 | (** retrieve theorems **) | 
| 3987 | 127 | |
| 9564 | 128 | (* selections *) | 
| 129 | ||
| 130 | fun the_thms _ (Some thms) = thms | |
| 131 |   | the_thms name None = error ("Unknown theorem(s) " ^ quote name);
 | |
| 4037 | 132 | |
| 9564 | 133 | fun single_thm _ [thm] = thm | 
| 134 |   | single_thm name _ = error ("Single theorem expected " ^ quote name);
 | |
| 135 | ||
| 136 | ||
| 9808 | 137 | (* get_thm(s)_closure -- statically scoped versions *) | 
| 9564 | 138 | |
| 139 | (*beware of proper order of evaluation!*) | |
| 4922 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 140 | |
| 9564 | 141 | fun lookup_thms thy = | 
| 142 | let | |
| 143 | val sg_ref = Sign.self_ref (Theory.sign_of thy); | |
| 144 |     val ref {space, thms_tab, ...} = get_theorems thy;
 | |
| 145 | in | |
| 146 | fn name => | |
| 10667 | 147 | apsome (map (Thm.transfer_sg (Sign.deref sg_ref))) (*semi-dynamic identity*) | 
| 9564 | 148 | (Symtab.lookup (thms_tab, NameSpace.intern space name)) (*static content*) | 
| 149 | end; | |
| 3987 | 150 | |
| 9564 | 151 | fun get_thms_closure thy = | 
| 152 | let val closures = map lookup_thms (thy :: Theory.ancestors_of thy) | |
| 153 | in fn name => the_thms name (get_first (fn f => f name) closures) end; | |
| 154 | ||
| 9808 | 155 | fun get_thm_closure thy = | 
| 156 | let val get = get_thms_closure thy | |
| 157 | in fn name => single_thm name (get name) end; | |
| 158 | ||
| 9564 | 159 | |
| 160 | (* get_thm etc. *) | |
| 161 | ||
| 162 | fun get_thms theory name = | |
| 163 | get_first (fn thy => lookup_thms thy name) (theory :: Theory.ancestors_of theory) | |
| 164 | |> the_thms name |> map (Thm.transfer theory); | |
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 165 | |
| 6091 | 166 | fun get_thmss thy names = flat (map (get_thms thy) names); | 
| 9564 | 167 | fun get_thm thy name = single_thm name (get_thms thy name); | 
| 4783 | 168 | |
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 169 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 170 | (* thms_of *) | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 171 | |
| 6091 | 172 | fun attach_name thm = (Thm.name_of_thm thm, thm); | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 173 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 174 | fun thms_of thy = | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 175 |   let val ref {thms_tab, ...} = get_theorems thy in
 | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 176 | map attach_name (flat (map snd (Symtab.dest thms_tab))) | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 177 | end; | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 178 | |
| 3987 | 179 | |
| 180 | ||
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 181 | (** theorems indexed by constants **) | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 182 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 183 | (* make index *) | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 184 | |
| 6091 | 185 | fun add_const_idx ((next, table), thm) = | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 186 | let | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 187 |     val {hyps, prop, ...} = Thm.rep_thm thm;
 | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 188 | val consts = | 
| 7805 
0ae9ddc36fe0
theorem database now also indexes constants "Trueprop", "all",
 wenzelm parents: 
7753diff
changeset | 189 | foldr add_term_consts (hyps, add_term_consts (prop, [])); | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 190 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 191 | fun add (tab, c) = | 
| 6091 | 192 | Symtab.update ((c, (next, thm) :: Symtab.lookup_multi (tab, c)), tab); | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 193 | in (next + 1, foldl add (table, consts)) end; | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 194 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 195 | fun make_const_idx thm_tab = | 
| 5686 | 196 | Symtab.foldl (fn (x, (_, ths)) => foldl add_const_idx (x, ths)) ((0, Symtab.empty), thm_tab); | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 197 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 198 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 199 | (* lookup index *) | 
| 3987 | 200 | |
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 201 | (*search locally*) | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 202 | fun containing [] thy = thms_of thy | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 203 | | containing consts thy = | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 204 | let | 
| 4037 | 205 | fun int ([], _) = [] | 
| 206 | | int (_, []) = [] | |
| 207 | | int (xxs as ((x as (i:int, _)) :: xs), yys as ((y as (j, _)) :: ys)) = | |
| 208 | if i = j then x :: int (xs, ys) | |
| 209 | else if i > j then int (xs, yys) | |
| 210 | else int (xxs, ys); | |
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 211 | |
| 4037 | 212 | fun ints [xs] = xs | 
| 213 | | ints xss = if exists null xss then [] else foldl int (hd xss, tl xss); | |
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 214 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 215 |         val ref {const_idx = (_, ctab), ...} = get_theorems thy;
 | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 216 | val ithmss = map (fn c => Symtab.lookup_multi (ctab, c)) consts; | 
| 6977 | 217 | in map (attach_name o snd) (ints ithmss) end; | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 218 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 219 | (*search globally*) | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 220 | fun thms_containing thy consts = | 
| 6977 | 221 | (case filter (is_none o Sign.const_type (Theory.sign_of thy)) consts of | 
| 7805 
0ae9ddc36fe0
theorem database now also indexes constants "Trueprop", "all",
 wenzelm parents: 
7753diff
changeset | 222 | [] => flat (map (containing consts) (thy :: Theory.ancestors_of thy)) | 
| 10008 | 223 |   | cs => raise THEORY ("thms_containing: undeclared consts " ^ commas_quote cs, [thy]))
 | 
| 224 | |> map (apsnd (Thm.transfer thy)); | |
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 225 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 226 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 227 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 228 | (** store theorems **) (*DESTRUCTIVE*) | 
| 3987 | 229 | |
| 12695 | 230 | (* hiding -- affects current theory node only! *) | 
| 231 | ||
| 232 | fun hide_thms b names thy = | |
| 233 | let | |
| 234 |     val r as ref {space, thms_tab, const_idx} = get_theorems thy;
 | |
| 235 | val space' = NameSpace.hide b (space, names); | |
| 236 |   in r := {space = space', thms_tab = thms_tab, const_idx = const_idx}; thy end;
 | |
| 237 | ||
| 238 | ||
| 4853 | 239 | (* naming *) | 
| 240 | ||
| 11998 | 241 | fun gen_names j len name = | 
| 242 | map (fn i => name ^ "_" ^ string_of_int i) (j+1 upto j+len); | |
| 4853 | 243 | |
| 11998 | 244 | fun name_multi name xs = gen_names 0 (length xs) name ~~ xs; | 
| 12235 
5fa04fc9b254
Further restructuring of theorem naming functions.
 berghofe parents: 
12138diff
changeset | 245 | |
| 12872 
0855c3ab2047
Theorems are only "pre-named" if the do not already have names.
 berghofe parents: 
12711diff
changeset | 246 | fun name_thm pre (p as (_, thm)) = | 
| 
0855c3ab2047
Theorems are only "pre-named" if the do not already have names.
 berghofe parents: 
12711diff
changeset | 247 | if Thm.name_of_thm thm <> "" andalso pre then thm else Thm.name_thm p; | 
| 
0855c3ab2047
Theorems are only "pre-named" if the do not already have names.
 berghofe parents: 
12711diff
changeset | 248 | |
| 
0855c3ab2047
Theorems are only "pre-named" if the do not already have names.
 berghofe parents: 
12711diff
changeset | 249 | fun name_thms pre name [x] = [name_thm pre (name, x)] | 
| 
0855c3ab2047
Theorems are only "pre-named" if the do not already have names.
 berghofe parents: 
12711diff
changeset | 250 | | 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 | 251 | |
| 
5fa04fc9b254
Further restructuring of theorem naming functions.
 berghofe parents: 
12138diff
changeset | 252 | fun name_thmss name xs = (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 | 253 | [([x], z)] => [([name_thm true (name, x)], z)] | 
| 12235 
5fa04fc9b254
Further restructuring of theorem naming functions.
 berghofe parents: 
12138diff
changeset | 254 | | _ => snd (foldl_map (fn (i, (ys, z)) => (i + length ys, | 
| 12872 
0855c3ab2047
Theorems are only "pre-named" if the do not already have names.
 berghofe parents: 
12711diff
changeset | 255 | (map (name_thm true) (gen_names i (length ys) name ~~ ys), z))) (0, xs))); | 
| 4853 | 256 | |
| 257 | ||
| 11998 | 258 | (* enter_thms *) | 
| 4853 | 259 | |
| 7470 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 wenzelm parents: 
7405diff
changeset | 260 | 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 | 261 | fun warn_same name = warning ("Theorem database already contains a copy of " ^ quote name);
 | 
| 3987 | 262 | |
| 11998 | 263 | fun enter_thms _ _ _ app_att thy ("", thms) = app_att (thy, thms)
 | 
| 264 | | enter_thms sg pre_name post_name app_att thy (bname, thms) = | |
| 7470 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 wenzelm parents: 
7405diff
changeset | 265 | let | 
| 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 wenzelm parents: 
7405diff
changeset | 266 | val name = Sign.full_name sg bname; | 
| 11998 | 267 | val (thy', thms') = app_att (thy, pre_name name thms); | 
| 268 | val named_thms = post_name name thms'; | |
| 3987 | 269 | |
| 7470 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 wenzelm parents: 
7405diff
changeset | 270 |         val r as ref {space, thms_tab, const_idx} = get_theorems_sg sg;
 | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 271 | |
| 7470 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 wenzelm parents: 
7405diff
changeset | 272 | val overwrite = | 
| 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 wenzelm parents: 
7405diff
changeset | 273 | (case Symtab.lookup (thms_tab, name) of | 
| 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 wenzelm parents: 
7405diff
changeset | 274 | None => false | 
| 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 wenzelm parents: 
7405diff
changeset | 275 | | Some thms' => | 
| 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 wenzelm parents: 
7405diff
changeset | 276 | if Library.equal_lists Thm.eq_thm (thms', named_thms) then (warn_same name; false) | 
| 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 wenzelm parents: 
7405diff
changeset | 277 | else (warn_overwrite name; true)); | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 278 | |
| 7470 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 wenzelm parents: 
7405diff
changeset | 279 | val space' = NameSpace.extend (space, [name]); | 
| 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 wenzelm parents: 
7405diff
changeset | 280 | val thms_tab' = Symtab.update ((name, named_thms), thms_tab); | 
| 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 wenzelm parents: 
7405diff
changeset | 281 | val const_idx' = | 
| 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 wenzelm parents: 
7405diff
changeset | 282 | if overwrite then make_const_idx thms_tab' | 
| 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 wenzelm parents: 
7405diff
changeset | 283 | else foldl add_const_idx (const_idx, named_thms); | 
| 11998 | 284 |       in r := {space = space', thms_tab = thms_tab', const_idx = const_idx'};
 | 
| 285 | (thy', named_thms) | |
| 286 | end; | |
| 3987 | 287 | |
| 4853 | 288 | |
| 6091 | 289 | (* add_thms(s) *) | 
| 4853 | 290 | |
| 12235 
5fa04fc9b254
Further restructuring of theorem naming functions.
 berghofe parents: 
12138diff
changeset | 291 | fun add_thms_atts pre_name ((bname, thms), atts) thy = | 
| 12872 
0855c3ab2047
Theorems are only "pre-named" if the do not already have names.
 berghofe parents: 
12711diff
changeset | 292 | enter_thms (Theory.sign_of thy) pre_name (name_thms false) | 
| 11998 | 293 | (Thm.applys_attributes o rpair atts) thy (bname, thms); | 
| 4853 | 294 | |
| 12235 
5fa04fc9b254
Further restructuring of theorem naming functions.
 berghofe parents: 
12138diff
changeset | 295 | fun gen_add_thmss pre_name args theory = | 
| 
5fa04fc9b254
Further restructuring of theorem naming functions.
 berghofe parents: 
12138diff
changeset | 296 | foldl_map (fn (thy, arg) => add_thms_atts pre_name arg thy) (theory, args); | 
| 5907 | 297 | |
| 12235 
5fa04fc9b254
Further restructuring of theorem naming functions.
 berghofe parents: 
12138diff
changeset | 298 | fun gen_add_thms pre_name args = | 
| 
5fa04fc9b254
Further restructuring of theorem naming functions.
 berghofe parents: 
12138diff
changeset | 299 | apsnd (map hd) o gen_add_thmss pre_name (map (apfst (apsnd single)) args); | 
| 
5fa04fc9b254
Further restructuring of theorem naming functions.
 berghofe parents: 
12138diff
changeset | 300 | |
| 12872 
0855c3ab2047
Theorems are only "pre-named" if the do not already have names.
 berghofe parents: 
12711diff
changeset | 301 | 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 | 302 | val add_thms = gen_add_thms (name_thms true); | 
| 5907 | 303 | |
| 304 | ||
| 12711 | 305 | (* have_thmss(_i) *) | 
| 5907 | 306 | |
| 9192 | 307 | local | 
| 12711 | 308 | |
| 309 | fun gen_have_thss get kind_att (thy, ((bname, more_atts), ths_atts)) = | |
| 310 | let | |
| 311 | fun app (x, (ths, atts)) = Thm.applys_attributes ((x, ths), atts); | |
| 312 | val (thy', thms) = enter_thms (Theory.sign_of thy) | |
| 12872 
0855c3ab2047
Theorems are only "pre-named" if the do not already have names.
 berghofe parents: 
12711diff
changeset | 313 | name_thmss (name_thms false) (apsnd flat o foldl_map app) thy | 
| 12711 | 314 | (bname, map (fn (ths, atts) => (get thy ths, atts @ more_atts @ [kind_att])) ths_atts); | 
| 315 | in (thy', (bname, thms)) end; | |
| 316 | ||
| 317 | fun gen_have_thmss get kind_att args thy = | |
| 318 | foldl_map (gen_have_thss get kind_att) (thy, args); | |
| 319 | ||
| 9192 | 320 | in | 
| 12711 | 321 | |
| 322 | val have_thmss = gen_have_thmss get_thms; | |
| 323 | val have_thmss_i = gen_have_thmss (K I); | |
| 324 | ||
| 9192 | 325 | end; | 
| 5280 | 326 | |
| 327 | ||
| 6091 | 328 | (* store_thm *) | 
| 5280 | 329 | |
| 11998 | 330 | fun store_thm ((bname, thm), atts) thy = | 
| 12872 
0855c3ab2047
Theorems are only "pre-named" if the do not already have names.
 berghofe parents: 
12711diff
changeset | 331 | let val (thy', [th']) = add_thms_atts (name_thms true) ((bname, [thm]), atts) thy | 
| 5280 | 332 | in (thy', th') end; | 
| 3987 | 333 | |
| 334 | ||
| 7405 | 335 | (* smart_store_thms *) | 
| 3987 | 336 | |
| 12235 
5fa04fc9b254
Further restructuring of theorem naming functions.
 berghofe parents: 
12138diff
changeset | 337 | fun gen_smart_store_thms _ (name, []) = | 
| 11516 
a0633bdcd015
Added equality axioms and initialization of proof term package.
 berghofe parents: 
10667diff
changeset | 338 |       error ("Cannot store empty list of theorems: " ^ quote name)
 | 
| 12235 
5fa04fc9b254
Further restructuring of theorem naming functions.
 berghofe parents: 
12138diff
changeset | 339 | | gen_smart_store_thms name_thm (name, [thm]) = | 
| 12872 
0855c3ab2047
Theorems are only "pre-named" if the do not already have names.
 berghofe parents: 
12711diff
changeset | 340 | snd (enter_thms (Thm.sign_of_thm thm) (name_thm true) (name_thm false) | 
| 
0855c3ab2047
Theorems are only "pre-named" if the do not already have names.
 berghofe parents: 
12711diff
changeset | 341 | I () (name, [thm])) | 
| 12235 
5fa04fc9b254
Further restructuring of theorem naming functions.
 berghofe parents: 
12138diff
changeset | 342 | | gen_smart_store_thms name_thm (name, thms) = | 
| 7405 | 343 | let | 
| 344 | val merge_sg = Sign.merge_refs o apsnd (Sign.self_ref o Thm.sign_of_thm); | |
| 345 | val sg_ref = foldl merge_sg (Sign.self_ref (Thm.sign_of_thm (hd thms)), tl thms); | |
| 12872 
0855c3ab2047
Theorems are only "pre-named" if the do not already have names.
 berghofe parents: 
12711diff
changeset | 346 | in snd (enter_thms (Sign.deref sg_ref) (name_thm true) (name_thm false) | 
| 
0855c3ab2047
Theorems are only "pre-named" if the do not already have names.
 berghofe parents: 
12711diff
changeset | 347 | I () (name, thms)) | 
| 
0855c3ab2047
Theorems are only "pre-named" if the do not already have names.
 berghofe parents: 
12711diff
changeset | 348 | end; | 
| 11516 
a0633bdcd015
Added equality axioms and initialization of proof term package.
 berghofe parents: 
10667diff
changeset | 349 | |
| 12235 
5fa04fc9b254
Further restructuring of theorem naming functions.
 berghofe parents: 
12138diff
changeset | 350 | val smart_store_thms = gen_smart_store_thms name_thms; | 
| 12872 
0855c3ab2047
Theorems are only "pre-named" if the do not already have names.
 berghofe parents: 
12711diff
changeset | 351 | val smart_store_thms_open = gen_smart_store_thms (K (K I)); | 
| 3987 | 352 | |
| 353 | ||
| 7899 | 354 | (* forall_elim_vars (belongs to drule.ML) *) | 
| 355 | ||
| 356 | (*Replace outermost quantified variable by Var of given index. | |
| 357 | Could clash with Vars already present.*) | |
| 358 | fun forall_elim_var i th = | |
| 359 |     let val {prop,sign,...} = rep_thm th
 | |
| 360 | in case prop of | |
| 361 |           Const("all",_) $ Abs(a,T,_) =>
 | |
| 362 | forall_elim (cterm_of sign (Var((a,i), T))) th | |
| 363 |         | _ => raise THM("forall_elim_var", i, [th])
 | |
| 364 | end; | |
| 365 | ||
| 366 | (*Repeat forall_elim_var until all outer quantifiers are removed*) | |
| 367 | fun forall_elim_vars i th = | |
| 368 | forall_elim_vars i (forall_elim_var i th) | |
| 369 | handle THM _ => th; | |
| 370 | ||
| 371 | ||
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 372 | (* store axioms as theorems *) | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 373 | |
| 4853 | 374 | local | 
| 7899 | 375 | fun get_axs thy named_axs = | 
| 376 | map (forall_elim_vars 0 o Thm.get_axiom thy o fst) named_axs; | |
| 7753 | 377 | |
| 8419 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 wenzelm parents: 
8039diff
changeset | 378 | fun add_single add (thy, ((name, ax), atts)) = | 
| 4853 | 379 | let | 
| 11998 | 380 | val named_ax = [(name, ax)]; | 
| 7753 | 381 | val thy' = add named_ax thy; | 
| 382 | val thm = hd (get_axs thy' named_ax); | |
| 12235 
5fa04fc9b254
Further restructuring of theorem naming functions.
 berghofe parents: 
12138diff
changeset | 383 | in apsnd hd (gen_add_thms (K I) [((name, thm), atts)] thy') end; | 
| 7753 | 384 | |
| 8419 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 wenzelm parents: 
8039diff
changeset | 385 | fun add_multi add (thy, ((name, axs), atts)) = | 
| 7753 | 386 | let | 
| 387 | val named_axs = name_multi name axs; | |
| 4853 | 388 | val thy' = add named_axs thy; | 
| 7753 | 389 | val thms = get_axs thy' named_axs; | 
| 12235 
5fa04fc9b254
Further restructuring of theorem naming functions.
 berghofe parents: 
12138diff
changeset | 390 | in apsnd hd (gen_add_thmss (K I) [((name, thms), atts)] thy') end; | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 391 | |
| 8419 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 wenzelm parents: 
8039diff
changeset | 392 | fun add_singles add args thy = foldl_map (add_single add) (thy, args); | 
| 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 wenzelm parents: 
8039diff
changeset | 393 | fun add_multis add args thy = foldl_map (add_multi add) (thy, args); | 
| 4853 | 394 | in | 
| 7753 | 395 | val add_axioms = add_singles Theory.add_axioms; | 
| 396 | val add_axioms_i = add_singles Theory.add_axioms_i; | |
| 397 | val add_axiomss = add_multis Theory.add_axioms; | |
| 398 | val add_axiomss_i = add_multis Theory.add_axioms_i; | |
| 9318 | 399 | val add_defs = add_singles o Theory.add_defs; | 
| 400 | val add_defs_i = add_singles o Theory.add_defs_i; | |
| 401 | val add_defss = add_multis o Theory.add_defs; | |
| 402 | val add_defss_i = add_multis o Theory.add_defs_i; | |
| 4853 | 403 | end; | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 404 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 405 | |
| 3987 | 406 | |
| 4963 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 407 | (*** derived theory operations ***) | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 408 | |
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 409 | (** theory management **) | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 410 | |
| 5005 | 411 | (* data kind 'Pure/theory_management' *) | 
| 4963 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 412 | |
| 5005 | 413 | structure TheoryManagementDataArgs = | 
| 414 | struct | |
| 415 | val name = "Pure/theory_management"; | |
| 6660 | 416 |   type T = {name: string, version: int};
 | 
| 5000 | 417 | |
| 6660 | 418 |   val empty = {name = "", version = 0};
 | 
| 6547 | 419 | val copy = I; | 
| 5005 | 420 | val prep_ext = I; | 
| 5000 | 421 | fun merge _ = empty; | 
| 5005 | 422 | fun print _ _ = (); | 
| 4963 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 423 | end; | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 424 | |
| 5005 | 425 | structure TheoryManagementData = TheoryDataFun(TheoryManagementDataArgs); | 
| 426 | val get_info = TheoryManagementData.get; | |
| 427 | val put_info = TheoryManagementData.put; | |
| 428 | ||
| 4963 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 429 | |
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 430 | (* get / put name *) | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 431 | |
| 5000 | 432 | val get_name = #name o get_info; | 
| 6660 | 433 | fun put_name name = put_info {name = name, version = 0};
 | 
| 4963 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 434 | |
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 435 | |
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 436 | (* control prefixing of theory name *) | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 437 | |
| 5210 | 438 | val global_path = Theory.root_path; | 
| 4963 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 439 | |
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 440 | fun local_path thy = | 
| 5210 | 441 | thy |> Theory.root_path |> Theory.add_path (get_name thy); | 
| 4963 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 442 | |
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 443 | |
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 444 | (* begin / end theory *) | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 445 | |
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 446 | fun begin_theory name thys = | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 447 | Theory.prep_ext_merge thys | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 448 | |> put_name name | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 449 | |> local_path; | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 450 | |
| 12123 | 451 | fun end_theory thy = | 
| 452 | thy | |
| 453 | |> Theory.add_name (get_name thy); | |
| 4963 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 454 | |
| 6682 | 455 | fun checkpoint thy = | 
| 456 | if is_draft thy then | |
| 457 |     let val {name, version} = get_info thy in
 | |
| 458 | thy | |
| 459 | |> Theory.add_name (name ^ ":" ^ string_of_int version) | |
| 460 |       |> put_info {name = name, version = version + 1}
 | |
| 461 | end | |
| 462 | else thy; | |
| 5000 | 463 | |
| 464 | ||
| 4963 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 465 | |
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 466 | (** add logical types **) | 
| 4922 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 467 | |
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 468 | fun add_typedecls decls thy = | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 469 | let | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 470 | val full = Sign.full_name (Theory.sign_of thy); | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 471 | |
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 472 | fun type_of (raw_name, vs, mx) = | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 473 | if null (duplicates vs) then (raw_name, length vs, mx) | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 474 |       else error ("Duplicate parameters in type declaration: " ^ quote raw_name);
 | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 475 | |
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 476 | fun arity_of (raw_name, len, mx) = | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 477 | (full (Syntax.type_name raw_name mx), replicate len logicS, logicS); | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 478 | |
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 479 | val types = map type_of decls; | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 480 | val arities = map arity_of types; | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 481 | in | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 482 | thy | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 483 | |> Theory.add_types types | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 484 | |> Theory.add_arities_i arities | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 485 | end; | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 486 | |
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 487 | |
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 488 | |
| 5091 | 489 | (*** the ProtoPure theory ***) | 
| 3987 | 490 | |
| 491 | val proto_pure = | |
| 492 | Theory.pre_pure | |
| 11516 
a0633bdcd015
Added equality axioms and initialization of proof term package.
 berghofe parents: 
10667diff
changeset | 493 | |> Library.apply [TheoremsData.init, TheoryManagementData.init, Proofterm.init] | 
| 4963 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 494 | |> put_name "ProtoPure" | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 495 | |> global_path | 
| 3987 | 496 | |> Theory.add_types | 
| 4922 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 497 |    [("fun", 2, NoSyn),
 | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 498 |     ("prop", 0, NoSyn),
 | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 499 |     ("itself", 1, NoSyn),
 | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 500 |     ("dummy", 0, NoSyn)]
 | 
| 3987 | 501 | |> Theory.add_classes_i [(logicC, [])] | 
| 502 | |> Theory.add_defsort_i logicS | |
| 503 | |> Theory.add_arities_i | |
| 504 |    [("fun", [logicS, logicS], logicS),
 | |
| 505 |     ("prop", [], logicS),
 | |
| 506 |     ("itself", [logicS], logicS)]
 | |
| 4922 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 507 | |> Theory.add_nonterminals Syntax.pure_nonterms | 
| 3987 | 508 | |> Theory.add_syntax Syntax.pure_syntax | 
| 6692 | 509 | |> Theory.add_modesyntax (Symbol.xsymbolsN, true) Syntax.pure_xsym_syntax | 
| 3987 | 510 | |> Theory.add_syntax | 
| 7949 | 511 |    [("==>", "[prop, prop] => prop", Delimfix "op ==>"),
 | 
| 9534 | 512 | (Term.dummy_patternN, "aprop", Delimfix "'_")] | 
| 3987 | 513 | |> Theory.add_consts | 
| 514 |    [("==", "['a::{}, 'a] => prop", InfixrName ("==", 2)),
 | |
| 515 |     ("=?=", "['a::{}, 'a] => prop", InfixrName ("=?=", 2)),
 | |
| 516 |     ("==>", "[prop, prop] => prop", Mixfix ("(_/ ==> _)", [2, 1], 1)),
 | |
| 517 |     ("all", "('a => prop) => prop", Binder ("!!", 0, 0)),
 | |
| 10667 | 518 |     ("Goal", "prop => prop", NoSyn),
 | 
| 6547 | 519 |     ("TYPE", "'a itself", NoSyn),
 | 
| 9534 | 520 | (Term.dummy_patternN, "'a", Delimfix "'_")] | 
| 5041 
a1d0a6d555cd
Goals may now contain assumptions, which are not returned.
 nipkow parents: 
5026diff
changeset | 521 |   |> Theory.add_modesyntax ("", false)
 | 
| 12138 
7cad58fbc866
renamed open_smart_store_thms to smart_store_thms_open;
 wenzelm parents: 
12123diff
changeset | 522 | (Syntax.pure_syntax_output @ Syntax.pure_appl_syntax) | 
| 12250 | 523 | |> Theory.add_trfuns Syntax.pure_trfuns | 
| 524 | |> Theory.add_trfunsT Syntax.pure_trfunsT | |
| 4963 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 525 | |> local_path | 
| 9318 | 526 | |> (#1 oo (add_defs false o map Thm.no_attributes)) | 
| 10667 | 527 |    [("flexpair_def", "(t =?= u) == (t == u::'a::{})")]
 | 
| 528 | |> (#1 oo (add_defs_i false o map Thm.no_attributes)) | |
| 529 |    [("Goal_def", let val A = Free ("A", propT) in Logic.mk_equals (Logic.mk_goal A, A) end)]
 | |
| 9238 | 530 |   |> (#1 o add_thmss [(("nothing", []), [])])
 | 
| 11516 
a0633bdcd015
Added equality axioms and initialization of proof term package.
 berghofe parents: 
10667diff
changeset | 531 | |> Theory.add_axioms_i Proofterm.equality_axms | 
| 4963 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 532 | |> end_theory; | 
| 3987 | 533 | |
| 5091 | 534 | structure ProtoPure = | 
| 535 | struct | |
| 536 | val thy = proto_pure; | |
| 537 | val flexpair_def = get_axiom thy "flexpair_def"; | |
| 538 | val Goal_def = get_axiom thy "Goal_def"; | |
| 539 | end; | |
| 3987 | 540 | |
| 541 | ||
| 542 | end; | |
| 543 | ||
| 544 | ||
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 545 | structure BasicPureThy: BASIC_PURE_THY = PureThy; | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 546 | open BasicPureThy; |