| author | wenzelm | 
| Sat, 01 Jul 2000 20:01:36 +0200 | |
| changeset 9234 | 0013b2aa98dd | 
| parent 9215 | 50de4abb987c | 
| child 9238 | ad37b21c0dc6 | 
| 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: 
4013 
diff
changeset
 | 
8  | 
signature BASIC_PURE_THY =  | 
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
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: 
4013 
diff
changeset
 | 
12  | 
val get_thm: theory -> xstring -> thm  | 
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
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: 
4013 
diff
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: 
4013 
diff
changeset
 | 
23  | 
|
| 3987 | 24  | 
signature PURE_THY =  | 
25  | 
sig  | 
|
| 
4022
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
26  | 
include BASIC_PURE_THY  | 
| 6367 | 27  | 
val cond_extern_thm_sg: Sign.sg -> string -> xstring  | 
| 
4022
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
28  | 
val thms_containing: theory -> string list -> (string * thm) list  | 
| 6091 | 29  | 
val store_thm: (bstring * thm) * theory attribute list -> theory -> theory * thm  | 
| 7405 | 30  | 
val smart_store_thms: (bstring * thm list) -> thm list  | 
| 7899 | 31  | 
val forall_elim_var: int -> thm -> thm  | 
32  | 
val forall_elim_vars: int -> thm -> thm  | 
|
| 
8419
 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 
wenzelm 
parents: 
8039 
diff
changeset
 | 
33  | 
val add_thms: ((bstring * thm) * theory attribute list) list -> theory -> theory * thm list  | 
| 
 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 
wenzelm 
parents: 
8039 
diff
changeset
 | 
34  | 
val add_thmss: ((bstring * thm list) * theory attribute list) list -> theory -> theory * thm list list  | 
| 9192 | 35  | 
val have_thmss: theory attribute list -> ((bstring * theory attribute list) *  | 
36  | 
(thm list * theory attribute list) list) list -> theory -> theory * (string * thm list) list  | 
|
| 
8419
 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 
wenzelm 
parents: 
8039 
diff
changeset
 | 
37  | 
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: 
8039 
diff
changeset
 | 
38  | 
val add_axioms_i: ((bstring * term) * theory attribute list) list -> theory -> theory * thm list  | 
| 
 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 
wenzelm 
parents: 
8039 
diff
changeset
 | 
39  | 
val add_axiomss: ((bstring * string list) * theory attribute list) list -> theory -> theory * thm list list  | 
| 
 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 
wenzelm 
parents: 
8039 
diff
changeset
 | 
40  | 
val add_axiomss_i: ((bstring * term list) * theory attribute list) list -> theory -> theory * thm list list  | 
| 
 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 
wenzelm 
parents: 
8039 
diff
changeset
 | 
41  | 
val add_defs: ((bstring * string) * theory attribute list) list -> theory -> theory * thm list  | 
| 
 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 
wenzelm 
parents: 
8039 
diff
changeset
 | 
42  | 
val add_defs_i: ((bstring * term) * theory attribute list) list -> theory -> theory * thm list  | 
| 
 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 
wenzelm 
parents: 
8039 
diff
changeset
 | 
43  | 
val add_defss: ((bstring * string list) * theory attribute list) list -> theory -> theory * thm list list  | 
| 
 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 
wenzelm 
parents: 
8039 
diff
changeset
 | 
44  | 
val add_defss_i: ((bstring * term list) * theory attribute list) list -> theory -> theory * thm list list  | 
| 
4963
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
45  | 
val get_name: theory -> string  | 
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
46  | 
val put_name: string -> theory -> theory  | 
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
47  | 
val global_path: theory -> theory  | 
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
48  | 
val local_path: theory -> theory  | 
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
49  | 
val begin_theory: string -> theory list -> theory  | 
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
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: 
4853 
diff
changeset
 | 
52  | 
val add_typedecls: (bstring * string list * mixfix) list -> theory -> theory  | 
| 
6560
 
1436349f8b28
renamed 'dummy' to 'dummy_pattern' (less dangerous);
 
