| author | wenzelm | 
| Sat, 20 Jun 1998 19:53:05 +0200 | |
| changeset 5057 | 16e3fadd759e | 
| parent 5025 | fc1a2421800f | 
| child 5642 | 1b3e48bdbb93 | 
| permissions | -rw-r--r-- | 
| 1526 | 1  | 
(* Title: Pure/theory.ML  | 
2  | 
ID: $Id$  | 
|
3  | 
Author: Lawrence C Paulson and Markus Wenzel  | 
|
4  | 
Copyright 1996 University of Cambridge  | 
|
5  | 
||
| 5025 | 6  | 
The abstract type "theory" of theories.  | 
| 1526 | 7  | 
*)  | 
8  | 
||
| 
3767
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
9  | 
signature BASIC_THEORY =  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
10  | 
sig  | 
| 1526 | 11  | 
type theory  | 
| 4786 | 12  | 
type local_theory  | 
| 1526 | 13  | 
exception THEORY of string * theory list  | 
| 3996 | 14  | 
val rep_theory: theory ->  | 
| 3814 | 15  | 
    {sign: Sign.sg,
 | 
| 3996 | 16  | 
axioms: term Symtab.table,  | 
| 4996 | 17  | 
oracles: ((Sign.sg * Object.T -> term) * stamp) Symtab.table,  | 
| 4019 | 18  | 
parents: theory list,  | 
19  | 
ancestors: theory list}  | 
|
| 3996 | 20  | 
val sign_of: theory -> Sign.sg  | 
21  | 
val syn_of: theory -> Syntax.syntax  | 
|
22  | 
val parents_of: theory -> theory list  | 
|
| 4019 | 23  | 
val ancestors_of: theory -> theory list  | 
| 3996 | 24  | 
val subthy: theory * theory -> bool  | 
25  | 
val eq_thy: theory * theory -> bool  | 
|
26  | 
val cert_axm: Sign.sg -> string * term -> string * term  | 
|
| 5057 | 27  | 
val read_def_axm: Sign.sg * (indexname -> typ option) * (indexname -> sort option) -> string list ->  | 
28  | 
string * string -> string * term  | 
|
| 3996 | 29  | 
val read_axm: Sign.sg -> string * string -> string * term  | 
30  | 
val inferT_axm: Sign.sg -> string * term -> string * term  | 
|
31  | 
val merge_theories: string -> theory * theory -> theory  | 
|
| 
3767
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
32  | 
end  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
33  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
34  | 
signature THEORY =  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
35  | 
sig  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
36  | 
include BASIC_THEORY  | 
| 4846 | 37  | 
val apply: (theory -> theory) list -> theory -> theory  | 
| 3996 | 38  | 
val axiomK: string  | 
39  | 
val oracleK: string  | 
|
| 4912 | 40  | 
(*theory extension primitives*)  | 
| 3996 | 41  | 
val add_classes: (bclass * xclass list) list -> theory -> theory  | 
42  | 
val add_classes_i: (bclass * class list) list -> theory -> theory  | 
|
43  | 
val add_classrel: (xclass * xclass) list -> theory -> theory  | 
|
44  | 
val add_classrel_i: (class * class) list -> theory -> theory  | 
|
45  | 
val add_defsort: xsort -> theory -> theory  | 
|
46  | 
val add_defsort_i: sort -> theory -> theory  | 
|
47  | 
val add_types: (bstring * int * mixfix) list -> theory -> theory  | 
|
| 4846 | 48  | 
val add_nonterminals: bstring list -> theory -> theory  | 
| 3996 | 49  | 
val add_tyabbrs: (bstring * string list * string * mixfix) list  | 
| 1526 | 50  | 
-> theory -> theory  | 
| 3996 | 51  | 
val add_tyabbrs_i: (bstring * string list * typ * mixfix) list  | 
| 1526 | 52  | 
-> theory -> theory  | 
| 3996 | 53  | 
val add_arities: (xstring * xsort list * xsort) list -> theory -> theory  | 
54  | 
val add_arities_i: (string * sort list * sort) list -> theory -> theory  | 
|
55  | 
val add_consts: (bstring * string * mixfix) list -> theory -> theory  | 
|
56  | 
val add_consts_i: (bstring * typ * mixfix) list -> theory -> theory  | 
|
57  | 
val add_syntax: (bstring * string * mixfix) list -> theory -> theory  | 
|
58  | 
val add_syntax_i: (bstring * typ * mixfix) list -> theory -> theory  | 
|
59  | 
val add_modesyntax: string * bool -> (bstring * string * mixfix) list -> theory -> theory  | 
|
60  | 
val add_modesyntax_i: string * bool -> (bstring * typ * mixfix) list -> theory -> theory  | 
|
61  | 
val add_trfuns:  | 
|
| 4344 | 62  | 
(string * (Syntax.ast list -> Syntax.ast)) list *  | 
63  | 
(string * (term list -> term)) list *  | 
|
64  | 
(string * (term list -> term)) list *  | 
|
65  | 
(string * (Syntax.ast list -> Syntax.ast)) list -> theory -> theory  | 
|
| 3996 | 66  | 
val add_trfunsT:  | 
| 4344 | 67  | 
(string * (bool -> typ -> term list -> term)) list -> theory -> theory  | 
| 2693 | 68  | 
val add_tokentrfuns:  | 
69  | 
(string * string * (string -> string * int)) list -> theory -> theory  | 
|
| 4617 | 70  | 
val add_trrules: (xstring * string) Syntax.trrule list -> theory -> theory  | 
| 3996 | 71  | 
val add_trrules_i: Syntax.ast Syntax.trrule list -> theory -> theory  | 
72  | 
val add_axioms: (bstring * string) list -> theory -> theory  | 
|
73  | 
val add_axioms_i: (bstring * term) list -> theory -> theory  | 
|
| 4996 | 74  | 
val add_oracle: bstring * (Sign.sg * Object.T -> term) -> theory -> theory  | 
| 3996 | 75  | 
val add_defs: (bstring * string) list -> theory -> theory  | 
76  | 
val add_defs_i: (bstring * term) list -> theory -> theory  | 
|
77  | 
val add_path: string -> theory -> theory  | 
|
| 4846 | 78  | 
val parent_path: theory -> theory  | 
79  | 
val root_path: theory -> theory  | 
|
| 3996 | 80  | 
val add_space: string * string list -> theory -> theory  | 
81  | 
val add_name: string -> theory -> theory  | 
|
| 4996 | 82  | 
val init_data: Object.kind -> (Object.T * (Object.T -> Object.T) *  | 
83  | 
(Object.T * Object.T -> Object.T) * (Sign.sg -> Object.T -> unit)) -> theory -> theory  | 
|
84  | 
val print_data: Object.kind -> theory -> unit  | 
|
85  | 
val get_data: Object.kind -> (Object.T -> 'a) -> theory -> 'a  | 
|
86  | 
  val put_data: Object.kind -> ('a -> Object.T) -> 'a -> theory -> theory
 | 
|
| 3996 | 87  | 
val prep_ext: theory -> theory  | 
88  | 
val prep_ext_merge: theory list -> theory  | 
|
| 4970 | 89  | 
val requires: theory -> string -> string -> unit  | 
| 3996 | 90  | 
val pre_pure: theory  | 
| 1526 | 91  | 
end;  | 
92  | 
||
93  | 
||
| 
3767
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
94  | 
structure Theory: THEORY =  | 
| 1526 | 95  | 
struct  | 
| 2206 | 96  | 
|
| 3996 | 97  | 
|
| 2206 | 98  | 
(** datatype theory **)  | 
| 1526 | 99  | 
|
100  | 
datatype theory =  | 
|
101  | 
  Theory of {
 | 
|
102  | 
sign: Sign.sg,  | 
|
| 3996 | 103  | 
axioms: term Symtab.table,  | 
| 4996 | 104  | 
oracles: ((Sign.sg * Object.T -> term) * stamp) Symtab.table,  | 
| 4019 | 105  | 
parents: theory list,  | 
106  | 
ancestors: theory list};  | 
|
| 1526 | 107  | 
|
| 4786 | 108  | 
(*forward definition for Isar proof contexts*)  | 
| 4996 | 109  | 
type local_theory = theory * Object.T Symtab.table;  | 
| 4786 | 110  | 
|
| 4996 | 111  | 
fun make_theory sign axms oras parents ancestors =  | 
| 4019 | 112  | 
  Theory {sign = sign, axioms = axms, oracles = oras,
 | 
113  | 
parents = parents, ancestors = ancestors};  | 
|
| 3996 | 114  | 
|
| 1526 | 115  | 
fun rep_theory (Theory args) = args;  | 
116  | 
||
| 3996 | 117  | 
val sign_of = #sign o rep_theory;  | 
118  | 
val syn_of = #syn o Sign.rep_sg o sign_of;  | 
|
119  | 
val parents_of = #parents o rep_theory;  | 
|
| 4019 | 120  | 
val ancestors_of = #ancestors o rep_theory;  | 
| 3996 | 121  | 
|
| 1526 | 122  | 
(*errors involving theories*)  | 
123  | 
exception THEORY of string * theory list;  | 
|
124  | 
||
125  | 
(*compare theories*)  | 
|
126  | 
val subthy = Sign.subsig o pairself sign_of;  | 
|
127  | 
val eq_thy = Sign.eq_sg o pairself sign_of;  | 
|
128  | 
||
| 4846 | 129  | 
(*check for some named theory*)  | 
| 4970 | 130  | 
fun requires thy name what =  | 
| 4846 | 131  | 
if exists (equal name) (Sign.stamp_names_of (sign_of thy)) then ()  | 
132  | 
  else error ("Require theory " ^ quote name ^ " as an ancestor for " ^ what);
 | 
|
| 1526 | 133  | 
|
| 4846 | 134  | 
(*partial Pure theory*)  | 
| 4996 | 135  | 
val pre_pure = make_theory Sign.pre_pure Symtab.empty Symtab.empty [] [];  | 
| 1526 | 136  | 
|
| 4846 | 137  | 
(*apply transformers*)  | 
138  | 
fun apply [] thy = thy  | 
|
139  | 
| apply (f :: fs) thy = apply fs (f thy);  | 
|
| 1526 | 140  | 
|
141  | 
||
142  | 
||
143  | 
(** extend theory **)  | 
|
144  | 
||
| 3814 | 145  | 
(*name space kinds*)  | 
| 3996 | 146  | 
val axiomK = "axiom";  | 
| 3814 | 147  | 
val oracleK = "oracle";  | 
148  | 
||
149  | 
||
150  | 
(* extend logical part of a theory *)  | 
|
151  | 
||
| 1526 | 152  | 
fun err_dup_axms names =  | 
153  | 
  error ("Duplicate axiom name(s) " ^ commas_quote names);
 | 
|
154  | 
||
| 3814 | 155  | 
fun err_dup_oras names =  | 
156  | 
  error ("Duplicate oracles " ^ commas_quote names);
 | 
|
157  | 
||
| 4996 | 158  | 
fun ext_theory thy ext_sg new_axms new_oras =  | 
| 1526 | 159  | 
let  | 
| 4019 | 160  | 
    val Theory {sign, axioms, oracles, parents, ancestors} = thy;
 | 
| 1526 | 161  | 
val draft = Sign.is_draft sign;  | 
| 3996 | 162  | 
val axioms' =  | 
| 4488 | 163  | 
Symtab.extend (if draft then axioms else Symtab.empty, new_axms)  | 
| 1526 | 164  | 
handle Symtab.DUPS names => err_dup_axms names;  | 
| 3814 | 165  | 
val oracles' =  | 
| 4488 | 166  | 
Symtab.extend (oracles, new_oras)  | 
| 3814 | 167  | 
handle Symtab.DUPS names => err_dup_oras names;  | 
| 4019 | 168  | 
val (parents', ancestors') =  | 
169  | 
if draft then (parents, ancestors) else ([thy], thy :: ancestors);  | 
|
| 1526 | 170  | 
in  | 
| 4996 | 171  | 
make_theory (ext_sg sign) axioms' oracles' parents' ancestors'  | 
| 1526 | 172  | 
end;  | 
173  | 
||
174  | 
||
175  | 
(* extend signature of a theory *)  | 
|
176  | 
||
| 4996 | 177  | 
fun ext_sign extfun decls thy = ext_theory thy (extfun decls) [] [];  | 
| 1526 | 178  | 
|
| 4996 | 179  | 
val add_classes = ext_sign Sign.add_classes;  | 
180  | 
val add_classes_i = ext_sign Sign.add_classes_i;  | 
|
181  | 
val add_classrel = ext_sign Sign.add_classrel;  | 
|
182  | 
val add_classrel_i = ext_sign Sign.add_classrel_i;  | 
|
183  | 
val add_defsort = ext_sign Sign.add_defsort;  | 
|
184  | 
val add_defsort_i = ext_sign Sign.add_defsort_i;  | 
|
185  | 
val add_types = ext_sign Sign.add_types;  | 
|
186  | 
val add_nonterminals = ext_sign Sign.add_nonterminals;  | 
|
187  | 
val add_tyabbrs = ext_sign Sign.add_tyabbrs;  | 
|
188  | 
val add_tyabbrs_i = ext_sign Sign.add_tyabbrs_i;  | 
|
189  | 
val add_arities = ext_sign Sign.add_arities;  | 
|
190  | 
val add_arities_i = ext_sign Sign.add_arities_i;  | 
|
191  | 
val add_consts = ext_sign Sign.add_consts;  | 
|
192  | 
val add_consts_i = ext_sign Sign.add_consts_i;  | 
|
193  | 
val add_syntax = ext_sign Sign.add_syntax;  | 
|
194  | 
val add_syntax_i = ext_sign Sign.add_syntax_i;  | 
|
195  | 
val add_modesyntax = curry (ext_sign Sign.add_modesyntax);  | 
|
196  | 
val add_modesyntax_i = curry (ext_sign Sign.add_modesyntax_i);  | 
|
197  | 
val add_trfuns = ext_sign Sign.add_trfuns;  | 
|
198  | 
val add_trfunsT = ext_sign Sign.add_trfunsT;  | 
|
199  | 
val add_tokentrfuns = ext_sign Sign.add_tokentrfuns;  | 
|
200  | 
val add_trrules = ext_sign Sign.add_trrules;  | 
|
201  | 
val add_trrules_i = ext_sign Sign.add_trrules_i;  | 
|
202  | 
val add_path = ext_sign Sign.add_path;  | 
|
| 4846 | 203  | 
val parent_path = add_path "..";  | 
204  | 
val root_path = add_path "/";  | 
|
| 4996 | 205  | 
val add_space = ext_sign Sign.add_space;  | 
206  | 
val add_name = ext_sign Sign.add_name;  | 
|
207  | 
val prep_ext = ext_sign (K Sign.prep_ext) ();  | 
|
| 1526 | 208  | 
|
| 3814 | 209  | 
|
| 3996 | 210  | 
|
| 3814 | 211  | 
(** add axioms **)  | 
212  | 
||
| 1526 | 213  | 
(* prepare axioms *)  | 
214  | 
||
215  | 
fun err_in_axm name =  | 
|
216  | 
  error ("The error(s) above occurred in axiom " ^ quote name);
 | 
|
217  | 
||
218  | 
fun no_vars tm =  | 
|
219  | 
if null (term_vars tm) andalso null (term_tvars tm) then tm  | 
|
220  | 
else error "Illegal schematic variable(s) in term";  | 
|
221  | 
||
222  | 
fun cert_axm sg (name, raw_tm) =  | 
|
223  | 
let  | 
|
224  | 
val (t, T, _) = Sign.certify_term sg raw_tm  | 
|
| 2979 | 225  | 
handle TYPE (msg, _, _) => error msg  | 
| 3996 | 226  | 
| TERM (msg, _) => error msg;  | 
| 1526 | 227  | 
in  | 
228  | 
assert (T = propT) "Term not of type prop";  | 
|
229  | 
(name, no_vars t)  | 
|
230  | 
end  | 
|
231  | 
handle ERROR => err_in_axm name;  | 
|
232  | 
||
| 5057 | 233  | 
(*some duplication of code with read_def_cterm*)  | 
234  | 
fun read_def_axm (sg, types, sorts) used (name, str) =  | 
|
| 3814 | 235  | 
let  | 
236  | 
val ts = Syntax.read (#syn (Sign.rep_sg sg)) propT str;  | 
|
| 5057 | 237  | 
val (t, _) = Sign.infer_types sg types sorts used true (ts, propT);  | 
| 
1960
 
ae390b599213
Improved error handling: if there are syntax or type-checking
 
paulson 
parents: 
1539 
diff
changeset
 | 
238  | 
in cert_axm sg (name,t) end  | 
| 
 
ae390b599213
Improved error handling: if there are syntax or type-checking
 
paulson 
parents: 
1539 
diff
changeset
 | 
239  | 
handle ERROR => err_in_axm name;  | 
| 1526 | 240  | 
|
| 5057 | 241  | 
fun read_axm sg name_str = read_def_axm (sg, K None, K None) [] name_str;  | 
242  | 
||
| 1526 | 243  | 
fun inferT_axm sg (name, pre_tm) =  | 
| 3814 | 244  | 
let  | 
| 4251 | 245  | 
val (t, _) = Sign.infer_types sg (K None) (K None) [] true ([pre_tm], propT);  | 
| 3814 | 246  | 
in (name, no_vars t) end  | 
| 1526 | 247  | 
handle ERROR => err_in_axm name;  | 
248  | 
||
249  | 
||
250  | 
(* extend axioms of a theory *)  | 
|
251  | 
||
| 3814 | 252  | 
fun ext_axms prep_axm raw_axms (thy as Theory {sign, ...}) =
 | 
| 1526 | 253  | 
let  | 
| 3814 | 254  | 
val raw_axms' = map (apfst (Sign.full_name sign)) raw_axms;  | 
255  | 
val axioms =  | 
|
256  | 
map (apsnd (Term.compress_term o Logic.varify) o prep_axm sign) raw_axms';  | 
|
| 4996 | 257  | 
val ext_sg = Sign.add_space (axiomK, map fst axioms);  | 
| 1526 | 258  | 
in  | 
| 4996 | 259  | 
ext_theory thy ext_sg axioms []  | 
| 1526 | 260  | 
end;  | 
261  | 
||
262  | 
val add_axioms = ext_axms read_axm;  | 
|
263  | 
val add_axioms_i = ext_axms cert_axm;  | 
|
264  | 
||
265  | 
||
| 3814 | 266  | 
(* add oracle **)  | 
267  | 
||
268  | 
fun add_oracle (raw_name, oracle) (thy as Theory {sign, ...}) =
 | 
|
269  | 
let  | 
|
270  | 
val name = Sign.full_name sign raw_name;  | 
|
| 4996 | 271  | 
val ext_sg = Sign.add_space (oracleK, [name]);  | 
| 3814 | 272  | 
in  | 
| 4996 | 273  | 
ext_theory thy ext_sg [] [(name, (oracle, stamp ()))]  | 
| 3814 | 274  | 
end;  | 
275  | 
||
276  | 
||
| 
3767
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
277  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
278  | 
(** add constant definitions **)  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
279  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
280  | 
(* all_axioms_of *)  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
281  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
282  | 
(*results may contain duplicates!*)  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
283  | 
|
| 4019 | 284  | 
fun all_axioms_of thy =  | 
285  | 
flat (map (Symtab.dest o #axioms o rep_theory) (thy :: ancestors_of thy));  | 
|
| 
3767
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
286  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
287  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
288  | 
(* clash_types, clash_consts *)  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
289  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
290  | 
(*check if types have common instance (ignoring sorts)*)  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
291  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
292  | 
fun clash_types ty1 ty2 =  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
293  | 
let  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
294  | 
val ty1' = Type.varifyT ty1;  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
295  | 
val ty2' = incr_tvar (maxidx_of_typ ty1' + 1) (Type.varifyT ty2);  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
296  | 
in  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
297  | 
Type.raw_unify (ty1', ty2')  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
298  | 
end;  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
299  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
300  | 
fun clash_consts (c1, ty1) (c2, ty2) =  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
301  | 
c1 = c2 andalso clash_types ty1 ty2;  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
302  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
303  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
304  | 
(* clash_defns *)  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
305  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
306  | 
fun clash_defn c_ty (name, tm) =  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
307  | 
let val (c, ty') = dest_Const (head_of (fst (Logic.dest_equals tm))) in  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
308  | 
if clash_consts c_ty (c, ty') then Some (name, ty') else None  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
309  | 
end handle TERM _ => None;  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
310  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
311  | 
fun clash_defns c_ty axms =  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
312  | 
distinct (mapfilter (clash_defn c_ty) axms);  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
313  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
314  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
315  | 
(* dest_defn *)  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
316  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
317  | 
fun dest_defn tm =  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
318  | 
let  | 
| 
3787
 
67571f49ebe3
new internal forms: add_classes_i, add_classrel_i, add_defsort_i, add_arities_i
 
wenzelm 
parents: 
3767 
diff
changeset
 | 
319  | 
fun err msg = raise TERM (msg, [tm]);  | 
| 
3767
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
320  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
321  | 
val (lhs, rhs) = Logic.dest_equals (Logic.strip_imp_concl tm)  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
322  | 
handle TERM _ => err "Not a meta-equality (==)";  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
323  | 
val (head, args) = strip_comb lhs;  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
324  | 
val (c, ty) = dest_Const head  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
325  | 
handle TERM _ => err "Head of lhs not a constant";  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
326  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
327  | 
fun occs_const (Const c_ty') = (c_ty' = (c, ty))  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
328  | 
| occs_const (Abs (_, _, t)) = occs_const t  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
329  | 
| occs_const (t $ u) = occs_const t orelse occs_const u  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
330  | 
| occs_const _ = false;  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
331  | 
|
| 4141 | 332  | 
fun dest_free (Free (x, _)) = x  | 
333  | 
      | dest_free (Const ("TYPE", Type ("itself", [TFree (x, _)]))) = x
 | 
|
334  | 
| dest_free _ = raise Match;  | 
|
335  | 
||
336  | 
val show_frees = commas_quote o map dest_free;  | 
|
| 
3767
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
337  | 
val show_tfrees = commas_quote o map fst;  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
338  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
339  | 
val lhs_dups = duplicates args;  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
340  | 
val rhs_extras = gen_rems (op =) (term_frees rhs, args);  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
341  | 
val rhs_extrasT = gen_rems (op =) (term_tfrees rhs, typ_tfrees ty);  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
342  | 
in  | 
| 4141 | 343  | 
if not (forall (can dest_free) args) then  | 
| 
3767
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
344  | 
err "Arguments (on lhs) must be variables"  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
345  | 
else if not (null lhs_dups) then  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
346  | 
      err ("Duplicate variables on lhs: " ^ show_frees lhs_dups)
 | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
347  | 
else if not (null rhs_extras) then  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
348  | 
      err ("Extra variables on rhs: " ^ show_frees rhs_extras)
 | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
349  | 
else if not (null rhs_extrasT) then  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
350  | 
      err ("Extra type variables on rhs: " ^ show_tfrees rhs_extrasT)
 | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
351  | 
else if occs_const rhs then  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
352  | 
      err ("Constant to be defined occurs on rhs")
 | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
353  | 
else (c, ty)  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
354  | 
end;  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
355  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
356  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
357  | 
(* check_defn *)  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
358  | 
|
| 3814 | 359  | 
fun err_in_defn sg name msg =  | 
| 4974 | 360  | 
  (error_msg msg; error ("The error(s) above occurred in definition " ^
 | 
| 3814 | 361  | 
quote (Sign.full_name sg name)));  | 
| 
3767
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
362  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
363  | 
fun check_defn sign (axms, (name, tm)) =  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
364  | 
let  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
365  | 
fun show_const (c, ty) = quote (Pretty.string_of (Pretty.block  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
366  | 
[Pretty.str (c ^ " ::"), Pretty.brk 1, Sign.pretty_typ sign ty]));  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
367  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
368  | 
fun show_defn c (dfn, ty') = show_const (c, ty') ^ " in " ^ dfn;  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
369  | 
fun show_defns c = cat_lines o map (show_defn c);  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
370  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
371  | 
val (c, ty) = dest_defn tm  | 
| 3814 | 372  | 
handle TERM (msg, _) => err_in_defn sign name msg;  | 
| 
3767
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
373  | 
val defns = clash_defns (c, ty) axms;  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
374  | 
in  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
375  | 
if not (null defns) then  | 
| 3814 | 376  | 
      err_in_defn sign name ("Definition of " ^ show_const (c, ty) ^
 | 
| 
3767
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
377  | 
"\nclashes with " ^ show_defns c defns)  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
378  | 
else (name, tm) :: axms  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
379  | 
end;  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
380  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
381  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
382  | 
(* add_defs *)  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
383  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
384  | 
fun ext_defns prep_axm raw_axms thy =  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
385  | 
let  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
386  | 
val axms = map (prep_axm (sign_of thy)) raw_axms;  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
387  | 
val all_axms = all_axioms_of thy;  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
388  | 
in  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
389  | 
foldl (check_defn (sign_of thy)) (all_axms, axms);  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
390  | 
add_axioms_i axms thy  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
391  | 
end;  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
392  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
393  | 
val add_defs_i = ext_defns cert_axm;  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
394  | 
val add_defs = ext_defns read_axm;  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
395  | 
|
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
396  | 
|
| 3878 | 397  | 
|
| 3865 | 398  | 
(** additional theory data **)  | 
399  | 
||
| 4996 | 400  | 
val init_data = curry (ext_sign Sign.init_data);  | 
401  | 
fun print_data kind = Sign.print_data kind o sign_of;  | 
|
402  | 
fun get_data kind f = Sign.get_data kind f o sign_of;  | 
|
403  | 
fun put_data kind f = ext_sign (Sign.put_data kind f);  | 
|
| 3865 | 404  | 
|
405  | 
||
| 
3767
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
406  | 
|
| 4019 | 407  | 
(** merge theories **) (*exception ERROR*)  | 
408  | 
||
409  | 
fun merge_sign (sg, thy) =  | 
|
| 4627 | 410  | 
Sign.nontriv_merge (sg, sign_of thy) handle TERM (msg, _) => error msg;  | 
| 1526 | 411  | 
|
| 3878 | 412  | 
(*merge list of theories from left to right, preparing extend*)  | 
| 
3967
 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 
wenzelm 
parents: 
3956 
diff
changeset
 | 
413  | 
fun prep_ext_merge thys =  | 
| 3996 | 414  | 
if null thys then  | 
| 4019 | 415  | 
error "Merge: no parent theories"  | 
| 3996 | 416  | 
else if exists (Sign.is_draft o sign_of) thys then  | 
| 4019 | 417  | 
error "Attempt to merge draft theories"  | 
| 3996 | 418  | 
else  | 
419  | 
let  | 
|
420  | 
val sign' =  | 
|
| 4019 | 421  | 
foldl merge_sign (sign_of (hd thys), tl thys)  | 
| 3996 | 422  | 
|> Sign.prep_ext  | 
423  | 
|> Sign.add_path "/";  | 
|
| 3814 | 424  | 
|
| 4488 | 425  | 
val axioms' = Symtab.empty;  | 
| 4019 | 426  | 
|
| 3996 | 427  | 
fun eq_ora ((_, (_, s1: stamp)), (_, (_, s2))) = s1 = s2;  | 
428  | 
val oracles' =  | 
|
429  | 
Symtab.make (gen_distinct eq_ora  | 
|
430  | 
(flat (map (Symtab.dest o #oracles o rep_theory) thys)))  | 
|
431  | 
handle Symtab.DUPS names => err_dup_oras names;  | 
|
| 4019 | 432  | 
|
433  | 
val parents' = gen_distinct eq_thy thys;  | 
|
434  | 
val ancestors' =  | 
|
435  | 
gen_distinct eq_thy (parents' @ flat (map ancestors_of thys));  | 
|
| 3996 | 436  | 
in  | 
| 4996 | 437  | 
make_theory sign' axioms' oracles' parents' ancestors'  | 
| 3996 | 438  | 
end;  | 
| 1526 | 439  | 
|
| 3885 | 440  | 
fun merge_theories name (thy1, thy2) =  | 
| 
3967
 
edd5ff9371f8
sg_ref: automatic adjustment of thms of draft theories;
 
wenzelm 
parents: 
3956 
diff
changeset
 | 
441  | 
prep_ext_merge [thy1, thy2]  | 
| 3885 | 442  | 
|> add_name name;  | 
443  | 
||
444  | 
||
| 1526 | 445  | 
end;  | 
446  | 
||
| 
3767
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
447  | 
structure BasicTheory: BASIC_THEORY = Theory;  | 
| 
 
e2bb53d8dd26
moved theory stuff (add_defs etc.) here from drule.ML;
 
wenzelm 
parents: 
2979 
diff
changeset
 | 
448  | 
open BasicTheory;  |