| author | wenzelm | 
| Fri, 16 Jul 1999 22:22:59 +0200 | |
| changeset 7022 | abf9d5e2fb6e | 
| parent 6977 | 4781c0673e83 | 
| child 7278 | da64f7413efd | 
| permissions | -rw-r--r-- | 
| 3987 | 1 | (* Title: Pure/pure_thy.ML | 
| 2 | ID: $Id$ | |
| 3 | Author: Markus Wenzel, TU Muenchen | |
| 4 | ||
| 5091 | 5 | Theorem database, derived theory operations, and 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 | 
| 5000 | 10 | val print_theorems: theory -> unit | 
| 11 | val print_theory: theory -> unit | |
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 12 | val get_thm: theory -> xstring -> thm | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 13 | val get_thms: theory -> xstring -> thm list | 
| 6094 | 14 | val get_thmss: theory -> xstring list -> thm list | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 15 | val thms_of: theory -> (string * thm) list | 
| 5091 | 16 | structure ProtoPure: | 
| 17 | sig | |
| 18 | val thy: theory | |
| 19 | val flexpair_def: thm | |
| 20 | val Goal_def: thm | |
| 21 | end | |
| 4853 | 22 | end; | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 23 | |
| 3987 | 24 | signature PURE_THY = | 
| 25 | sig | |
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 26 | include BASIC_PURE_THY | 
| 6367 | 27 | val cond_extern_thm_sg: Sign.sg -> string -> xstring | 
| 6091 | 28 | val thms_closure: theory -> xstring -> thm list option | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 29 | val thms_containing: theory -> string list -> (string * thm) list | 
| 5907 | 30 | val default_name: string -> string | 
| 6091 | 31 | val store_thm: (bstring * thm) * theory attribute list -> theory -> theory * thm | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 32 | val smart_store_thm: (bstring * thm) -> thm | 
| 6091 | 33 | val add_thms: ((bstring * thm) * theory attribute list) list -> theory -> theory | 
| 34 | val add_thmss: ((bstring * thm list) * theory attribute list) list -> theory -> theory | |
| 6367 | 35 | val have_thmss: bstring option -> theory attribute list -> | 
| 6091 | 36 | (thm list * theory attribute list) list -> theory -> theory * thm list | 
| 4853 | 37 | val add_axioms: ((bstring * string) * theory attribute list) list -> theory -> theory | 
| 38 | val add_axioms_i: ((bstring * term) * theory attribute list) list -> theory -> theory | |
| 39 | val add_axiomss: ((bstring * string list) * theory attribute list) list -> theory -> theory | |
| 40 | val add_axiomss_i: ((bstring * term list) * theory attribute list) list -> theory -> theory | |
| 41 | val add_defs: ((bstring * string) * theory attribute list) list -> theory -> theory | |
| 42 | val add_defs_i: ((bstring * term) * theory attribute list) list -> theory -> theory | |
| 43 | val add_defss: ((bstring * string list) * theory attribute list) list -> theory -> theory | |
| 44 | val add_defss_i: ((bstring * term list) * theory attribute list) list -> theory -> theory | |
| 4963 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 45 | val get_name: theory -> string | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 46 | val put_name: string -> theory -> theory | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 47 | val global_path: theory -> theory | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 48 | val local_path: theory -> theory | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 49 | val begin_theory: string -> theory list -> theory | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 50 | val end_theory: theory -> theory | 
| 6682 | 51 | val checkpoint: theory -> theory | 
| 4922 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 52 | val add_typedecls: (bstring * string list * mixfix) list -> theory -> theory | 
| 6560 
1436349f8b28
renamed 'dummy' to 'dummy_pattern' (less dangerous);
 wenzelm parents: 
6547diff
changeset | 53 | val dummy_patternN: string | 
| 3987 | 54 | end; | 
| 55 | ||
| 56 | structure PureThy: PURE_THY = | |
| 57 | struct | |
| 58 | ||
| 59 | ||
| 4922 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 60 | (*** theorem database ***) | 
| 3987 | 61 | |
| 4922 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 62 | (** data kind 'Pure/theorems' **) | 
| 3987 | 63 | |
| 5005 | 64 | structure TheoremsDataArgs = | 
| 65 | struct | |
| 66 | val name = "Pure/theorems"; | |
| 3987 | 67 | |
| 5005 | 68 | type T = | 
| 69 |     {space: NameSpace.T,
 | |
| 6091 | 70 | thms_tab: thm list Symtab.table, | 
| 71 | const_idx: int * (int * thm) list Symtab.table} ref; | |
| 3987 | 72 | |
| 4853 | 73 | fun mk_empty _ = | 
| 5005 | 74 |     ref {space = NameSpace.empty, thms_tab = Symtab.empty, const_idx = (0, Symtab.empty)} : T;
 | 
| 3987 | 75 | |
| 5005 | 76 | val empty = mk_empty (); | 
| 6547 | 77 | fun copy (ref x) = ref x; | 
| 5005 | 78 | val prep_ext = mk_empty; | 
| 79 | val merge = mk_empty; | |
| 80 | ||
| 81 |   fun print sg (ref {space, thms_tab, const_idx = _}) =
 | |
| 4853 | 82 | let | 
| 6091 | 83 | val prt_thm = Display.pretty_thm o Thm.transfer_sg sg; | 
| 4853 | 84 | fun prt_thms (name, [th]) = | 
| 85 | Pretty.block [Pretty.str (name ^ ":"), Pretty.brk 1, prt_thm th] | |
| 86 | | prt_thms (name, ths) = Pretty.big_list (name ^ ":") (map prt_thm ths); | |
| 3987 | 87 | |
| 6846 | 88 | val thmss = NameSpace.cond_extern_table space thms_tab; | 
| 4853 | 89 | in | 
| 90 |       Pretty.writeln (Display.pretty_name_space ("theorem name space", space));
 | |
| 91 | Pretty.writeln (Pretty.big_list "theorems:" (map prt_thms thmss)) | |
| 92 | end; | |
| 3987 | 93 | end; | 
| 94 | ||
| 5005 | 95 | structure TheoremsData = TheoryDataFun(TheoremsDataArgs); | 
| 96 | val get_theorems_sg = TheoremsData.get_sg; | |
| 97 | val get_theorems = TheoremsData.get; | |
| 98 | ||
| 6367 | 99 | val cond_extern_thm_sg = NameSpace.cond_extern o #space o ! o get_theorems_sg; | 
| 100 | ||
| 3987 | 101 | |
| 5000 | 102 | (* print theory *) | 
| 3987 | 103 | |
| 5005 | 104 | val print_theorems = TheoremsData.print; | 
| 5000 | 105 | fun print_theory thy = | 
| 106 | (Display.print_theory thy; print_theorems thy); | |
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 107 | |
| 3987 | 108 | |
| 109 | ||
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 110 | (** retrieve theorems **) | 
| 3987 | 111 | |
| 4922 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 112 | (* thms_closure *) | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 113 | |
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 114 | (*note: we avoid life references to the theory, so users may safely | 
| 5000 | 115 | keep thms_closure with moderate space consumption*) | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 116 | |
| 4922 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 117 | fun thms_closure_aux thy = | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 118 |   let val ref {space, thms_tab, ...} = get_theorems thy
 | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 119 | in fn name => Symtab.lookup (thms_tab, NameSpace.intern space name) end; | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 120 | |
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 121 | fun thms_closure thy = | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 122 | let val closures = map thms_closure_aux (thy :: Theory.ancestors_of thy) | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 123 | in fn name => get_first (fn f => f name) closures end; | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 124 | |
| 3987 | 125 | |
| 4783 | 126 | (* get_thms etc. *) | 
| 4037 | 127 | |
| 4922 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 128 | fun lookup_thms name thy = thms_closure_aux thy name; | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 129 | |
| 6091 | 130 | fun get_thms thy name = | 
| 4922 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 131 | (case get_first (lookup_thms name) (thy :: Theory.ancestors_of thy) of | 
| 4590 | 132 |     None => raise THEORY ("Unknown theorem(s) " ^ quote name, [thy])
 | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 133 | | Some thms => thms); | 
| 3987 | 134 | |
| 6091 | 135 | fun get_thm thy name = | 
| 136 | (case get_thms thy name of | |
| 3987 | 137 | [thm] => thm | 
| 4590 | 138 |   | _ => raise THEORY ("Single theorem expected " ^ quote name, [thy]));
 | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 139 | |
| 6091 | 140 | fun get_thmss thy names = flat (map (get_thms thy) names); | 
| 4783 | 141 | |
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 142 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 143 | (* thms_of *) | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 144 | |
| 6091 | 145 | 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 | 146 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 147 | fun thms_of thy = | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 148 |   let val ref {thms_tab, ...} = get_theorems thy in
 | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 149 | map attach_name (flat (map snd (Symtab.dest thms_tab))) | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 150 | end; | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 151 | |
| 3987 | 152 | |
| 153 | ||
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 154 | (** theorems indexed by constants **) | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 155 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 156 | (* make index *) | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 157 | |
| 4037 | 158 | val ignore = ["Trueprop", "all", "==>", "=="]; | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 159 | |
| 6091 | 160 | fun add_const_idx ((next, table), thm) = | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 161 | let | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 162 |     val {hyps, prop, ...} = Thm.rep_thm thm;
 | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 163 | val consts = | 
| 4037 | 164 | foldr add_term_consts (hyps, add_term_consts (prop, [])) \\ ignore; | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 165 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 166 | fun add (tab, c) = | 
| 6091 | 167 | 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 | 168 | in (next + 1, foldl add (table, consts)) end; | 
| 
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 | fun make_const_idx thm_tab = | 
| 5686 | 171 | 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 | 172 | |
| 
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 | (* lookup index *) | 
| 3987 | 175 | |
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 176 | (*search locally*) | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 177 | fun containing [] thy = thms_of thy | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 178 | | containing consts thy = | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 179 | let | 
| 4037 | 180 | fun int ([], _) = [] | 
| 181 | | int (_, []) = [] | |
| 182 | | int (xxs as ((x as (i:int, _)) :: xs), yys as ((y as (j, _)) :: ys)) = | |
| 183 | if i = j then x :: int (xs, ys) | |
| 184 | else if i > j then int (xs, yys) | |
| 185 | else int (xxs, ys); | |
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 186 | |
| 4037 | 187 | fun ints [xs] = xs | 
| 188 | | 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 | 189 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 190 |         val ref {const_idx = (_, ctab), ...} = get_theorems thy;
 | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 191 | val ithmss = map (fn c => Symtab.lookup_multi (ctab, c)) consts; | 
| 6977 | 192 | in map (attach_name o snd) (ints ithmss) end; | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 193 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 194 | (*search globally*) | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 195 | fun thms_containing thy consts = | 
| 6977 | 196 | (case filter (is_none o Sign.const_type (Theory.sign_of thy)) consts of | 
| 197 | [] => flat (map (containing (consts \\ ignore)) (thy :: Theory.ancestors_of thy)) | |
| 198 |   | cs => raise THEORY ("thms_containing: undeclared consts " ^ commas_quote cs, [thy]));
 | |
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 199 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 200 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 201 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 202 | (** store theorems **) (*DESTRUCTIVE*) | 
| 3987 | 203 | |
| 4853 | 204 | (* naming *) | 
| 205 | ||
| 5933 | 206 | val defaultN = "it"; | 
| 207 | val default_name = fn "" => defaultN | name => name; | |
| 5907 | 208 | |
| 4853 | 209 | fun gen_names len name = | 
| 210 | map (fn i => name ^ "_" ^ string_of_int i) (1 upto len); | |
| 211 | ||
| 5907 | 212 | fun name_single name x = [(default_name name, x)]; | 
| 213 | fun name_multi name xs = gen_names (length xs) (default_name name) ~~ xs; | |
| 4853 | 214 | |
| 215 | ||
| 6091 | 216 | (* enter_thmx *) | 
| 4853 | 217 | |
| 5933 | 218 | fun cond_warning name msg = if Sign.base_name name = defaultN then () else warning msg; | 
| 219 | ||
| 3987 | 220 | fun warn_overwrite name = | 
| 5933 | 221 |   cond_warning name ("Replaced old copy of theorems " ^ quote name);
 | 
| 3987 | 222 | |
| 223 | fun warn_same name = | |
| 5933 | 224 |   cond_warning name ("Theorem database already contains a copy of " ^ quote name);
 | 
| 3987 | 225 | |
| 6091 | 226 | fun enter_thmx sg app_name (bname, thmx) = | 
| 3987 | 227 | let | 
| 6350 | 228 | val name = Sign.full_name sg (default_name bname); | 
| 6091 | 229 | val named_thms = map Thm.name_thm (app_name name thmx); | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 230 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 231 |     val r as ref {space, thms_tab, const_idx} = get_theorems_sg sg;
 | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 232 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 233 | val overwrite = | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 234 | (case Symtab.lookup (thms_tab, name) of | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 235 | None => false | 
| 6091 | 236 | | Some thms' => | 
| 237 | if length thms' = length named_thms andalso forall2 Thm.eq_thm (thms', named_thms) then | |
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 238 | (warn_same name; false) | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 239 | else (warn_overwrite name; true)); | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 240 | |
| 4487 | 241 | val space' = NameSpace.extend (space, [name]); | 
| 6091 | 242 | val thms_tab' = Symtab.update ((name, named_thms), thms_tab); | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 243 | val const_idx' = | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 244 | if overwrite then make_const_idx thms_tab' | 
| 6091 | 245 | else foldl add_const_idx (const_idx, named_thms); | 
| 3987 | 246 | in | 
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 247 |     r := {space = space', thms_tab = thms_tab', const_idx = const_idx'};
 | 
| 6091 | 248 | named_thms | 
| 3987 | 249 | end; | 
| 250 | ||
| 4853 | 251 | |
| 6091 | 252 | (* add_thms(s) *) | 
| 4853 | 253 | |
| 6091 | 254 | fun add_thmx app_name app_att ((bname, thmx), atts) thy = | 
| 5280 | 255 | let | 
| 6091 | 256 | val (thy', thmx') = app_att ((thy, thmx), atts); | 
| 257 | val thms'' = enter_thmx (Theory.sign_of thy') app_name (bname, thmx'); | |
| 258 | in (thy', thms'') end; | |
| 4853 | 259 | |
| 6091 | 260 | fun add_thmxs name app = Library.apply o map (fst oo add_thmx name app); | 
| 5907 | 261 | |
| 6091 | 262 | val add_thms = add_thmxs name_single Thm.apply_attributes; | 
| 263 | val add_thmss = add_thmxs name_multi Thm.applys_attributes; | |
| 5907 | 264 | |
| 265 | ||
| 6091 | 266 | (* have_thmss *) | 
| 5907 | 267 | |
| 6367 | 268 | fun have_thmss opt_bname more_atts ths_atts thy = | 
| 5907 | 269 | let | 
| 6091 | 270 | fun app (x, (ths, atts)) = Thm.applys_attributes ((x, ths), atts); | 
| 271 | val (thy', thmss') = | |
| 5907 | 272 | foldl_map app (thy, map (fn (ths, atts) => (ths, atts @ more_atts)) ths_atts); | 
| 6367 | 273 | val thms' = flat thmss'; | 
| 274 | val thms'' = | |
| 275 | (case opt_bname of | |
| 276 | None => thms' | |
| 277 | | Some bname => enter_thmx (Theory.sign_of thy') name_multi (bname, thms')); | |
| 6769 | 278 | in (thy', thms'') end; | 
| 5280 | 279 | |
| 280 | ||
| 6091 | 281 | (* store_thm *) | 
| 5280 | 282 | |
| 6091 | 283 | fun store_thm th_atts thy = | 
| 284 | let val (thy', [th']) = add_thmx name_single Thm.apply_attributes th_atts thy | |
| 5280 | 285 | in (thy', th') end; | 
| 3987 | 286 | |
| 287 | ||
| 4853 | 288 | (* smart_store_thm *) | 
| 3987 | 289 | |
| 4012 | 290 | fun smart_store_thm (name, thm) = | 
| 6091 | 291 | hd (enter_thmx (Thm.sign_of_thm thm) name_single (name, thm)); | 
| 3987 | 292 | |
| 293 | ||
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 294 | (* store axioms as theorems *) | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 295 | |
| 4853 | 296 | local | 
| 297 | fun add_ax app_name add ((name, axs), atts) thy = | |
| 298 | let | |
| 299 | val named_axs = app_name name axs; | |
| 300 | val thy' = add named_axs thy; | |
| 6091 | 301 | val thms = map (Thm.get_axiom thy' o fst) named_axs; | 
| 302 | in add_thmss [((name, thms), atts)] thy' end; | |
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 303 | |
| 5907 | 304 | fun add_axs app_name add = Library.apply o map (add_ax app_name add); | 
| 4853 | 305 | in | 
| 306 | val add_axioms = add_axs name_single Theory.add_axioms; | |
| 307 | val add_axioms_i = add_axs name_single Theory.add_axioms_i; | |
| 308 | val add_axiomss = add_axs name_multi Theory.add_axioms; | |
| 309 | val add_axiomss_i = add_axs name_multi Theory.add_axioms_i; | |
| 310 | val add_defs = add_axs name_single Theory.add_defs; | |
| 311 | val add_defs_i = add_axs name_single Theory.add_defs_i; | |
| 312 | val add_defss = add_axs name_multi Theory.add_defs; | |
| 313 | val add_defss_i = add_axs name_multi Theory.add_defs_i; | |
| 314 | end; | |
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 315 | |
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 316 | |
| 3987 | 317 | |
| 4963 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 318 | (*** derived theory operations ***) | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 319 | |
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 320 | (** theory management **) | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 321 | |
| 5005 | 322 | (* data kind 'Pure/theory_management' *) | 
| 4963 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 323 | |
| 5005 | 324 | structure TheoryManagementDataArgs = | 
| 325 | struct | |
| 326 | val name = "Pure/theory_management"; | |
| 6660 | 327 |   type T = {name: string, version: int};
 | 
| 5000 | 328 | |
| 6660 | 329 |   val empty = {name = "", version = 0};
 | 
| 6547 | 330 | val copy = I; | 
| 5005 | 331 | val prep_ext = I; | 
| 5000 | 332 | fun merge _ = empty; | 
| 5005 | 333 | fun print _ _ = (); | 
| 4963 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 334 | end; | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 335 | |
| 5005 | 336 | structure TheoryManagementData = TheoryDataFun(TheoryManagementDataArgs); | 
| 337 | val get_info = TheoryManagementData.get; | |
| 338 | val put_info = TheoryManagementData.put; | |
| 339 | ||
| 4963 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 340 | |
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 341 | (* get / put name *) | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 342 | |
| 5000 | 343 | val get_name = #name o get_info; | 
| 6660 | 344 | 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 | 345 | |
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 346 | |
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 347 | (* control prefixing of theory name *) | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 348 | |
| 5210 | 349 | val global_path = Theory.root_path; | 
| 4963 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 350 | |
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 351 | fun local_path thy = | 
| 5210 | 352 | 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 | 353 | |
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 354 | |
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 355 | (* begin / end theory *) | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 356 | |
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 357 | fun begin_theory name thys = | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 358 | Theory.prep_ext_merge thys | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 359 | |> put_name name | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 360 | |> local_path; | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 361 | |
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 362 | fun end_theory thy = Theory.add_name (get_name thy) thy; | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 363 | |
| 6682 | 364 | fun checkpoint thy = | 
| 365 | if is_draft thy then | |
| 366 |     let val {name, version} = get_info thy in
 | |
| 367 | thy | |
| 368 | |> Theory.add_name (name ^ ":" ^ string_of_int version) | |
| 369 |       |> put_info {name = name, version = version + 1}
 | |
| 370 | end | |
| 371 | else thy; | |
| 5000 | 372 | |
| 373 | ||
| 4963 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 374 | |
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 375 | (** add logical types **) | 
| 4922 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 376 | |
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 377 | fun add_typedecls decls thy = | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 378 | let | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 379 | val full = Sign.full_name (Theory.sign_of thy); | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 380 | |
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 381 | fun type_of (raw_name, vs, mx) = | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 382 | if null (duplicates vs) then (raw_name, length vs, mx) | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 383 |       else error ("Duplicate parameters in type declaration: " ^ quote raw_name);
 | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 384 | |
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 385 | fun arity_of (raw_name, len, mx) = | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 386 | (full (Syntax.type_name raw_name mx), replicate len logicS, logicS); | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 387 | |
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 388 | val types = map type_of decls; | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 389 | val arities = map arity_of types; | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 390 | in | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 391 | thy | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 392 | |> Theory.add_types types | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 393 | |> Theory.add_arities_i arities | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 394 | end; | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 395 | |
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 396 | |
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 397 | |
| 5091 | 398 | (*** the ProtoPure theory ***) | 
| 3987 | 399 | |
| 6560 
1436349f8b28
renamed 'dummy' to 'dummy_pattern' (less dangerous);
 wenzelm parents: 
6547diff
changeset | 400 | val dummy_patternN = "dummy_pattern"; | 
| 
1436349f8b28
renamed 'dummy' to 'dummy_pattern' (less dangerous);
 wenzelm parents: 
6547diff
changeset | 401 | |
| 3987 | 402 | val proto_pure = | 
| 403 | Theory.pre_pure | |
| 5907 | 404 | |> Library.apply [TheoremsData.init, TheoryManagementData.init] | 
| 4963 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 405 | |> put_name "ProtoPure" | 
| 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 406 | |> global_path | 
| 3987 | 407 | |> Theory.add_types | 
| 4922 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 408 |    [("fun", 2, NoSyn),
 | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 409 |     ("prop", 0, NoSyn),
 | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 410 |     ("itself", 1, NoSyn),
 | 
| 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 411 |     ("dummy", 0, NoSyn)]
 | 
| 3987 | 412 | |> Theory.add_classes_i [(logicC, [])] | 
| 413 | |> Theory.add_defsort_i logicS | |
| 414 | |> Theory.add_arities_i | |
| 415 |    [("fun", [logicS, logicS], logicS),
 | |
| 416 |     ("prop", [], logicS),
 | |
| 417 |     ("itself", [logicS], logicS)]
 | |
| 4922 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 wenzelm parents: 
4853diff
changeset | 418 | |> Theory.add_nonterminals Syntax.pure_nonterms | 
| 3987 | 419 | |> Theory.add_syntax Syntax.pure_syntax | 
| 6692 | 420 | |> Theory.add_modesyntax (Symbol.symbolsN, true) Syntax.pure_sym_syntax | 
| 421 | |> Theory.add_modesyntax (Symbol.xsymbolsN, true) Syntax.pure_xsym_syntax | |
| 3987 | 422 | |> Theory.add_trfuns Syntax.pure_trfuns | 
| 423 | |> Theory.add_trfunsT Syntax.pure_trfunsT | |
| 424 | |> Theory.add_syntax | |
| 425 |    [("==>", "[prop, prop] => prop", Delimfix "op ==>")]
 | |
| 426 | |> Theory.add_consts | |
| 427 |    [("==", "['a::{}, 'a] => prop", InfixrName ("==", 2)),
 | |
| 428 |     ("=?=", "['a::{}, 'a] => prop", InfixrName ("=?=", 2)),
 | |
| 429 |     ("==>", "[prop, prop] => prop", Mixfix ("(_/ ==> _)", [2, 1], 1)),
 | |
| 430 |     ("all", "('a => prop) => prop", Binder ("!!", 0, 0)),
 | |
| 4788 | 431 |     ("Goal", "prop => prop", Mixfix ("GOAL _", [999], 1000)),
 | 
| 6547 | 432 |     ("TYPE", "'a itself", NoSyn),
 | 
| 6560 
1436349f8b28
renamed 'dummy' to 'dummy_pattern' (less dangerous);
 wenzelm parents: 
6547diff
changeset | 433 | (dummy_patternN, "'a", Delimfix "'_")] | 
| 5041 
a1d0a6d555cd
Goals may now contain assumptions, which are not returned.
 nipkow parents: 
5026diff
changeset | 434 |   |> Theory.add_modesyntax ("", false)
 | 
| 
a1d0a6d555cd
Goals may now contain assumptions, which are not returned.
 nipkow parents: 
5026diff
changeset | 435 |     [("Goal", "prop => prop", Mixfix ("_", [0], 0))]
 | 
| 4963 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 436 | |> local_path | 
| 6091 | 437 | |> (add_defs o map Thm.no_attributes) | 
| 4788 | 438 |    [("flexpair_def", "(t =?= u) == (t == u::'a::{})"),
 | 
| 439 |     ("Goal_def", "GOAL (PROP A) == PROP A")]
 | |
| 4963 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 wenzelm parents: 
4933diff
changeset | 440 | |> end_theory; | 
| 3987 | 441 | |
| 5091 | 442 | structure ProtoPure = | 
| 443 | struct | |
| 444 | val thy = proto_pure; | |
| 445 | val flexpair_def = get_axiom thy "flexpair_def"; | |
| 446 | val Goal_def = get_axiom thy "Goal_def"; | |
| 447 | end; | |
| 3987 | 448 | |
| 449 | ||
| 450 | end; | |
| 451 | ||
| 452 | ||
| 4022 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 453 | structure BasicPureThy: BASIC_PURE_THY = PureThy; | 
| 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 wenzelm parents: 
4013diff
changeset | 454 | open BasicPureThy; |