wenzelm 
parents: 
6547 
diff
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: 
4853 
diff
changeset
 | 
60  | 
(*** theorem database ***)  | 
| 3987 | 61  | 
|
| 
4922
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
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  | 
||
| 8720 | 81  | 
  fun pretty 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;  | 
| 9215 | 89  | 
in Pretty.big_list "theorems:" (map prt_thms thmss) end;  | 
| 8720 | 90  | 
|
| 9215 | 91  | 
fun print sg data = Pretty.writeln (pretty sg data);  | 
| 3987 | 92  | 
end;  | 
93  | 
||
| 5005 | 94  | 
structure TheoremsData = TheoryDataFun(TheoremsDataArgs);  | 
95  | 
val get_theorems_sg = TheoremsData.get_sg;  | 
|
96  | 
val get_theorems = TheoremsData.get;  | 
|
97  | 
||
| 6367 | 98  | 
val cond_extern_thm_sg = NameSpace.cond_extern o #space o ! o get_theorems_sg;  | 
99  | 
||
| 3987 | 100  | 
|
| 5000 | 101  | 
(* print theory *)  | 
| 3987 | 102  | 
|
| 5005 | 103  | 
val print_theorems = TheoremsData.print;  | 
| 8720 | 104  | 
|
| 5000 | 105  | 
fun print_theory thy =  | 
| 9215 | 106  | 
Display.pretty_full_theory thy @  | 
107  | 
[TheoremsDataArgs.pretty (Theory.sign_of thy) (get_theorems thy)]  | 
|
| 8720 | 108  | 
|> Pretty.chunks |> Pretty.writeln;  | 
| 
4022
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
109  | 
|
| 3987 | 110  | 
|
111  | 
||
| 
4022
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
112  | 
(** retrieve theorems **)  | 
| 3987 | 113  | 
|
| 4783 | 114  | 
(* get_thms etc. *)  | 
| 4037 | 115  | 
|
| 7485 | 116  | 
fun lookup_thms name thy =  | 
117  | 
  let val ref {space, thms_tab, ...} = get_theorems thy
 | 
|
118  | 
in Symtab.lookup (thms_tab, NameSpace.intern space name) end;  | 
|
| 
4922
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
119  | 
|
| 6091 | 120  | 
fun get_thms thy name =  | 
| 
4922
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
121  | 
(case get_first (lookup_thms name) (thy :: Theory.ancestors_of thy) of  | 
| 4590 | 122  | 
    None => raise THEORY ("Unknown theorem(s) " ^ quote name, [thy])
 | 
| 9007 | 123  | 
| Some thms => map (Thm.transfer thy) thms);  | 
| 3987 | 124  | 
|
| 6091 | 125  | 
fun get_thm thy name =  | 
126  | 
(case get_thms thy name of  | 
|
| 3987 | 127  | 
[thm] => thm  | 
| 4590 | 128  | 
  | _ => raise THEORY ("Single theorem expected " ^ quote name, [thy]));
 | 
| 
4022
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
129  | 
|
| 6091 | 130  | 
fun get_thmss thy names = flat (map (get_thms thy) names);  | 
| 4783 | 131  | 
|
| 
4022
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
132  | 
|
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
133  | 
(* thms_of *)  | 
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
134  | 
|
| 6091 | 135  | 
fun attach_name thm = (Thm.name_of_thm thm, thm);  | 
| 
4022
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
136  | 
|
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
137  | 
fun thms_of thy =  | 
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
138  | 
  let val ref {thms_tab, ...} = get_theorems thy in
 | 
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
139  | 
map attach_name (flat (map snd (Symtab.dest thms_tab)))  | 
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
140  | 
end;  | 
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
141  | 
|
| 3987 | 142  | 
|
143  | 
||
| 
4022
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
144  | 
(** theorems indexed by constants **)  | 
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
145  | 
|
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
146  | 
(* make index *)  | 
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
147  | 
|
| 6091 | 148  | 
fun add_const_idx ((next, table), thm) =  | 
| 
4022
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
149  | 
let  | 
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
150  | 
    val {hyps, prop, ...} = Thm.rep_thm thm;
 | 
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
151  | 
val consts =  | 
| 
7805
 
