| author | wenzelm | 
| Sat, 16 Apr 2011 12:46:18 +0200 | |
| changeset 42357 | 3305f573294e | 
| parent 40124 | fc77d3211f71 | 
| child 42360 | da8817d01e7c | 
| permissions | -rw-r--r-- | 
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
1  | 
(* Title: Pure/variable.ML  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
2  | 
Author: Makarius  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
3  | 
|
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
4  | 
Fixed type/term variables and polymorphic term abbreviations.  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
5  | 
*)  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
6  | 
|
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
7  | 
signature VARIABLE =  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
8  | 
sig  | 
| 20303 | 9  | 
val is_body: Proof.context -> bool  | 
10  | 
val set_body: bool -> Proof.context -> Proof.context  | 
|
11  | 
val restore_body: Proof.context -> Proof.context -> Proof.context  | 
|
12  | 
val names_of: Proof.context -> Name.context  | 
|
13  | 
val fixes_of: Proof.context -> (string * string) list  | 
|
14  | 
val binds_of: Proof.context -> (typ * term) Vartab.table  | 
|
| 24765 | 15  | 
val maxidx_of: Proof.context -> int  | 
| 28625 | 16  | 
val sorts_of: Proof.context -> sort list  | 
| 20303 | 17  | 
val constraints_of: Proof.context -> typ Vartab.table * sort Vartab.table  | 
18  | 
val is_declared: Proof.context -> string -> bool  | 
|
19  | 
val is_fixed: Proof.context -> string -> bool  | 
|
20  | 
val newly_fixed: Proof.context -> Proof.context -> string -> bool  | 
|
| 21571 | 21  | 
val add_fixed: Proof.context -> term -> (string * typ) list -> (string * typ) list  | 
| 42357 | 22  | 
val name: binding -> string  | 
| 20303 | 23  | 
val default_type: Proof.context -> string -> typ option  | 
24  | 
val def_type: Proof.context -> bool -> indexname -> typ option  | 
|
25  | 
val def_sort: Proof.context -> indexname -> sort option  | 
|
| 27280 | 26  | 
val declare_names: term -> Proof.context -> Proof.context  | 
| 20303 | 27  | 
val declare_constraints: term -> Proof.context -> Proof.context  | 
28  | 
val declare_term: term -> Proof.context -> Proof.context  | 
|
| 27280 | 29  | 
val declare_typ: typ -> Proof.context -> Proof.context  | 
| 20303 | 30  | 
val declare_prf: Proofterm.proof -> Proof.context -> Proof.context  | 
31  | 
val declare_thm: thm -> Proof.context -> Proof.context  | 
|
| 
36603
 
d5d6111761a6
renamed Variable.thm_context to Variable.global_thm_context to emphasize that this is not the real thing;
 
wenzelm 
parents: 
33957 
diff
changeset
 | 
32  | 
val global_thm_context: thm -> Proof.context  | 
| 20303 | 33  | 
val variant_frees: Proof.context -> term list -> (string * 'a) list -> (string * 'a) list  | 
| 30756 | 34  | 
val bind_term: indexname * term option -> Proof.context -> Proof.context  | 
| 20303 | 35  | 
val expand_binds: Proof.context -> term -> term  | 
| 25325 | 36  | 
val lookup_const: Proof.context -> string -> string option  | 
| 
25316
 
17c183417f93
added is_const/declare_const for local scope of fixes/consts;
 
wenzelm 
parents: 
25051 
diff
changeset
 | 
37  | 
val is_const: Proof.context -> string -> bool  | 
| 25325 | 38  | 
val declare_const: string * string -> Proof.context -> Proof.context  | 
| 20303 | 39  | 
val add_fixes: string list -> Proof.context -> string list * Proof.context  | 
40  | 
val add_fixes_direct: string list -> Proof.context -> Proof.context  | 
|
| 21369 | 41  | 
val auto_fixes: term -> Proof.context -> Proof.context  | 
| 
20797
 
c1f0bc7e7d80
renamed Variable.invent_fixes to Variable.variant_fixes;
 
wenzelm 
parents: 
20579 
diff
changeset
 | 
42  | 
val variant_fixes: string list -> Proof.context -> string list * Proof.context  | 
| 20303 | 43  | 
val invent_types: sort list -> Proof.context -> (string * sort) list * Proof.context  | 
44  | 
val export_terms: Proof.context -> Proof.context -> term list -> term list  | 
|
45  | 
val exportT_terms: Proof.context -> Proof.context -> term list -> term list  | 
|
46  | 
val exportT: Proof.context -> Proof.context -> thm list -> thm list  | 
|
47  | 
val export_prf: Proof.context -> Proof.context -> Proofterm.proof -> Proofterm.proof  | 
|
48  | 
val export: Proof.context -> Proof.context -> thm list -> thm list  | 
|
| 21522 | 49  | 
val export_morphism: Proof.context -> Proof.context -> morphism  | 
| 20303 | 50  | 
val importT_inst: term list -> Proof.context -> ((indexname * sort) * typ) list * Proof.context  | 
51  | 
val import_inst: bool -> term list -> Proof.context ->  | 
|
52  | 
(((indexname * sort) * typ) list * ((indexname * typ) * term) list) * Proof.context  | 
|
53  | 
val importT_terms: term list -> Proof.context -> term list * Proof.context  | 
|
54  | 
val import_terms: bool -> term list -> Proof.context -> term list * Proof.context  | 
|
| 
32280
 
4fb3f426052a
Variable.importT/import: return full instantiations, tuned;
 
wenzelm 
parents: 
32199 
diff
changeset
 | 
55  | 
val importT: thm list -> Proof.context -> ((ctyp * ctyp) list * thm list) * Proof.context  | 
| 20303 | 56  | 
val import_prf: bool -> Proofterm.proof -> Proof.context -> Proofterm.proof * Proof.context  | 
| 
31794
 