0ae9ddc36fe0
theorem database now also indexes constants "Trueprop", "all",
 
wenzelm 
parents: 
7753 
diff
changeset
 | 
152  | 
foldr add_term_consts (hyps, add_term_consts (prop, []));  | 
| 
4022
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
153  | 
|
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
154  | 
fun add (tab, c) =  | 
| 6091 | 155  | 
Symtab.update ((c, (next, thm) :: Symtab.lookup_multi (tab, c)), tab);  | 
| 
4022
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
156  | 
in (next + 1, foldl add (table, consts)) end;  | 
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
157  | 
|
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
158  | 
fun make_const_idx thm_tab =  | 
| 5686 | 159  | 
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: 
4013 
diff
changeset
 | 
160  | 
|
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
161  | 
|
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
162  | 
(* lookup index *)  | 
| 3987 | 163  | 
|
| 
4022
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
164  | 
(*search locally*)  | 
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
165  | 
fun containing [] thy = thms_of thy  | 
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
166  | 
| containing consts thy =  | 
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
167  | 
let  | 
| 4037 | 168  | 
fun int ([], _) = []  | 
169  | 
| int (_, []) = []  | 
|
170  | 
| int (xxs as ((x as (i:int, _)) :: xs), yys as ((y as (j, _)) :: ys)) =  | 
|
171  | 
if i = j then x :: int (xs, ys)  | 
|
172  | 
else if i > j then int (xs, yys)  | 
|
173  | 
else int (xxs, ys);  | 
|
| 
4022
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
174  | 
|
| 4037 | 175  | 
fun ints [xs] = xs  | 
176  | 
| 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: 
4013 
diff
changeset
 | 
177  | 
|
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
178  | 
        val ref {const_idx = (_, ctab), ...} = get_theorems thy;
 | 
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
179  | 
val ithmss = map (fn c => Symtab.lookup_multi (ctab, c)) consts;  | 
| 6977 | 180  | 
in map (attach_name o snd) (ints ithmss) end;  | 
| 
4022
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
181  | 
|
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
182  | 
(*search globally*)  | 
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
183  | 
fun thms_containing thy consts =  | 
| 6977 | 184  | 
(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: 
7753 
diff
changeset
 | 
185  | 
[] => flat (map (containing consts) (thy :: Theory.ancestors_of thy))  | 
| 6977 | 186  | 
  | cs => raise THEORY ("thms_containing: undeclared consts " ^ commas_quote cs, [thy]));
 | 
| 
4022
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
187  | 
|
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
188  | 
|
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
189  | 
|
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
190  | 
(** store theorems **) (*DESTRUCTIVE*)  | 
| 3987 | 191  | 
|
| 4853 | 192  | 
(* naming *)  | 
193  | 
||
194  | 
fun gen_names len name =  | 
|
195  | 
map (fn i => name ^ "_" ^ string_of_int i) (1 upto len);  | 
|
196  | 
||
| 
7470
 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 
wenzelm 
parents: 
7405 
diff
changeset
 | 
197  | 
fun name_single name x = [(name, x)];  | 
| 
 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 
wenzelm 
parents: 
7405 
diff
changeset
 | 
198  | 
fun name_multi name xs = gen_names (length xs) name ~~ xs;  | 
| 4853 | 199  | 
|
200  | 
||
| 6091 | 201  | 
(* enter_thmx *)  | 
| 4853 | 202  | 
|
| 
7470
 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 
wenzelm 
parents: 
7405 
diff
changeset
 | 
203  | 
fun warn_overwrite name = warning ("Replaced old copy of theorems " ^ quote name);
 | 
| 
 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 
wenzelm 
parents: 
7405 
diff
changeset
 | 
204  | 
fun warn_same name = warning ("Theorem database already contains a copy of " ^ quote name);
 | 
| 3987 | 205  | 
|
| 
7470
 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 
wenzelm 
parents: 
7405 
diff
changeset
 | 
206  | 
fun enter_thmx _ app_name ("", thmx) = map #2 (app_name "" thmx)
 | 