71af1fd6a5e4
renamed Variable.import_thms to Variable.import (back again cf. ed7aa5a350ef -- Alice is no longer supported);
 
wenzelm 
parents: 
30756 
diff
changeset
 | 
57  | 
val import: bool -> thm list -> Proof.context ->  | 
| 
32280
 
4fb3f426052a
Variable.importT/import: return full instantiations, tuned;
 
wenzelm 
parents: 
32199 
diff
changeset
 | 
58  | 
(((ctyp * ctyp) list * (cterm * cterm) list) * thm list) * Proof.context  | 
| 21287 | 59  | 
val tradeT: (Proof.context -> thm list -> thm list) -> Proof.context -> thm list -> thm list  | 
60  | 
val trade: (Proof.context -> thm list -> thm list) -> Proof.context -> thm list -> thm list  | 
|
| 32199 | 61  | 
val focus: cterm -> Proof.context -> ((string * cterm) list * cterm) * Proof.context  | 
62  | 
val focus_subgoal: int -> thm -> Proof.context -> ((string * cterm) list * cterm) * Proof.context  | 
|
| 20303 | 63  | 
val warn_extra_tfrees: Proof.context -> Proof.context -> unit  | 
| 24694 | 64  | 
val polymorphic_types: Proof.context -> term list -> (indexname * sort) list * term list  | 
| 20303 | 65  | 
val polymorphic: Proof.context -> term list -> term list  | 
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
66  | 
end;  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
67  | 
|
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
68  | 
structure Variable: VARIABLE =  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
69  | 
struct  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
70  | 
|
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
71  | 
(** local context data **)  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
72  | 
|
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
73  | 
datatype data = Data of  | 
| 20102 | 74  | 
 {is_body: bool,                        (*inner body mode*)
 | 
| 20162 | 75  | 
names: Name.context, (*type/term variable names*)  | 
| 25325 | 76  | 
consts: string Symtab.table, (*consts within the local scope*)  | 
| 20162 | 77  | 
fixes: (string * string) list, (*term fixes -- extern/intern*)  | 
| 20102 | 78  | 
binds: (typ * term) Vartab.table, (*term bindings*)  | 
| 20162 | 79  | 
type_occs: string list Symtab.table, (*type variables -- possibly within term variables*)  | 
| 24765 | 80  | 
maxidx: int, (*maximum var index*)  | 
| 40124 | 81  | 
sorts: sort Ord_List.T, (*declared sort occurrences*)  | 
| 20162 | 82  | 
constraints:  | 
| 20102 | 83  | 
typ Vartab.table * (*type constraints*)  | 
| 20162 | 84  | 
sort Vartab.table}; (*default sorts*)  | 
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
85  | 
|
| 28625 | 86  | 
fun make_data (is_body, names, consts, fixes, binds, type_occs, maxidx, sorts, constraints) =  | 
| 25325 | 87  | 
  Data {is_body = is_body, names = names, consts = consts, fixes = fixes, binds = binds,
 | 
| 28625 | 88  | 
type_occs = type_occs, maxidx = maxidx, sorts = sorts, constraints = constraints};  | 
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
89  | 
|
| 33519 | 90  | 
structure Data = Proof_Data  | 
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
91  | 
(  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
92  | 
type T = data;  | 
| 32784 | 93  | 
fun init _ =  | 
| 
25316
 
17c183417f93
added is_const/declare_const for local scope of fixes/consts;
 
wenzelm 
parents: 
25051 
diff
changeset
 | 
94  | 
make_data (false, Name.context, Symtab.empty, [], Vartab.empty, Symtab.empty,  | 
| 28625 | 95  | 
~1, [], (Vartab.empty, Vartab.empty));  | 
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
96  | 
);  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
97  | 
|
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
98  | 
fun map_data f =  | 
| 28625 | 99  | 
  Data.map (fn Data {is_body, names, consts, fixes, binds, type_occs, maxidx, sorts, constraints} =>
 | 
100  | 
make_data (f (is_body, names, consts, fixes, binds, type_occs, maxidx, sorts, constraints)));  | 
|
| 
25316
 
17c183417f93
added is_const/declare_const for local scope of fixes/consts;
 
wenzelm 
parents: 
25051 
diff
changeset
 | 
101  | 
|
| 
 
17c183417f93
added is_const/declare_const for local scope of fixes/consts;
 
wenzelm 
parents: 
25051 
diff
changeset
 | 
102  | 
fun map_names f =  | 
| 28625 | 103  | 
map_data (fn (is_body, names, consts, fixes, binds, type_occs, maxidx, sorts, constraints) =>  | 
104  | 
(is_body, f names, consts, fixes, binds, type_occs, maxidx, sorts, constraints));  | 
|
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
105  | 
|
| 25325 | 106  | 
fun map_consts f =  | 
| 28625 | 107  | 
map_data (fn (is_body, names, consts, fixes, binds, type_occs, maxidx, sorts, constraints) =>  | 
108  | 
(is_body, names, f consts, fixes, binds, type_occs, maxidx, sorts, constraints));  | 
|
| 20162 | 109  | 
|
| 
25316
 
17c183417f93
added is_const/declare_const for local scope of fixes/consts;
 
wenzelm 
parents: 
25051 
diff
changeset
 | 
110  | 
fun map_fixes f =  | 
| 28625 | 111  | 
map_data (fn (is_body, names, consts, fixes, binds, type_occs, maxidx, sorts, constraints) =>  | 
112  | 
(is_body, names, consts, f fixes, binds, type_occs, maxidx, sorts, constraints));  | 
|
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
113  | 
|
| 
25316
 
17c183417f93
added is_const/declare_const for local scope of fixes/consts;
 
wenzelm 
parents: 
25051 
diff
changeset
 | 
114  | 
fun map_binds f =  | 
| 28625 | 115  | 
map_data (fn (is_body, names, consts, fixes, binds, type_occs, maxidx, sorts, constraints) =>  | 
116  | 
(is_body, names, consts, fixes, f binds, type_occs, maxidx, sorts, constraints));  | 
|
| 24765 | 117  | 
|
| 
25316
 
17c183417f93
added is_const/declare_const for local scope of fixes/consts;
 
wenzelm 
parents: 
25051 
diff
changeset
 | 
118  | 
fun map_type_occs f =  | 
| 28625 | 119  | 
map_data (fn (is_body, names, consts, fixes, binds, type_occs, maxidx, sorts, constraints) =>  | 
120  | 
(is_body, names, consts, fixes, binds, f type_occs, maxidx, sorts, constraints));  | 
|
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
121  | 
|
| 
25316
 
17c183417f93
added is_const/declare_const for local scope of fixes/consts;
 
wenzelm 
parents: 
25051 
diff
changeset
 | 
122  | 
fun map_maxidx f =  | 
| 28625 | 123  | 
map_data (fn (is_body, names, consts, fixes, binds, type_occs, maxidx, sorts, constraints) =>  | 
124  | 
(is_body, names, consts, fixes, binds, type_occs, f maxidx, sorts, constraints));  | 
|
125  | 
||
126  | 
fun map_sorts f =  | 
|
127  | 
map_data (fn (is_body, names, consts, fixes, binds, type_occs, maxidx, sorts, constraints) =>  | 
|
128  | 
(is_body, names, consts, fixes, binds, type_occs, maxidx, f sorts, constraints));  | 
|
| 20102 | 129  | 
|
| 
25316
 
17c183417f93
added is_const/declare_const for local scope of fixes/consts;
 
wenzelm 
parents: 
25051 
diff
changeset
 | 