| 
 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 
wenzelm 
parents: 
7405 
diff
changeset
 | 
207  | 
| enter_thmx sg app_name (bname, thmx) =  | 
| 
 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 
wenzelm 
parents: 
7405 
diff
changeset
 | 
208  | 
let  | 
| 
 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 
wenzelm 
parents: 
7405 
diff
changeset
 | 
209  | 
val name = Sign.full_name sg bname;  | 
| 
 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 
wenzelm 
parents: 
7405 
diff
changeset
 | 
210  | 
val named_thms = map Thm.name_thm (app_name name thmx);  | 
| 3987 | 211  | 
|
| 
7470
 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 
wenzelm 
parents: 
7405 
diff
changeset
 | 
212  | 
        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: 
4013 
diff
changeset
 | 
213  | 
|
| 
7470
 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 
wenzelm 
parents: 
7405 
diff
changeset
 | 
214  | 
val overwrite =  | 
| 
 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 
wenzelm 
parents: 
7405 
diff
changeset
 | 
215  | 
(case Symtab.lookup (thms_tab, name) of  | 
| 
 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 
wenzelm 
parents: 
7405 
diff
changeset
 | 
216  | 
None => false  | 
| 
 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 
wenzelm 
parents: 
7405 
diff
changeset
 | 
217  | 
| Some thms' =>  | 
| 
 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 
wenzelm 
parents: 
7405 
diff
changeset
 | 
218  | 
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: 
7405 
diff
changeset
 | 
219  | 
else (warn_overwrite name; true));  | 
| 
4022
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
220  | 
|
| 
7470
 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 
wenzelm 
parents: 
7405 
diff
changeset
 | 
221  | 
val space' = NameSpace.extend (space, [name]);  | 
| 
 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 
wenzelm 
parents: 
7405 
diff
changeset
 | 
222  | 
val thms_tab' = Symtab.update ((name, named_thms), thms_tab);  | 
| 
 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 
wenzelm 
parents: 
7405 
diff
changeset
 | 
223  | 
val const_idx' =  | 
| 
 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 
wenzelm 
parents: 
7405 
diff
changeset
 | 
224  | 
if overwrite then make_const_idx thms_tab'  | 
| 
 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 
wenzelm 
parents: 
7405 
diff
changeset
 | 
225  | 
else foldl add_const_idx (const_idx, named_thms);  | 
| 
 
9f67ca1e03dc
eliminated default_name (thms no longer stored for name "");
 
wenzelm 
parents: 
7405 
diff
changeset
 | 
226  | 
      in r := {space = space', thms_tab = thms_tab', const_idx = const_idx'}; named_thms end;
 | 
| 3987 | 227  | 
|
| 4853 | 228  | 
|
| 6091 | 229  | 
(* add_thms(s) *)  | 
| 4853 | 230  | 
|
| 6091 | 231  | 
fun add_thmx app_name app_att ((bname, thmx), atts) thy =  | 
| 5280 | 232  | 
let  | 
| 6091 | 233  | 
val (thy', thmx') = app_att ((thy, thmx), atts);  | 
234  | 
val thms'' = enter_thmx (Theory.sign_of thy') app_name (bname, thmx');  | 
|
235  | 
in (thy', thms'') end;  | 
|
| 4853 | 236  | 
|
| 
8419
 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 
wenzelm 
parents: 
8039 
diff
changeset
 | 
237  | 
fun add_thms args theory =  | 
| 
 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 
wenzelm 
parents: 
8039 
diff
changeset
 | 
238  | 
(theory, args)  | 
| 
 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 
wenzelm 
parents: 
8039 
diff
changeset
 | 
239  | 
|> foldl_map (fn (thy, arg) => add_thmx name_single Thm.apply_attributes arg thy)  | 
| 
 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 
wenzelm 
parents: 
8039 
diff
changeset
 | 
240  | 
|> apsnd (map hd);  | 
| 5907 | 241  | 
|
| 
8419
 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 
wenzelm 
parents: 
8039 
diff
changeset
 | 
242  | 
fun add_thmss args theory =  | 
| 
 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 
wenzelm 
parents: 
8039 
diff
changeset
 | 
243  | 
(theory, args)  | 
| 
 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 
wenzelm 
parents: 
8039 
diff
changeset
 | 
244  | 
|> foldl_map (fn (thy, arg) => add_thmx name_multi Thm.applys_attributes arg thy);  | 
| 5907 | 245  | 
|
246  | 
||
| 6091 | 247  | 
(* have_thmss *)  | 
| 5907 | 248  | 
|
| 9192 | 249  | 
local  | 
250  | 
fun have_thss kind_atts (thy, ((bname, more_atts), ths_atts)) =  | 
|
251  | 
let  | 
|
252  | 
fun app (x, (ths, atts)) = Thm.applys_attributes ((x, ths), atts);  | 
|
253  | 
val (thy', thmss') =  | 
|
254  | 
foldl_map app (thy, map (fn (ths, atts) => (ths, atts @ more_atts @ kind_atts)) ths_atts);  | 
|
255  | 
val thms' = flat thmss';  | 
|
256  | 
val thms'' = enter_thmx (Theory.sign_of thy') name_multi (bname, thms');  | 
|
257  | 
in (thy', (bname, thms'')) end;  | 
|
258  | 
in  | 
|
259  | 
fun have_thmss kind_atts args thy = foldl_map (have_thss kind_atts) (thy, args);  | 
|
260  | 
end;  | 
|
| 5280 | 261  | 
|
262  | 
||
| 6091 | 263  | 
(* store_thm *)  | 
| 5280 | 264  | 
|
| 6091 | 265  | 
fun store_thm th_atts thy =  | 
266  | 
let val (thy', [th']) = add_thmx name_single Thm.apply_attributes th_atts thy  | 
|
| 5280 | 267  | 
in (thy', th') end;  | 
| 3987 | 268  | 
|
269  | 
||
| 7405 | 270  | 
(* smart_store_thms *)  | 
| 3987 | 271  | 
|
| 7405 | 272  | 
fun smart_store_thms (name, []) = error ("Cannot store empty list of theorems: " ^ quote name)
 | 
273  | 
| smart_store_thms (name, [thm]) = enter_thmx (Thm.sign_of_thm thm) name_single (name, thm)  | 
|
274  | 
| smart_store_thms (name, thms) =  | 
|
275  | 
let  | 
|
276  | 
val merge_sg = Sign.merge_refs o apsnd (Sign.self_ref o Thm.sign_of_thm);  | 
|
277  | 
val sg_ref = foldl merge_sg (Sign.self_ref (Thm.sign_of_thm (hd thms)), tl thms);  | 
|
278  | 
in enter_thmx (Sign.deref sg_ref) name_multi (name, thms) end;  | 
|
| 3987 | 279  | 
|
280  | 
||
| 7899 | 281  | 
(* forall_elim_vars (belongs to drule.ML) *)  | 
282  | 
||
283  | 
(*Replace outermost quantified variable by Var of given index.  | 
|
284  | 
Could clash with Vars already present.*)  | 
|
285  | 
fun forall_elim_var i th =  | 
|
286  | 
    let val {prop,sign,...} = rep_thm th
 | 
|
287  | 
in case prop of  | 
|
288  | 
          Const("all",_) $ Abs(a,T,_) =>
 | 
|
289  | 
forall_elim (cterm_of sign (Var((a,i), T))) th  | 
|
290  | 
        | _ => raise THM("forall_elim_var", i, [th])
 | 
|
291  | 
end;  | 
|
292  | 
||
293  | 
(*Repeat forall_elim_var until all outer quantifiers are removed*)  | 
|
294  | 
fun forall_elim_vars i th =  | 
|
295  | 
forall_elim_vars i (forall_elim_var i th)  | 
|
296  | 
handle THM _ => th;  | 
|
297  | 
||
298  | 
||
| 
4022
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
299  | 
(* store axioms as theorems *)  | 
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
300  | 
|
| 4853 | 301  | 
local  | 
| 7899 | 302  | 
fun get_axs thy named_axs =  | 
303  | 
map (forall_elim_vars 0 o Thm.get_axiom thy o fst) named_axs;  | 
|
| 7753 | 304  | 
|
| 
8419
 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 
wenzelm 
parents: 
8039 
diff
changeset
 | 
305  | 
fun add_single add (thy, ((name, ax), atts)) =  | 
| 4853 | 306  | 
let  | 
| 7753 | 307  | 
val named_ax = name_single name ax;  | 
308  | 
val thy' = add named_ax thy;  | 
|
309  | 
val thm = hd (get_axs thy' named_ax);  | 
|
| 
8419
 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 
wenzelm 
parents: 
8039 
diff
changeset
 | 
310  | 
in apsnd hd (add_thms [((name, thm), atts)] thy') end;  | 
| 7753 | 311  | 
|
| 
8419
 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 
wenzelm 
parents: 
8039 
diff
changeset
 | 
312  | 
fun add_multi add (thy, ((name, axs), atts)) =  | 
| 7753 | 313  | 
let  | 
314  | 
val named_axs = name_multi name axs;  | 
|
| 4853 | 315  | 
val thy' = add named_axs thy;  | 
| 7753 | 316  | 
val thms = get_axs thy' named_axs;  | 
| 
8419
 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 
wenzelm 
parents: 
8039 
diff
changeset
 | 
317  | 
in apsnd hd (add_thmss [((name, thms), atts)] thy') end;  | 
| 
4022
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
318  | 
|
| 
8419
 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 
wenzelm 
parents: 
8039 
diff
changeset
 | 
319  | 
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: 
8039 
diff
changeset
 | 
320  | 
fun add_multis add args thy = foldl_map (add_multi add) (thy, args);  | 
| 4853 | 321  | 
in  | 
| 7753 | 322  | 
val add_axioms = add_singles Theory.add_axioms;  | 
323  | 
val add_axioms_i = add_singles Theory.add_axioms_i;  | 
|
324  | 
val add_axiomss = add_multis Theory.add_axioms;  | 
|
325  | 
val add_axiomss_i = add_multis Theory.add_axioms_i;  | 
|
326  | 
val add_defs = add_singles Theory.add_defs;  | 
|
327  | 
val add_defs_i = add_singles Theory.add_defs_i;  | 
|
328  | 
val add_defss = add_multis Theory.add_defs;  | 
|
329  | 
val add_defss_i = add_multis Theory.add_defs_i;  | 
|
| 4853 | 330  | 
end;  | 
| 
4022
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
331  | 
|
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
332  | 
|
| 3987 | 333  | 
|
| 
4963
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
334  | 
(*** derived theory operations ***)  | 
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
335  | 
|
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
336  | 
(** theory management **)  | 
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
337  | 
|
| 5005 | 338  | 
(* data kind 'Pure/theory_management' *)  | 
| 
4963
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
339  | 
|
| 5005 | 340  | 
structure TheoryManagementDataArgs =  | 
341  | 
struct  | 
|
342  | 
val name = "Pure/theory_management";  | 
|
| 6660 | 343  | 
  type T = {name: string, version: int};
 | 
| 5000 | 344  | 
|
| 6660 | 345  | 
  val empty = {name = "", version = 0};
 | 
| 6547 | 346  | 
val copy = I;  | 
| 5005 | 347  | 
val prep_ext = I;  | 
| 5000 | 348  | 
fun merge _ = empty;  | 
| 5005 | 349  | 
fun print _ _ = ();  | 
| 
4963
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
350  | 
end;  | 
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
351  | 
|
| 5005 | 352  | 
structure TheoryManagementData = TheoryDataFun(TheoryManagementDataArgs);  | 
353  | 
val get_info = TheoryManagementData.get;  | 
|
354  | 
val put_info = TheoryManagementData.put;  | 
|
355  | 
||
| 
4963
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
356  | 
|
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
357  | 
(* get / put name *)  | 
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
358  | 
|
| 5000 | 359  | 
val get_name = #name o get_info;  | 
| 6660 | 360  | 
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: 
4933 
diff
changeset
 | 
361  | 
|
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
362  | 
|
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
363  | 
(* control prefixing of theory name *)  | 
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
364  | 
|
| 5210 | 365  | 
val global_path = Theory.root_path;  | 
| 
4963
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
366  | 
|
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
367  | 
fun local_path thy =  | 
| 5210 | 368  | 
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: 
4933 
diff
changeset
 | 
369  | 
|
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
370  | 
|
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
371  | 
(* begin / end theory *)  | 
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
372  | 
|
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
373  | 
fun begin_theory name thys =  | 
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
374  | 
Theory.prep_ext_merge thys  | 
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
375  | 
|> put_name name  | 
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
376  | 
|> local_path;  | 
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
377  | 
|
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
378  | 
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: 
4933 
diff
changeset
 | 
379  | 
|
| 6682 | 380  | 
fun checkpoint thy =  | 
381  | 
if is_draft thy then  | 
|
382  | 
    let val {name, version} = get_info thy in
 | 
|
383  | 
thy  | 
|
384  | 
|> Theory.add_name (name ^ ":" ^ string_of_int version)  | 
|
385  | 
      |> put_info {name = name, version = version + 1}
 | 
|
386  | 
end  | 
|
387  | 
else thy;  | 
|
| 5000 | 388  | 
|
389  | 
||
| 
4963
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
390  | 
|
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
391  | 
(** add logical types **)  | 
| 
4922
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
392  | 
|
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
393  | 
fun add_typedecls decls thy =  | 
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
394  | 
let  | 
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
395  | 
val full = Sign.full_name (Theory.sign_of thy);  | 
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
396  | 
|
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
397  | 
fun type_of (raw_name, vs, mx) =  | 
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
398  | 
if null (duplicates vs) then (raw_name, length vs, mx)  | 
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
399  | 
      else error ("Duplicate parameters in type declaration: " ^ quote raw_name);
 | 
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
400  | 
|
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
401  | 
fun arity_of (raw_name, len, mx) =  | 
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
402  | 
(full (Syntax.type_name raw_name mx), replicate len logicS, logicS);  | 
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
403  | 
|
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
404  | 
val types = map type_of decls;  | 
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
405  | 
val arities = map arity_of types;  | 
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
406  | 
in  | 
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
407  | 
thy  | 
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
408  | 
|> Theory.add_types types  | 
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
409  | 
|> Theory.add_arities_i arities  | 
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
410  | 
end;  | 
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
411  | 
|
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
412  | 
|
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
413  | 
|
| 5091 | 414  | 
(*** the ProtoPure theory ***)  | 
| 3987 | 415  | 
|
| 
6560
 
1436349f8b28
renamed 'dummy' to 'dummy_pattern' (less dangerous);
 
wenzelm 
parents: 
6547 
diff
changeset
 | 
416  | 
val dummy_patternN = "dummy_pattern";  | 
| 
 
1436349f8b28
renamed 'dummy' to 'dummy_pattern' (less dangerous);
 
wenzelm 
parents: 
6547 
diff
changeset
 | 
417  | 
|
| 3987 | 418  | 
val proto_pure =  | 
419  | 
Theory.pre_pure  | 
|
| 5907 | 420  | 
|> Library.apply [TheoremsData.init, TheoryManagementData.init]  | 
| 
4963
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
421  | 
|> put_name "ProtoPure"  | 
| 
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
422  | 
|> global_path  | 
| 3987 | 423  | 
|> Theory.add_types  | 
| 
4922
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
424  | 
   [("fun", 2, NoSyn),
 | 
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
425  | 
    ("prop", 0, NoSyn),
 | 
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
426  | 
    ("itself", 1, NoSyn),
 | 
| 
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
427  | 
    ("dummy", 0, NoSyn)]
 | 
| 3987 | 428  | 
|> Theory.add_classes_i [(logicC, [])]  | 
429  | 
|> Theory.add_defsort_i logicS  | 
|
430  | 
|> Theory.add_arities_i  | 
|
431  | 
   [("fun", [logicS, logicS], logicS),
 | 
|
432  | 
    ("prop", [], logicS),
 | 
|
433  | 
    ("itself", [logicS], logicS)]
 | 
|
| 
4922
 
03b81b6e1baa
added thms_closure: theory -> xstring -> tthm list option;
 
wenzelm 
parents: 
4853 
diff
changeset
 | 
434  | 
|> Theory.add_nonterminals Syntax.pure_nonterms  | 
| 3987 | 435  | 
|> Theory.add_syntax Syntax.pure_syntax  | 
| 6692 | 436  | 
|> Theory.add_modesyntax (Symbol.symbolsN, true) Syntax.pure_sym_syntax  | 
437  | 
|> Theory.add_modesyntax (Symbol.xsymbolsN, true) Syntax.pure_xsym_syntax  | 
|
| 3987 | 438  | 
|> Theory.add_trfuns Syntax.pure_trfuns  | 
439  | 
|> Theory.add_trfunsT Syntax.pure_trfunsT  | 
|
440  | 
|> Theory.add_syntax  | 
|
| 7949 | 441  | 
   [("==>", "[prop, prop] => prop", Delimfix "op ==>"),
 | 
442  | 
(dummy_patternN, "aprop", Delimfix "'_")]  | 
|
| 3987 | 443  | 
|> Theory.add_consts  | 
444  | 
   [("==", "['a::{}, 'a] => prop", InfixrName ("==", 2)),
 | 
|
445  | 
    ("=?=", "['a::{}, 'a] => prop", InfixrName ("=?=", 2)),
 | 
|
446  | 
    ("==>", "[prop, prop] => prop", Mixfix ("(_/ ==> _)", [2, 1], 1)),
 | 
|
447  | 
    ("all", "('a => prop) => prop", Binder ("!!", 0, 0)),
 | 
|
| 8039 | 448  | 
    ("Goal", "prop => prop", Mixfix ("GOAL _", [1000], 999)),
 | 
| 6547 | 449  | 
    ("TYPE", "'a itself", NoSyn),
 | 
| 
6560
 
1436349f8b28
renamed 'dummy' to 'dummy_pattern' (less dangerous);
 
wenzelm 
parents: 
6547 
diff
changeset
 | 
450  | 
(dummy_patternN, "'a", Delimfix "'_")]  | 
| 
5041
 
a1d0a6d555cd
Goals may now contain assumptions, which are not returned.
 
nipkow 
parents: 
5026 
diff
changeset
 | 
451  | 
  |> Theory.add_modesyntax ("", false)
 | 
| 8039 | 452  | 
    [("Goal", "prop => prop", Mixfix ("_", [0], 0))]
 | 
| 
4963
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
453  | 
|> local_path  | 
| 
8419
 
4770b1a12a93
add_thms, add_axioms, add_defs: return theorems as well;
 
wenzelm 
parents: 
8039 
diff
changeset
 | 
454  | 
|> (#1 oo (add_defs o map Thm.no_attributes))  | 
| 4788 | 455  | 
   [("flexpair_def", "(t =?= u) == (t == u::'a::{})"),
 | 
456  | 
    ("Goal_def", "GOAL (PROP A) == PROP A")]
 | 
|
| 
4963
 
38aa2d56e28c
added get_name, put_name, global_path, local_path, begin_theory,
 
wenzelm 
parents: 
4933 
diff
changeset
 | 
457  | 
|> end_theory;  | 
| 3987 | 458  | 
|
| 5091 | 459  | 
structure ProtoPure =  | 
460  | 
struct  | 
|
461  | 
val thy = proto_pure;  | 
|
462  | 
val flexpair_def = get_axiom thy "flexpair_def";  | 
|
463  | 
val Goal_def = get_axiom thy "Goal_def";  | 
|
464  | 
end;  | 
|
| 3987 | 465  | 
|
466  | 
||
467  | 
end;  | 
|
468  | 
||
469  | 
||
| 
4022
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
470  | 
structure BasicPureThy: BASIC_PURE_THY = PureThy;  | 
| 
 
0770a19c48d3
added ignored_consts, thms_containing, add_store_axioms(_i),
 
wenzelm 
parents: 
4013 
diff
changeset
 | 
471  | 
open BasicPureThy;  |