130  | 
fun map_constraints f =  | 
| 28625 | 131  | 
map_data (fn (is_body, names, consts, fixes, binds, type_occs, maxidx, sorts, constraints) =>  | 
132  | 
(is_body, names, consts, fixes, binds, type_occs, maxidx, sorts, f constraints));  | 
|
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
133  | 
|
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
134  | 
fun rep_data ctxt = Data.get ctxt |> (fn Data args => args);  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
135  | 
|
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
136  | 
val is_body = #is_body o rep_data;  | 
| 24765 | 137  | 
|
| 28625 | 138  | 
fun set_body b =  | 
139  | 
map_data (fn (_, names, consts, fixes, binds, type_occs, maxidx, sorts, constraints) =>  | 
|
140  | 
(b, names, consts, fixes, binds, type_occs, maxidx, sorts, constraints));  | 
|
| 24765 | 141  | 
|
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
142  | 
fun restore_body ctxt = set_body (is_body ctxt);  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
143  | 
|
| 20102 | 144  | 
val names_of = #names o rep_data;  | 
145  | 
val fixes_of = #fixes o rep_data;  | 
|
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
146  | 
val binds_of = #binds o rep_data;  | 
| 20162 | 147  | 
val type_occs_of = #type_occs o rep_data;  | 
| 24765 | 148  | 
val maxidx_of = #maxidx o rep_data;  | 
| 28625 | 149  | 
val sorts_of = #sorts o rep_data;  | 
| 20162 | 150  | 
val constraints_of = #constraints o rep_data;  | 
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
151  | 
|
| 20162 | 152  | 
val is_declared = Name.is_declared o names_of;  | 
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
153  | 
fun is_fixed ctxt x = exists (fn (_, y) => x = y) (fixes_of ctxt);  | 
| 20149 | 154  | 
fun newly_fixed inner outer x = is_fixed inner x andalso not (is_fixed outer x);  | 
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
155  | 
|
| 21571 | 156  | 
fun add_fixed ctxt = Term.fold_aterms  | 
157  | 
(fn Free (x, T) => if is_fixed ctxt x then insert (op =) (x, T) else I | _ => I);  | 
|
158  | 
||
| 42357 | 159  | 
(*checked name binding*)  | 
160  | 
val name = Long_Name.base_name o Name_Space.full_name Name_Space.default_naming;  | 
|
161  | 
||
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
162  | 
|
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
163  | 
|
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
164  | 
(** declarations **)  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
165  | 
|
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
166  | 
(* default sorts and types *)  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
167  | 
|
| 20162 | 168  | 
fun default_type ctxt x = Vartab.lookup (#1 (constraints_of ctxt)) (x, ~1);  | 
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
169  | 
|
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
170  | 
fun def_type ctxt pattern xi =  | 
| 20162 | 171  | 
  let val {binds, constraints = (types, _), ...} = rep_data ctxt in
 | 
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
172  | 
(case Vartab.lookup types xi of  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
173  | 
NONE =>  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
174  | 
if pattern then NONE  | 
| 
39290
 
44e4d8dfd6bf
load type_infer.ML later -- proper context for Type_Infer.infer_types;
 
wenzelm 
parents: 
38831 
diff
changeset
 | 
175  | 
else Vartab.lookup binds xi |> Option.map (Type.mark_polymorphic o #1)  | 
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
176  | 
| some => some)  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
177  | 
end;  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
178  | 
|
| 20162 | 179  | 
val def_sort = Vartab.lookup o #2 o constraints_of;  | 
180  | 
||
181  | 
||
182  | 
(* names *)  | 
|
183  | 
||
| 24765 | 184  | 
fun declare_type_names t =  | 
| 29279 | 185  | 
map_names (fold_types (fold_atyps Term.declare_typ_names) t) #>  | 
| 24765 | 186  | 
map_maxidx (fold_types Term.maxidx_typ t);  | 
| 20162 | 187  | 
|
188  | 
fun declare_names t =  | 
|
189  | 
declare_type_names t #>  | 
|
| 29279 | 190  | 
map_names (fold_aterms Term.declare_term_frees t) #>  | 
| 24765 | 191  | 
map_maxidx (Term.maxidx_term t);  | 
| 20162 | 192  | 
|
193  | 
||
194  | 
(* type occurrences *)  | 
|
195  | 
||
| 
24719
 
21d1cdab2d8c
declare_constraints: declare (fix) type variables within constraints, but not terms themselves;
 
wenzelm 
parents: 
24694 
diff
changeset
 | 
196  | 
fun decl_type_occsT T = fold_atyps (fn TFree (a, _) => Symtab.default (a, []) | _ => I) T;  | 
| 
 
21d1cdab2d8c
declare_constraints: declare (fix) type variables within constraints, but not terms themselves;
 
wenzelm 
parents: 
24694 
diff
changeset
 | 
197  | 
|
| 22671 | 198  | 
val decl_type_occs = fold_term_types  | 
| 20162 | 199  | 
(fn Free (x, _) => fold_atyps (fn TFree (a, _) => Symtab.insert_list (op =) (a, x) | _ => I)  | 
| 
24719
 
21d1cdab2d8c
declare_constraints: declare (fix) type variables within constraints, but not terms themselves;
 
wenzelm 
parents: 
24694 
diff
changeset
 | 
200  | 
| _ => decl_type_occsT);  | 
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
201  | 
|
| 
24719
 
21d1cdab2d8c
declare_constraints: declare (fix) type variables within constraints, but not terms themselves;
 
wenzelm 
parents: 
24694 
diff
changeset
 | 
202  | 
val declare_type_occsT = map_type_occs o fold_types decl_type_occsT;  | 
| 22671 | 203  | 
val declare_type_occs = map_type_occs o decl_type_occs;  | 
204  | 
||
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
205  | 
|
| 20162 | 206  | 
(* constraints *)  | 
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
207  | 
|
| 21355 | 208  | 
fun constrain_tvar (xi, S) =  | 
209  | 
if S = dummyS then Vartab.delete_safe xi else Vartab.update (xi, S);  | 
|
210  | 
||
| 20162 | 211  | 
fun declare_constraints t = map_constraints (fn (types, sorts) =>  | 
212  | 
let  | 
|
213  | 
val types' = fold_aterms  | 
|
214  | 
(fn Free (x, T) => Vartab.update ((x, ~1), T)  | 
|
215  | 
| Var v => Vartab.update v  | 
|
216  | 
| _ => I) t types;  | 
|
217  | 
val sorts' = fold_types (fold_atyps  | 
|
| 21355 | 218  | 
(fn TFree (x, S) => constrain_tvar ((x, ~1), S)  | 
219  | 
| TVar v => constrain_tvar v  | 
|
| 20162 | 220  | 
| _ => I)) t sorts;  | 
221  | 
in (types', sorts') end)  | 
|
| 
24719
 
21d1cdab2d8c
declare_constraints: declare (fix) type variables within constraints, but not terms themselves;
 
wenzelm 
parents: 
24694 
diff
changeset
 | 
222  | 
#> declare_type_occsT t  | 
| 22711 | 223  | 
#> declare_type_names t;  | 
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
224  | 
|
| 20162 | 225  | 
|
226  | 
(* common declarations *)  | 
|
227  | 
||
228  | 
fun declare_internal t =  | 
|
229  | 
declare_names t #>  | 
|
| 28625 | 230  | 
declare_type_occs t #>  | 
231  | 
map_sorts (Sorts.insert_term t);  | 
|
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
232  | 
|
| 20162 | 233  | 
fun declare_term t =  | 
234  | 
declare_internal t #>  | 
|
235  | 
declare_constraints t;  | 
|
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
236  | 
|
| 27280 | 237  | 
val declare_typ = declare_term o Logic.mk_type;  | 
238  | 
||
| 20303 | 239  | 
val declare_prf = Proofterm.fold_proof_terms declare_internal (declare_internal o Logic.mk_type);  | 
240  | 
||
| 22691 | 241  | 
val declare_thm = Thm.fold_terms declare_internal;  | 
| 
36610
 
bafd82950e24
renamed ProofContext.init to ProofContext.init_global to emphasize that this is not the real thing;
 
wenzelm 
parents: 
36603 
diff
changeset
 | 
242  | 
fun global_thm_context th = declare_thm th (ProofContext.init_global (Thm.theory_of_thm th));  | 
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
243  | 
|
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
244  | 
|
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
245  | 
(* renaming term/type frees *)  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
246  | 
|
| 20162 | 247  | 
fun variant_frees ctxt ts frees =  | 
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
248  | 
let  | 
| 20162 | 249  | 
val names = names_of (fold declare_names ts ctxt);  | 
| 20084 | 250  | 
val xs = fst (Name.variants (map #1 frees) names);  | 
251  | 
in xs ~~ map snd frees end;  | 
|
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
252  | 
|
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
253  | 
|
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
254  | 
|
| 20303 | 255  | 
(** term bindings **)  | 
256  | 
||
| 30756 | 257  | 
fun bind_term (xi, NONE) = map_binds (Vartab.delete_safe xi)  | 
258  | 
| bind_term ((x, i), SOME t) =  | 
|
| 20303 | 259  | 
let  | 
| 25051 | 260  | 
val u = Term.close_schematic_term t;  | 
261  | 
val U = Term.fastype_of u;  | 
|
262  | 
in declare_term u #> map_binds (Vartab.update ((x, i), (U, u))) end;  | 
|
| 20303 | 263  | 
|
264  | 
fun expand_binds ctxt =  | 
|
265  | 
let  | 
|
266  | 
val binds = binds_of ctxt;  | 
|
| 21799 | 267  | 
val get = fn Var (xi, _) => Vartab.lookup binds xi | _ => NONE;  | 
268  | 
in Envir.beta_norm o Envir.expand_term get end;  | 
|
| 20303 | 269  | 
|
270  | 
||
271  | 
||
| 25325 | 272  | 
(** consts **)  | 
| 
25316
 
17c183417f93
added is_const/declare_const for local scope of fixes/consts;
 
wenzelm 
parents: 
25051 
diff
changeset
 | 
273  | 
|
| 25325 | 274  | 
val lookup_const = Symtab.lookup o #consts o rep_data;  | 
275  | 
val is_const = is_some oo lookup_const;  | 
|
| 
25316
 
17c183417f93
added is_const/declare_const for local scope of fixes/consts;
 
wenzelm 
parents: 
25051 
diff
changeset
 | 
276  | 
|
| 25325 | 277  | 
val declare_fixed = map_consts o Symtab.delete_safe;  | 
278  | 
val declare_const = map_consts o Symtab.update;  | 
|
| 
25316
 
17c183417f93
added is_const/declare_const for local scope of fixes/consts;
 
wenzelm 
parents: 
25051 
diff
changeset
 | 
279  | 
|
| 
 
17c183417f93
added is_const/declare_const for local scope of fixes/consts;
 
wenzelm 
parents: 
25051 
diff
changeset
 | 
280  | 
|
| 
 
17c183417f93
added is_const/declare_const for local scope of fixes/consts;
 
wenzelm 
parents: 
25051 
diff
changeset
 | 
281  | 
|
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
282  | 
(** fixes **)  | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
283  | 
|
| 20084 | 284  | 
local  | 
285  | 
||
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
286  | 
fun no_dups [] = ()  | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
287  | 
  | no_dups dups = error ("Duplicate fixed variable(s): " ^ commas_quote dups);
 | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
288  | 
|
| 20102 | 289  | 
fun new_fixes names' xs xs' =  | 
290  | 
map_names (K names') #>  | 
|
| 
25316
 
17c183417f93
added is_const/declare_const for local scope of fixes/consts;
 
wenzelm 
parents: 
25051 
diff
changeset
 | 
291  | 
fold declare_fixed xs #>  | 
| 20102 | 292  | 
map_fixes (fn fixes => (rev (xs ~~ xs') @ fixes)) #>  | 
| 20162 | 293  | 
fold (declare_constraints o Syntax.free) xs' #>  | 
| 20084 | 294  | 
pair xs';  | 
295  | 
||
296  | 
in  | 
|
297  | 
||
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
298  | 
fun add_fixes xs ctxt =  | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
299  | 
let  | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
300  | 
val _ =  | 
| 20084 | 301  | 
(case filter (can Name.dest_skolem) xs of [] => ()  | 
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
302  | 
      | bads => error ("Illegal internal Skolem constant(s): " ^ commas_quote bads));
 | 
| 20084 | 303  | 
val _ = no_dups (duplicates (op =) xs);  | 
304  | 
val (ys, zs) = split_list (fixes_of ctxt);  | 
|
| 20102 | 305  | 
val names = names_of ctxt;  | 
| 20084 | 306  | 
val (xs', names') =  | 
| 20149 | 307  | 
if is_body ctxt then Name.variants xs names |>> map Name.skolem  | 
| 
33049
 
c38f02fdf35d
curried inter as canonical list operation (beware of argument order)
 
haftmann 
parents: 
33038 
diff
changeset
 | 
308  | 
else (no_dups (inter (op =) xs ys); no_dups (inter (op =) xs zs);  | 
| 20084 | 309  | 
(xs, fold Name.declare xs names));  | 
| 20102 | 310  | 
in ctxt |> new_fixes names' xs xs' end;  | 
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
311  | 
|
| 
20797
 
c1f0bc7e7d80
renamed Variable.invent_fixes to Variable.variant_fixes;
 
wenzelm 
parents: 
20579 
diff
changeset
 | 
312  | 
fun variant_fixes raw_xs ctxt =  | 
| 20084 | 313  | 
let  | 
| 20102 | 314  | 
val names = names_of ctxt;  | 
| 
26714
 
4773b832f1b1
variant_fixes: preserve internal state, mark skolem only for body mode;
 
wenzelm 
parents: 
25573 
diff
changeset
 | 
315  | 
val xs = map (fn x => Name.clean x |> can Name.dest_internal x ? Name.internal) raw_xs;  | 
| 
 
4773b832f1b1
variant_fixes: preserve internal state, mark skolem only for body mode;
 
wenzelm 
parents: 
25573 
diff
changeset
 | 
316  | 
val (xs', names') = Name.variants xs names |>> (is_body ctxt ? map Name.skolem);  | 
| 20102 | 317  | 
in ctxt |> new_fixes names' xs xs' end;  | 
| 20084 | 318  | 
|
319  | 
end;  | 
|
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
320  | 
|
| 20251 | 321  | 
|
322  | 
fun add_fixes_direct xs ctxt = ctxt  | 
|
323  | 
|> set_body false  | 
|
324  | 
|> (snd o add_fixes xs)  | 
|
325  | 
|> restore_body ctxt;  | 
|
326  | 
||
327  | 
fun fix_frees t ctxt = ctxt  | 
|
328  | 
|> add_fixes_direct  | 
|
329  | 
(rev (fold_aterms (fn Free (x, _) =>  | 
|
| 21369 | 330  | 
if is_fixed ctxt x then I else insert (op =) x | _ => I) t []));  | 
331  | 
||
332  | 
fun auto_fixes t ctxt =  | 
|
333  | 
(if is_body ctxt then ctxt else fix_frees t ctxt)  | 
|
| 20251 | 334  | 
|> declare_term t;  | 
335  | 
||
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
336  | 
fun invent_types Ss ctxt =  | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
337  | 
let  | 
| 24848 | 338  | 
val tfrees = Name.invents (names_of ctxt) Name.aT (length Ss) ~~ Ss;  | 
| 20162 | 339  | 
val ctxt' = fold (declare_constraints o Logic.mk_type o TFree) tfrees ctxt;  | 
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
340  | 
in (tfrees, ctxt') end;  | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
341  | 
|
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
342  | 
|
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
343  | 
|
| 22671 | 344  | 
(** export -- generalize type/term variables (beware of closure sizes) **)  | 
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
345  | 
|
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
346  | 
fun export_inst inner outer =  | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
347  | 
let  | 
| 20162 | 348  | 
val declared_outer = is_declared outer;  | 
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
349  | 
val fixes_inner = fixes_of inner;  | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
350  | 
val fixes_outer = fixes_of outer;  | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
351  | 
|
| 33957 | 352  | 
val gen_fixes = map #2 (take (length fixes_inner - length fixes_outer) fixes_inner);  | 
| 20162 | 353  | 
val still_fixed = not o member (op =) gen_fixes;  | 
| 22671 | 354  | 
|
355  | 
val type_occs_inner = type_occs_of inner;  | 
|
356  | 
fun gen_fixesT ts =  | 
|
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
357  | 
Symtab.fold (fn (a, xs) =>  | 
| 20162 | 358  | 
if declared_outer a orelse exists still_fixed xs  | 
| 22671 | 359  | 
then I else cons a) (fold decl_type_occs ts type_occs_inner) [];  | 
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
360  | 
in (gen_fixesT, gen_fixes) end;  | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
361  | 
|
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
362  | 
fun exportT_inst inner outer = #1 (export_inst inner outer);  | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
363  | 
|
| 22671 | 364  | 
fun exportT_terms inner outer =  | 
365  | 
let val mk_tfrees = exportT_inst inner outer in  | 
|
366  | 
fn ts => ts |> map  | 
|
| 31977 | 367  | 
(Term_Subst.generalize (mk_tfrees ts, [])  | 
| 22671 | 368  | 
(fold (Term.fold_types Term.maxidx_typ) ts ~1 + 1))  | 
369  | 
end;  | 
|
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
370  | 
|
| 22671 | 371  | 
fun export_terms inner outer =  | 
372  | 
let val (mk_tfrees, tfrees) = export_inst inner outer in  | 
|
373  | 
fn ts => ts |> map  | 
|
| 31977 | 374  | 
(Term_Subst.generalize (mk_tfrees ts, tfrees)  | 
| 22671 | 375  | 
(fold Term.maxidx_term ts ~1 + 1))  | 
376  | 
end;  | 
|
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
377  | 
|
| 20303 | 378  | 
fun export_prf inner outer prf =  | 
379  | 
let  | 
|
| 22671 | 380  | 
val (mk_tfrees, frees) = export_inst (declare_prf prf inner) outer;  | 
381  | 
val tfrees = mk_tfrees [];  | 
|
| 20303 | 382  | 
val idx = Proofterm.maxidx_proof prf ~1 + 1;  | 
| 
36620
 
e6bb250402b5
simplified/unified fundamental operations on types/terms/proofterms -- prefer Same.operation over "option" variant;
 
wenzelm 
parents: 
36610 
diff
changeset
 | 
383  | 
val gen_term = Term_Subst.generalize_same (tfrees, frees) idx;  | 
| 
 
e6bb250402b5
simplified/unified fundamental operations on types/terms/proofterms -- prefer Same.operation over "option" variant;
 
wenzelm 
parents: 
36610 
diff
changeset
 | 
384  | 
val gen_typ = Term_Subst.generalizeT_same tfrees idx;  | 
| 
 
e6bb250402b5
simplified/unified fundamental operations on types/terms/proofterms -- prefer Same.operation over "option" variant;
 
wenzelm 
parents: 
36610 
diff
changeset
 | 
385  | 
in Same.commit (Proofterm.map_proof_terms_same gen_term gen_typ) prf end;  | 
| 20303 | 386  | 
|
| 22671 | 387  | 
|
388  | 
fun gen_export (mk_tfrees, frees) ths =  | 
|
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
389  | 
let  | 
| 22671 | 390  | 
val tfrees = mk_tfrees (map Thm.full_prop_of ths);  | 
391  | 
val maxidx = fold Thm.maxidx_thm ths ~1;  | 
|
392  | 
in map (Thm.generalize (tfrees, frees) (maxidx + 1)) ths end;  | 
|
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
393  | 
|
| 22671 | 394  | 
fun exportT inner outer = gen_export (exportT_inst inner outer, []);  | 
395  | 
fun export inner outer = gen_export (export_inst inner outer);  | 
|
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
396  | 
|
| 21522 | 397  | 
fun export_morphism inner outer =  | 
398  | 
let  | 
|
399  | 
val fact = export inner outer;  | 
|
400  | 
val term = singleton (export_terms inner outer);  | 
|
401  | 
val typ = Logic.type_map term;  | 
|
| 29605 | 402  | 
  in Morphism.morphism {binding = I, typ = typ, term = term, fact = fact} end;
 | 
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
403  | 
|
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
404  | 
|
| 24765 | 405  | 
|
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
406  | 
(** import -- fix schematic type/term variables **)  | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
407  | 
|
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
408  | 
fun importT_inst ts ctxt =  | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
409  | 
let  | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
410  | 
val tvars = rev (fold Term.add_tvars ts []);  | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
411  | 
val (tfrees, ctxt') = invent_types (map #2 tvars) ctxt;  | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
412  | 
in (tvars ~~ map TFree tfrees, ctxt') end;  | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
413  | 
|
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
414  | 
fun import_inst is_open ts ctxt =  | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
415  | 
let  | 
| 
26714
 
4773b832f1b1
variant_fixes: preserve internal state, mark skolem only for body mode;
 
wenzelm 
parents: 
25573 
diff
changeset
 | 
416  | 
val ren = Name.clean #> (if is_open then I else Name.internal);  | 
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
417  | 
val (instT, ctxt') = importT_inst ts ctxt;  | 
| 31977 | 418  | 
val vars = map (apsnd (Term_Subst.instantiateT instT)) (rev (fold Term.add_vars ts []));  | 
| 
20797
 
c1f0bc7e7d80
renamed Variable.invent_fixes to Variable.variant_fixes;
 
wenzelm 
parents: 
20579 
diff
changeset
 | 
419  | 
val (xs, ctxt'') = variant_fixes (map (ren o #1 o #1) vars) ctxt';  | 
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
420  | 
val inst = vars ~~ map Free (xs ~~ map #2 vars);  | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
421  | 
in ((instT, inst), ctxt'') end;  | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
422  | 
|
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
423  | 
fun importT_terms ts ctxt =  | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
424  | 
let val (instT, ctxt') = importT_inst ts ctxt  | 
| 31977 | 425  | 
in (map (Term_Subst.instantiate (instT, [])) ts, ctxt') end;  | 
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
426  | 
|
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
427  | 
fun import_terms is_open ts ctxt =  | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
428  | 
let val (inst, ctxt') = import_inst is_open ts ctxt  | 
| 31977 | 429  | 
in (map (Term_Subst.instantiate inst) ts, ctxt') end;  | 
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
430  | 
|
| 
31794
 
71af1fd6a5e4
renamed Variable.import_thms to Variable.import (back again cf. ed7aa5a350ef -- Alice is no longer supported);
 
wenzelm 
parents: 
30756 
diff
changeset
 | 
431  | 
fun importT ths ctxt =  | 
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
432  | 
let  | 
| 21522 | 433  | 
val thy = ProofContext.theory_of ctxt;  | 
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
434  | 
val (instT, ctxt') = importT_inst (map Thm.full_prop_of ths) ctxt;  | 
| 
32280
 
4fb3f426052a
Variable.importT/import: return full instantiations, tuned;
 
wenzelm 
parents: 
32199 
diff
changeset
 | 
435  | 
val insts' as (instT', _) = Thm.certify_inst thy (instT, []);  | 
| 
 
4fb3f426052a
Variable.importT/import: return full instantiations, tuned;
 
wenzelm 
parents: 
32199 
diff
changeset
 | 
436  | 
val ths' = map (Thm.instantiate insts') ths;  | 
| 
 
4fb3f426052a
Variable.importT/import: return full instantiations, tuned;
 
wenzelm 
parents: 
32199 
diff
changeset
 | 
437  | 
in ((instT', ths'), ctxt') end;  | 
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
438  | 
|
| 20303 | 439  | 
fun import_prf is_open prf ctxt =  | 
440  | 
let  | 
|
441  | 
val ts = rev (Proofterm.fold_proof_terms cons (cons o Logic.mk_type) prf []);  | 
|
442  | 
val (insts, ctxt') = import_inst is_open ts ctxt;  | 
|
443  | 
in (Proofterm.instantiate insts prf, ctxt') end;  | 
|
444  | 
||
| 
31794
 
71af1fd6a5e4
renamed Variable.import_thms to Variable.import (back again cf. ed7aa5a350ef -- Alice is no longer supported);
 
wenzelm 
parents: 
30756 
diff
changeset
 | 
445  | 
fun import is_open ths ctxt =  | 
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
446  | 
let  | 
| 21522 | 447  | 
val thy = ProofContext.theory_of ctxt;  | 
| 
32280
 
4fb3f426052a
Variable.importT/import: return full instantiations, tuned;
 
wenzelm 
parents: 
32199 
diff
changeset
 | 
448  | 
val (insts, ctxt') = import_inst is_open (map Thm.full_prop_of ths) ctxt;  | 
| 
 
4fb3f426052a
Variable.importT/import: return full instantiations, tuned;
 
wenzelm 
parents: 
32199 
diff
changeset
 | 
449  | 
val insts' = Thm.certify_inst thy insts;  | 
| 
 
4fb3f426052a
Variable.importT/import: return full instantiations, tuned;
 
wenzelm 
parents: 
32199 
diff
changeset
 | 
450  | 
val ths' = map (Thm.instantiate insts') ths;  | 
| 
 
4fb3f426052a
Variable.importT/import: return full instantiations, tuned;
 
wenzelm 
parents: 
32199 
diff
changeset
 | 
451  | 
in ((insts', ths'), ctxt') end;  | 
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
452  | 
|
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
453  | 
|
| 19926 | 454  | 
(* import/export *)  | 
455  | 
||
| 21287 | 456  | 
fun gen_trade imp exp f ctxt ths =  | 
| 20220 | 457  | 
let val ((_, ths'), ctxt') = imp ths ctxt  | 
| 21287 | 458  | 
in exp ctxt' ctxt (f ctxt' ths') end;  | 
| 19926 | 459  | 
|
| 
31794
 
71af1fd6a5e4
renamed Variable.import_thms to Variable.import (back again cf. ed7aa5a350ef -- Alice is no longer supported);
 
wenzelm 
parents: 
30756 
diff
changeset
 | 
460  | 
val tradeT = gen_trade importT exportT;  | 
| 
 
71af1fd6a5e4
renamed Variable.import_thms to Variable.import (back again cf. ed7aa5a350ef -- Alice is no longer supported);
 
wenzelm 
parents: 
30756 
diff
changeset
 | 
461  | 
val trade = gen_trade (import true) export;  | 
| 19926 | 462  | 
|
463  | 
||
| 20162 | 464  | 
(* focus on outermost parameters *)  | 
| 20149 | 465  | 
|
466  | 
fun forall_elim_prop t prop =  | 
|
| 20579 | 467  | 
Thm.beta_conversion false (Thm.capply (Thm.dest_arg prop) t)  | 
468  | 
|> Thm.cprop_of |> Thm.dest_arg;  | 
|
| 20149 | 469  | 
|
470  | 
fun focus goal ctxt =  | 
|
471  | 
let  | 
|
472  | 
val cert = Thm.cterm_of (Thm.theory_of_cterm goal);  | 
|
473  | 
val t = Thm.term_of goal;  | 
|
| 20162 | 474  | 
val ps = Term.variant_frees t (Term.strip_all_vars t); (*as they are printed :-*)  | 
| 20149 | 475  | 
val (xs, Ts) = split_list ps;  | 
| 
20797
 
c1f0bc7e7d80
renamed Variable.invent_fixes to Variable.variant_fixes;
 
wenzelm 
parents: 
20579 
diff
changeset
 | 
476  | 
val (xs', ctxt') = variant_fixes xs ctxt;  | 
| 20220 | 477  | 
val ps' = ListPair.map (cert o Free) (xs', Ts);  | 
478  | 
val goal' = fold forall_elim_prop ps' goal;  | 
|
| 
27119
 
c36c88fcdd22
focus: actually declare constraints for local parameters;
 
wenzelm 
parents: 
26714 
diff
changeset
 | 
479  | 
val ctxt'' = ctxt' |> fold (declare_constraints o Thm.term_of) ps';  | 
| 32199 | 480  | 
in ((xs ~~ ps', goal'), ctxt'') end;  | 
| 20149 | 481  | 
|
| 20303 | 482  | 
fun focus_subgoal i st =  | 
483  | 
let  | 
|
| 22691 | 484  | 
val all_vars = Thm.fold_terms Term.add_vars st [];  | 
| 20303 | 485  | 
val no_binds = map (fn (xi, _) => (xi, NONE)) all_vars;  | 
486  | 
in  | 
|
| 30756 | 487  | 
fold bind_term no_binds #>  | 
| 20303 | 488  | 
fold (declare_constraints o Var) all_vars #>  | 
489  | 
focus (Thm.cprem_of st i)  | 
|
490  | 
end;  | 
|
491  | 
||
492  | 
||
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
493  | 
|
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
494  | 
(** implicit polymorphism **)  | 
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
495  | 
|
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
496  | 
(* warn_extra_tfrees *)  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
497  | 
|
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
498  | 
fun warn_extra_tfrees ctxt1 ctxt2 =  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
499  | 
let  | 
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
500  | 
fun occs_typ a = Term.exists_subtype (fn TFree (b, _) => a = b | _ => false);  | 
| 20162 | 501  | 
fun occs_free a x =  | 
502  | 
(case def_type ctxt1 false (x, ~1) of  | 
|
503  | 
SOME T => if occs_typ a T then I else cons (a, x)  | 
|
504  | 
| NONE => cons (a, x));  | 
|
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
505  | 
|
| 20162 | 506  | 
val occs1 = type_occs_of ctxt1;  | 
507  | 
val occs2 = type_occs_of ctxt2;  | 
|
| 
19911
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
508  | 
val extras = Symtab.fold (fn (a, xs) =>  | 
| 
 
300bc6ce970d
major reworking of export functionality -- based on Term/Thm.generalize;
 
wenzelm 
parents: 
19899 
diff
changeset
 | 
509  | 
if Symtab.defined occs1 a then I else fold (occs_free a) xs) occs2 [];  | 
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
510  | 
val tfrees = map #1 extras |> sort_distinct string_ord;  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
511  | 
val frees = map #2 extras |> sort_distinct string_ord;  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
512  | 
in  | 
| 
38831
 
4933a3dfd745
more careful treatment of context visibility flag wrt. spurious warnings;
 
wenzelm 
parents: 
37145 
diff
changeset
 | 
513  | 
if null extras orelse not (Context_Position.is_visible ctxt2) then ()  | 
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
514  | 
    else warning ("Introduced fixed type variable(s): " ^ commas tfrees ^ " in " ^
 | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
515  | 
space_implode " or " (map quote frees))  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
516  | 
end;  | 
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
517  | 
|
| 
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
518  | 
|
| 20149 | 519  | 
(* polymorphic terms *)  | 
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
520  | 
|
| 24694 | 521  | 
fun polymorphic_types ctxt ts =  | 
| 20003 | 522  | 
let  | 
523  | 
val ctxt' = fold declare_term ts ctxt;  | 
|
| 20162 | 524  | 
val occs = type_occs_of ctxt;  | 
525  | 
val occs' = type_occs_of ctxt';  | 
|
526  | 
val types = Symtab.fold (fn (a, _) => if Symtab.defined occs a then I else cons a) occs' [];  | 
|
| 24765 | 527  | 
val idx = maxidx_of ctxt' + 1;  | 
| 24694 | 528  | 
val Ts' = (fold o fold_types o fold_atyps)  | 
529  | 
(fn T as TFree _ =>  | 
|
| 31977 | 530  | 
(case Term_Subst.generalizeT types idx T of TVar v => insert (op =) v | _ => I)  | 
| 24694 | 531  | 
| _ => I) ts [];  | 
| 31977 | 532  | 
val ts' = map (Term_Subst.generalize (types, []) idx) ts;  | 
| 24694 | 533  | 
in (rev Ts', ts') end;  | 
534  | 
||
535  | 
fun polymorphic ctxt ts = snd (polymorphic_types ctxt ts);  | 
|
| 20003 | 536  | 
|
| 
19899
 
b7385ca02d79
Fixed type/term variables and polymorphic term abbreviations.
 
wenzelm 
parents:  
diff
changeset
 | 
537  | 
end;  |