author | wenzelm |
Fri, 30 Mar 2012 19:36:41 +0200 | |
changeset 47234 | 0599911c2bf5 |
parent 46990 | 63fae4a2cc65 |
child 47783 | 0eadfb89badb |
permissions | -rw-r--r-- |
31723
f5cafe803b55
discontinued ancient tradition to suffix certain ML module names with "_package"
haftmann
parents:
31136
diff
changeset
|
1 |
(* Title: HOL/Tools/record.ML |
32763 | 2 |
Author: Wolfgang Naraschewski, TU Muenchen |
3 |
Author: Markus Wenzel, TU Muenchen |
|
4 |
Author: Norbert Schirmer, TU Muenchen |
|
5 |
Author: Thomas Sewell, NICTA |
|
6 |
||
7 |
Extensible records with structural subtyping. |
|
5698 | 8 |
*) |
4867
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
9 |
|
38012
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
10 |
signature RECORD = |
5698 | 11 |
sig |
43682 | 12 |
val type_abbr: bool Config.T |
13 |
val type_as_fields: bool Config.T |
|
14 |
val timing: bool Config.T |
|
38012
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
15 |
|
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
16 |
type info = |
35138 | 17 |
{args: (string * sort) list, |
18 |
parent: (typ list * string) option, |
|
19 |
fields: (string * typ) list, |
|
20 |
extension: (string * typ list), |
|
21 |
ext_induct: thm, ext_inject: thm, ext_surjective: thm, ext_split: thm, ext_def: thm, |
|
22 |
select_convs: thm list, update_convs: thm list, select_defs: thm list, update_defs: thm list, |
|
23 |
fold_congs: thm list, unfold_congs: thm list, splits: thm list, defs: thm list, |
|
24 |
surjective: thm, equality: thm, induct_scheme: thm, induct: thm, cases_scheme: thm, |
|
25 |
cases: thm, simps: thm list, iffs: thm list} |
|
38012
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
26 |
val get_info: theory -> string -> info option |
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
27 |
val the_info: theory -> string -> info |
41591 | 28 |
val get_hierarchy: theory -> (string * typ list) -> (string * ((string * sort) * typ) list) list |
44653
6d8d09b90398
discontinued slightly odd "Defining record ..." message and corresponding quiet_mode;
wenzelm
parents:
44121
diff
changeset
|
29 |
val add_record: (string * sort) list * binding -> (typ list * string) option -> |
38012
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
30 |
(binding * typ * mixfix) list -> theory -> theory |
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
31 |
|
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
32 |
val last_extT: typ -> (string * typ list) option |
32972 | 33 |
val dest_recTs: typ -> (string * typ list) list |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
34 |
val get_extT_fields: theory -> typ -> (string * typ) list * (string * typ) |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
35 |
val get_recT_fields: theory -> typ -> (string * typ) list * (string * typ) |
26088 | 36 |
val get_parent: theory -> string -> (typ list * string) option |
37 |
val get_extension: theory -> string -> (string * typ list) option |
|
16458 | 38 |
val get_extinjects: theory -> thm list |
39 |
val get_simpset: theory -> simpset |
|
38012
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
40 |
val simproc: simproc |
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
41 |
val eq_simproc: simproc |
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
42 |
val upd_simproc: simproc |
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
43 |
val split_simproc: (term -> int) -> simproc |
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
44 |
val ex_sel_eq_simproc: simproc |
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
45 |
val split_tac: int -> tactic |
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
46 |
val split_simp_tac: thm list -> (term -> int) -> int -> tactic |
42793 | 47 |
val split_wrapper: string * (Proof.context -> wrapper) |
38012
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
48 |
|
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
49 |
val updateN: string |
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
50 |
val ext_typeN: string |
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
51 |
val extN: string |
18708 | 52 |
val setup: theory -> theory |
4867
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
53 |
end; |
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
54 |
|
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
55 |
|
34151
8d57ce46b3f7
prefer prefix "iso" over potentially misleading "is"; tuned
haftmann
parents:
33957
diff
changeset
|
56 |
signature ISO_TUPLE_SUPPORT = |
32752
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
57 |
sig |
37470 | 58 |
val add_iso_tuple_type: binding * (string * sort) list -> |
36151
b89a2a05a3ce
modernized treatment of sort constraints in specification;
wenzelm
parents:
36137
diff
changeset
|
59 |
typ * typ -> theory -> (term * term) * theory |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
60 |
val mk_cons_tuple: term * term -> term |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
61 |
val dest_cons_tuple: term -> term * term |
34151
8d57ce46b3f7
prefer prefix "iso" over potentially misleading "is"; tuned
haftmann
parents:
33957
diff
changeset
|
62 |
val iso_tuple_intros_tac: int -> tactic |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
63 |
val named_cterm_instantiate: (string * cterm) list -> thm -> thm |
32752
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
64 |
end; |
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
65 |
|
34151
8d57ce46b3f7
prefer prefix "iso" over potentially misleading "is"; tuned
haftmann
parents:
33957
diff
changeset
|
66 |
structure Iso_Tuple_Support: ISO_TUPLE_SUPPORT = |
32752
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
67 |
struct |
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
68 |
|
34151
8d57ce46b3f7
prefer prefix "iso" over potentially misleading "is"; tuned
haftmann
parents:
33957
diff
changeset
|
69 |
val isoN = "_Tuple_Iso"; |
8d57ce46b3f7
prefer prefix "iso" over potentially misleading "is"; tuned
haftmann
parents:
33957
diff
changeset
|
70 |
|
8d57ce46b3f7
prefer prefix "iso" over potentially misleading "is"; tuned
haftmann
parents:
33957
diff
changeset
|
71 |
val iso_tuple_intro = @{thm isomorphic_tuple_intro}; |
8d57ce46b3f7
prefer prefix "iso" over potentially misleading "is"; tuned
haftmann
parents:
33957
diff
changeset
|
72 |
val iso_tuple_intros = Tactic.build_net @{thms isomorphic_tuple.intros}; |
8d57ce46b3f7
prefer prefix "iso" over potentially misleading "is"; tuned
haftmann
parents:
33957
diff
changeset
|
73 |
|
37470 | 74 |
val tuple_iso_tuple = (@{const_name Record.tuple_iso_tuple}, @{thm tuple_iso_tuple}); |
32752
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
75 |
|
38252 | 76 |
fun named_cterm_instantiate values thm = (* FIXME eliminate *) |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
77 |
let |
35135 | 78 |
fun match name ((name', _), _) = name = name'; |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
79 |
fun getvar name = |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
80 |
(case find_first (match name) (Term.add_vars (prop_of thm) []) of |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
81 |
SOME var => cterm_of (theory_of_thm thm) (Var var) |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
82 |
| NONE => raise THM ("named_cterm_instantiate: " ^ name, 0, [thm])); |
32752
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
83 |
in |
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
84 |
cterm_instantiate (map (apfst getvar) values) thm |
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
85 |
end; |
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
86 |
|
34151
8d57ce46b3f7
prefer prefix "iso" over potentially misleading "is"; tuned
haftmann
parents:
33957
diff
changeset
|
87 |
structure Iso_Tuple_Thms = Theory_Data |
32752
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
88 |
( |
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
89 |
type T = thm Symtab.table; |
34151
8d57ce46b3f7
prefer prefix "iso" over potentially misleading "is"; tuned
haftmann
parents:
33957
diff
changeset
|
90 |
val empty = Symtab.make [tuple_iso_tuple]; |
32752
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
91 |
val extend = I; |
33522 | 92 |
fun merge data = Symtab.merge Thm.eq_thm_prop data; (* FIXME handle Symtab.DUP ?? *) |
32752
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
93 |
); |
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
94 |
|
41575 | 95 |
fun get_typedef_info tyco vs |
96 |
(({rep_type, Abs_name, ...}, {Rep_inject, Abs_inverse, ... }) : Typedef.info) thy = |
|
38529
4cc2ca4d6237
formally integrated typecopy layer into record package
haftmann
parents:
38401
diff
changeset
|
97 |
let |
4cc2ca4d6237
formally integrated typecopy layer into record package
haftmann
parents:
38401
diff
changeset
|
98 |
val exists_thm = |
4cc2ca4d6237
formally integrated typecopy layer into record package
haftmann
parents:
38401
diff
changeset
|
99 |
UNIV_I |
4cc2ca4d6237
formally integrated typecopy layer into record package
haftmann
parents:
38401
diff
changeset
|
100 |
|> Drule.instantiate' [SOME (ctyp_of thy (Logic.varifyT_global rep_type))] []; |
4cc2ca4d6237
formally integrated typecopy layer into record package
haftmann
parents:
38401
diff
changeset
|
101 |
val proj_constr = Abs_inverse OF [exists_thm]; |
38534 | 102 |
val absT = Type (tyco, map TFree vs); |
38529
4cc2ca4d6237
formally integrated typecopy layer into record package
haftmann
parents:
38401
diff
changeset
|
103 |
in |
4cc2ca4d6237
formally integrated typecopy layer into record package
haftmann
parents:
38401
diff
changeset
|
104 |
thy |
38534 | 105 |
|> pair (tyco, ((Rep_inject, proj_constr), Const (Abs_name, rep_type --> absT), absT)) |
38529
4cc2ca4d6237
formally integrated typecopy layer into record package
haftmann
parents:
38401
diff
changeset
|
106 |
end |
4cc2ca4d6237
formally integrated typecopy layer into record package
haftmann
parents:
38401
diff
changeset
|
107 |
|
38534 | 108 |
fun do_typedef raw_tyco repT raw_vs thy = |
38529
4cc2ca4d6237
formally integrated typecopy layer into record package
haftmann
parents:
38401
diff
changeset
|
109 |
let |
42361 | 110 |
val ctxt = Proof_Context.init_global thy |> Variable.declare_typ repT; |
111 |
val vs = map (Proof_Context.check_tfree ctxt) raw_vs; |
|
38529
4cc2ca4d6237
formally integrated typecopy layer into record package
haftmann
parents:
38401
diff
changeset
|
112 |
in |
4cc2ca4d6237
formally integrated typecopy layer into record package
haftmann
parents:
38401
diff
changeset
|
113 |
thy |
4cc2ca4d6237
formally integrated typecopy layer into record package
haftmann
parents:
38401
diff
changeset
|
114 |
|> Typedef.add_typedef_global false (SOME raw_tyco) (raw_tyco, vs, NoSyn) |
46043 | 115 |
(HOLogic.mk_UNIV repT) NONE (rtac UNIV_witness 1) |
38534 | 116 |
|-> (fn (tyco, info) => get_typedef_info tyco vs info) |
32752
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
117 |
end; |
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
118 |
|
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
119 |
fun mk_cons_tuple (left, right) = |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
120 |
let |
32752
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
121 |
val (leftT, rightT) = (fastype_of left, fastype_of right); |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
122 |
val prodT = HOLogic.mk_prodT (leftT, rightT); |
32972 | 123 |
val isomT = Type (@{type_name tuple_isomorphism}, [prodT, leftT, rightT]); |
32752
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
124 |
in |
37470 | 125 |
Const (@{const_name Record.iso_tuple_cons}, isomT --> leftT --> rightT --> prodT) $ |
34151
8d57ce46b3f7
prefer prefix "iso" over potentially misleading "is"; tuned
haftmann
parents:
33957
diff
changeset
|
126 |
Const (fst tuple_iso_tuple, isomT) $ left $ right |
32752
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
127 |
end; |
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
128 |
|
37470 | 129 |
fun dest_cons_tuple (Const (@{const_name Record.iso_tuple_cons}, _) $ Const _ $ t $ u) = (t, u) |
32972 | 130 |
| dest_cons_tuple t = raise TERM ("dest_cons_tuple", [t]); |
32752
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
131 |
|
37470 | 132 |
fun add_iso_tuple_type (b, alphas) (leftT, rightT) thy = |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
133 |
let |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
134 |
val repT = HOLogic.mk_prodT (leftT, rightT); |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
135 |
|
38534 | 136 |
val ((_, ((rep_inject, abs_inverse), absC, absT)), typ_thy) = |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
137 |
thy |
37470 | 138 |
|> do_typedef b repT alphas |
139 |
||> Sign.add_path (Binding.name_of b); (*FIXME proper prefixing instead*) |
|
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
140 |
|
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
141 |
(*construct a type and body for the isomorphism constant by |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
142 |
instantiating the theorem to which the definition will be applied*) |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
143 |
val intro_inst = |
34151
8d57ce46b3f7
prefer prefix "iso" over potentially misleading "is"; tuned
haftmann
parents:
33957
diff
changeset
|
144 |
rep_inject RS named_cterm_instantiate [("abst", cterm_of typ_thy absC)] iso_tuple_intro; |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
145 |
val (_, body) = Logic.dest_equals (List.last (prems_of intro_inst)); |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
146 |
val isomT = fastype_of body; |
37470 | 147 |
val isom_binding = Binding.suffix_name isoN b; |
35239 | 148 |
val isom_name = Sign.full_name typ_thy isom_binding; |
32972 | 149 |
val isom = Const (isom_name, isomT); |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
150 |
|
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
151 |
val ([isom_def], cdef_thy) = |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
152 |
typ_thy |
42375
774df7c59508
report Name_Space.declare/define, relatively to context;
wenzelm
parents:
42361
diff
changeset
|
153 |
|> Sign.declare_const_global ((isom_binding, isomT), NoSyn) |> snd |
39557
fe5722fce758
renamed structure PureThy to Pure_Thy and moved most content to Global_Theory, to emphasize that this is global-only;
wenzelm
parents:
39134
diff
changeset
|
154 |
|> Global_Theory.add_defs false |
35239 | 155 |
[((Binding.conceal (Thm.def_binding isom_binding), Logic.mk_equals (isom, body)), [])]; |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
156 |
|
34151
8d57ce46b3f7
prefer prefix "iso" over potentially misleading "is"; tuned
haftmann
parents:
33957
diff
changeset
|
157 |
val iso_tuple = isom_def RS (abs_inverse RS (rep_inject RS iso_tuple_intro)); |
37470 | 158 |
val cons = Const (@{const_name Record.iso_tuple_cons}, isomT --> leftT --> rightT --> absT); |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
159 |
|
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
160 |
val thm_thy = |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
161 |
cdef_thy |
34151
8d57ce46b3f7
prefer prefix "iso" over potentially misleading "is"; tuned
haftmann
parents:
33957
diff
changeset
|
162 |
|> Iso_Tuple_Thms.map (Symtab.insert Thm.eq_thm_prop (isom_name, iso_tuple)) |
35239 | 163 |
|> Sign.restore_naming thy |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
164 |
in |
32972 | 165 |
((isom, cons $ isom), thm_thy) |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
166 |
end; |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
167 |
|
35133 | 168 |
val iso_tuple_intros_tac = |
169 |
resolve_from_net_tac iso_tuple_intros THEN' |
|
32975 | 170 |
CSUBGOAL (fn (cgoal, i) => |
171 |
let |
|
172 |
val thy = Thm.theory_of_cterm cgoal; |
|
173 |
val goal = Thm.term_of cgoal; |
|
174 |
||
34151
8d57ce46b3f7
prefer prefix "iso" over potentially misleading "is"; tuned
haftmann
parents:
33957
diff
changeset
|
175 |
val isthms = Iso_Tuple_Thms.get thy; |
8d57ce46b3f7
prefer prefix "iso" over potentially misleading "is"; tuned
haftmann
parents:
33957
diff
changeset
|
176 |
fun err s t = raise TERM ("iso_tuple_intros_tac: " ^ s, [t]); |
32975 | 177 |
|
178 |
val goal' = Envir.beta_eta_contract goal; |
|
179 |
val is = |
|
180 |
(case goal' of |
|
181 |
Const (@{const_name Trueprop}, _) $ |
|
182 |
(Const (@{const_name isomorphic_tuple}, _) $ Const is) => is |
|
183 |
| _ => err "unexpected goal format" goal'); |
|
184 |
val isthm = |
|
185 |
(case Symtab.lookup isthms (#1 is) of |
|
186 |
SOME isthm => isthm |
|
187 |
| NONE => err "no thm found for constant" (Const is)); |
|
188 |
in rtac isthm i end); |
|
32752
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
189 |
|
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
190 |
end; |
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
191 |
|
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
192 |
|
31723
f5cafe803b55
discontinued ancient tradition to suffix certain ML module names with "_package"
haftmann
parents:
31136
diff
changeset
|
193 |
structure Record: RECORD = |
4867
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
194 |
struct |
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
195 |
|
35133 | 196 |
val surject_assistI = @{thm iso_tuple_surjective_proof_assistI}; |
197 |
val surject_assist_idE = @{thm iso_tuple_surjective_proof_assist_idE}; |
|
198 |
||
199 |
val updacc_accessor_eqE = @{thm update_accessor_accessor_eqE}; |
|
200 |
val updacc_updator_eqE = @{thm update_accessor_updator_eqE}; |
|
201 |
val updacc_eq_idI = @{thm iso_tuple_update_accessor_eq_assist_idI}; |
|
202 |
val updacc_eq_triv = @{thm iso_tuple_update_accessor_eq_assist_triv}; |
|
203 |
||
204 |
val updacc_foldE = @{thm update_accessor_congruence_foldE}; |
|
205 |
val updacc_unfoldE = @{thm update_accessor_congruence_unfoldE}; |
|
206 |
val updacc_noopE = @{thm update_accessor_noopE}; |
|
207 |
val updacc_noop_compE = @{thm update_accessor_noop_compE}; |
|
208 |
val updacc_cong_idI = @{thm update_accessor_cong_assist_idI}; |
|
209 |
val updacc_cong_triv = @{thm update_accessor_cong_assist_triv}; |
|
210 |
val updacc_cong_from_eq = @{thm iso_tuple_update_accessor_cong_from_eq}; |
|
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
211 |
|
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
212 |
|
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
213 |
|
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
214 |
(** name components **) |
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
215 |
|
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
216 |
val rN = "r"; |
15215 | 217 |
val wN = "w"; |
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
218 |
val moreN = "more"; |
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
219 |
val schemeN = "_scheme"; |
38531
a11a1e4e0403
authentic syntax allows simplification of type names
haftmann
parents:
38530
diff
changeset
|
220 |
val ext_typeN = "_ext"; |
a11a1e4e0403
authentic syntax allows simplification of type names
haftmann
parents:
38530
diff
changeset
|
221 |
val inner_typeN = "_inner"; |
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
222 |
val extN ="_ext"; |
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
223 |
val updateN = "_update"; |
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
224 |
val makeN = "make"; |
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
225 |
val fields_selN = "fields"; |
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
226 |
val extendN = "extend"; |
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
227 |
val truncateN = "truncate"; |
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
228 |
|
32335 | 229 |
|
230 |
||
4894 | 231 |
(*** utilities ***) |
4867
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
232 |
|
45424
01d75cf04497
localized Record.decode_type: use standard Proof_Context.get_sort;
wenzelm
parents:
44653
diff
changeset
|
233 |
fun varifyT idx = map_type_tfree (fn (a, S) => TVar ((a, idx), S)); |
19748 | 234 |
|
32335 | 235 |
|
15012
28fa57b57209
Added reference record_definition_quick_and_dirty_sensitive, to
schirmer
parents:
14981
diff
changeset
|
236 |
(* timing *) |
28fa57b57209
Added reference record_definition_quick_and_dirty_sensitive, to
schirmer
parents:
14981
diff
changeset
|
237 |
|
43682 | 238 |
val timing = Attrib.setup_config_bool @{binding record_timing} (K false); |
239 |
fun timeit_msg ctxt s x = if Config.get ctxt timing then (warning s; timeit x) else x (); |
|
240 |
fun timing_msg ctxt s = if Config.get ctxt timing then warning s else (); |
|
17261 | 241 |
|
32335 | 242 |
|
12255 | 243 |
(* syntax *) |
4867
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
244 |
|
11927
96f267adc029
provodes induct/cases for use with corresponding Isar methods;
wenzelm
parents:
11923
diff
changeset
|
245 |
val Trueprop = HOLogic.mk_Trueprop; |
4894 | 246 |
|
11934
6c1bf72430b6
derived operations are now: make, extend, truncate (cf. derived_defs);
wenzelm
parents:
11927
diff
changeset
|
247 |
infix 0 :== ===; |
6c1bf72430b6
derived operations are now: make, extend, truncate (cf. derived_defs);
wenzelm
parents:
11927
diff
changeset
|
248 |
infixr 0 ==>; |
6c1bf72430b6
derived operations are now: make, extend, truncate (cf. derived_defs);
wenzelm
parents:
11927
diff
changeset
|
249 |
|
37781
2fbbf0a48cef
moved misc legacy stuff from OldGoals to Misc_Legacy;
wenzelm
parents:
37470
diff
changeset
|
250 |
val op :== = Misc_Legacy.mk_defpair; |
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
251 |
val op === = Trueprop o HOLogic.mk_eq; |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
252 |
val op ==> = Logic.mk_implies; |
4867
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
253 |
|
32335 | 254 |
|
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
255 |
(* constructor *) |
4867
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
256 |
|
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
257 |
fun mk_ext (name, T) ts = |
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
258 |
let val Ts = map fastype_of ts |
35239 | 259 |
in list_comb (Const (suffix extN name, Ts ---> T), ts) end; |
4867
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
260 |
|
32335 | 261 |
|
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
262 |
(* selector *) |
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
263 |
|
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
264 |
fun mk_selC sT (c, T) = (c, sT --> T); |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
265 |
|
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
266 |
fun mk_sel s (c, T) = |
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
267 |
let val sT = fastype_of s |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
268 |
in Const (mk_selC sT (c, T)) $ s end; |
4867
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
269 |
|
32335 | 270 |
|
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
271 |
(* updates *) |
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
272 |
|
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
273 |
fun mk_updC sfx sT (c, T) = (suffix sfx c, (T --> T) --> sT --> sT); |
4867
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
274 |
|
21226
a607ae87ee81
field-update in records is generalised to take a function on the field
schirmer
parents:
21109
diff
changeset
|
275 |
fun mk_upd' sfx c v sT = |
a607ae87ee81
field-update in records is generalised to take a function on the field
schirmer
parents:
21109
diff
changeset
|
276 |
let val vT = domain_type (fastype_of v); |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
277 |
in Const (mk_updC sfx sT (c, vT)) $ v end; |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
278 |
|
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
279 |
fun mk_upd sfx c v s = mk_upd' sfx c v (fastype_of s) $ s; |
4867
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
280 |
|
32335 | 281 |
|
4867
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
282 |
(* types *) |
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
283 |
|
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
284 |
fun dest_recT (typ as Type (c_ext_type, Ts as (_ :: _))) = |
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
285 |
(case try (unsuffix ext_typeN) c_ext_type of |
31723
f5cafe803b55
discontinued ancient tradition to suffix certain ML module names with "_package"
haftmann
parents:
31136
diff
changeset
|
286 |
NONE => raise TYPE ("Record.dest_recT", [typ], []) |
15570 | 287 |
| SOME c => ((c, Ts), List.last Ts)) |
31723
f5cafe803b55
discontinued ancient tradition to suffix certain ML module names with "_package"
haftmann
parents:
31136
diff
changeset
|
288 |
| dest_recT typ = raise TYPE ("Record.dest_recT", [typ], []); |
5197 | 289 |
|
32975 | 290 |
val is_recT = can dest_recT; |
11833 | 291 |
|
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
292 |
fun dest_recTs T = |
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
293 |
let val ((c, Ts), U) = dest_recT T |
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
294 |
in (c, Ts) :: dest_recTs U |
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
295 |
end handle TYPE _ => []; |
14255 | 296 |
|
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
297 |
fun last_extT T = |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
298 |
let val ((c, Ts), U) = dest_recT T in |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
299 |
(case last_extT U of |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
300 |
NONE => SOME (c, Ts) |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
301 |
| SOME l => SOME l) |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
302 |
end handle TYPE _ => NONE; |
14255 | 303 |
|
17261 | 304 |
fun rec_id i T = |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
305 |
let |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
306 |
val rTs = dest_recTs T; |
33957 | 307 |
val rTs' = if i < 0 then rTs else take i rTs; |
32764
690f9cccf232
replaced meta_iffD2 by existing Drule.equal_elim_rule2;
wenzelm
parents:
32763
diff
changeset
|
308 |
in implode (map #1 rTs') end; |
4867
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
309 |
|
32335 | 310 |
|
311 |
||
4867
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
312 |
(*** extend theory by record definition ***) |
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
313 |
|
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
314 |
(** record info **) |
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
315 |
|
38012
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
316 |
(* type info and parent_info *) |
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
317 |
|
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
318 |
type info = |
4867
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
319 |
{args: (string * sort) list, |
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
320 |
parent: (typ list * string) option, |
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
321 |
fields: (string * typ) list, |
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
322 |
extension: (string * typ list), |
35138 | 323 |
|
324 |
ext_induct: thm, |
|
325 |
ext_inject: thm, |
|
326 |
ext_surjective: thm, |
|
327 |
ext_split: thm, |
|
328 |
ext_def: thm, |
|
329 |
||
330 |
select_convs: thm list, |
|
331 |
update_convs: thm list, |
|
332 |
select_defs: thm list, |
|
333 |
update_defs: thm list, |
|
46223 | 334 |
fold_congs: thm list, (* FIXME unused!? *) |
335 |
unfold_congs: thm list, (* FIXME unused!? *) |
|
35138 | 336 |
splits: thm list, |
337 |
defs: thm list, |
|
338 |
||
339 |
surjective: thm, |
|
340 |
equality: thm, |
|
341 |
induct_scheme: thm, |
|
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
342 |
induct: thm, |
35138 | 343 |
cases_scheme: thm, |
344 |
cases: thm, |
|
345 |
||
346 |
simps: thm list, |
|
347 |
iffs: thm list}; |
|
348 |
||
38012
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
349 |
fun make_info args parent fields extension |
35138 | 350 |
ext_induct ext_inject ext_surjective ext_split ext_def |
351 |
select_convs update_convs select_defs update_defs fold_congs unfold_congs splits defs |
|
352 |
surjective equality induct_scheme induct cases_scheme cases |
|
38012
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
353 |
simps iffs : info = |
17261 | 354 |
{args = args, parent = parent, fields = fields, extension = extension, |
35138 | 355 |
ext_induct = ext_induct, ext_inject = ext_inject, ext_surjective = ext_surjective, |
356 |
ext_split = ext_split, ext_def = ext_def, select_convs = select_convs, |
|
357 |
update_convs = update_convs, select_defs = select_defs, update_defs = update_defs, |
|
358 |
fold_congs = fold_congs, unfold_congs = unfold_congs, splits = splits, defs = defs, |
|
359 |
surjective = surjective, equality = equality, induct_scheme = induct_scheme, |
|
360 |
induct = induct, cases_scheme = cases_scheme, cases = cases, simps = simps, iffs = iffs}; |
|
4867
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
361 |
|
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
362 |
type parent_info = |
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
363 |
{name: string, |
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
364 |
fields: (string * typ) list, |
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
365 |
extension: (string * typ list), |
35138 | 366 |
induct_scheme: thm, |
367 |
ext_def: thm}; |
|
368 |
||
369 |
fun make_parent_info name fields extension ext_def induct_scheme : parent_info = |
|
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
370 |
{name = name, fields = fields, extension = extension, |
35138 | 371 |
ext_def = ext_def, induct_scheme = induct_scheme}; |
4867
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
372 |
|
22846 | 373 |
|
374 |
(* theory data *) |
|
5001 | 375 |
|
38012
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
376 |
type data = |
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
377 |
{records: info Symtab.table, |
7178 | 378 |
sel_upd: |
32744
50406c4951d9
Record patch imported and working.
Thomas Sewell <tsewell@nicta.com.au>
parents:
32743
diff
changeset
|
379 |
{selectors: (int * bool) Symtab.table, |
7178 | 380 |
updates: string Symtab.table, |
46047
6170af176fbb
tuned -- afford slightly larger simpset in simp_defs_tac;
wenzelm
parents:
46046
diff
changeset
|
381 |
simpset: simpset, |
46221
6dcb2cea827d
eliminated dead code, together with spurious warning about congruence rule for "Fun.comp";
wenzelm
parents:
46219
diff
changeset
|
382 |
defset: simpset}, |
14255 | 383 |
equalities: thm Symtab.table, |
15015
c5768e8c4da4
* record_upd_simproc also simplifies trivial updates:
schirmer
parents:
15012
diff
changeset
|
384 |
extinjects: thm list, |
32764
690f9cccf232
replaced meta_iffD2 by existing Drule.equal_elim_rule2;
wenzelm
parents:
32763
diff
changeset
|
385 |
extsplit: thm Symtab.table, (*maps extension name to split rule*) |
35135 | 386 |
splits: (thm * thm * thm * thm) Symtab.table, (*!!, ALL, EX - split-equalities, induct rule*) |
32764
690f9cccf232
replaced meta_iffD2 by existing Drule.equal_elim_rule2;
wenzelm
parents:
32763
diff
changeset
|
387 |
extfields: (string * typ) list Symtab.table, (*maps extension to its fields*) |
690f9cccf232
replaced meta_iffD2 by existing Drule.equal_elim_rule2;
wenzelm
parents:
32763
diff
changeset
|
388 |
fieldext: (string * typ list) Symtab.table}; (*maps field to its extension*) |
7178 | 389 |
|
38012
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
390 |
fun make_data |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
391 |
records sel_upd equalities extinjects extsplit splits extfields fieldext = |
17261 | 392 |
{records = records, sel_upd = sel_upd, |
393 |
equalities = equalities, extinjects=extinjects, extsplit = extsplit, splits = splits, |
|
38012
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
394 |
extfields = extfields, fieldext = fieldext }: data; |
7178 | 395 |
|
38758
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
396 |
structure Data = Theory_Data |
22846 | 397 |
( |
38012
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
398 |
type T = data; |
7178 | 399 |
val empty = |
38012
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
400 |
make_data Symtab.empty |
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
401 |
{selectors = Symtab.empty, updates = Symtab.empty, |
46221
6dcb2cea827d
eliminated dead code, together with spurious warning about congruence rule for "Fun.comp";
wenzelm
parents:
46219
diff
changeset
|
402 |
simpset = HOL_basic_ss, defset = HOL_basic_ss} |
15015
c5768e8c4da4
* record_upd_simproc also simplifies trivial updates:
schirmer
parents:
15012
diff
changeset
|
403 |
Symtab.empty [] Symtab.empty Symtab.empty Symtab.empty Symtab.empty; |
16458 | 404 |
val extend = I; |
33522 | 405 |
fun merge |
7178 | 406 |
({records = recs1, |
46221
6dcb2cea827d
eliminated dead code, together with spurious warning about congruence rule for "Fun.comp";
wenzelm
parents:
46219
diff
changeset
|
407 |
sel_upd = {selectors = sels1, updates = upds1, simpset = ss1, defset = ds1}, |
14255 | 408 |
equalities = equalities1, |
17261 | 409 |
extinjects = extinjects1, |
15015
c5768e8c4da4
* record_upd_simproc also simplifies trivial updates:
schirmer
parents:
15012
diff
changeset
|
410 |
extsplit = extsplit1, |
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
411 |
splits = splits1, |
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
412 |
extfields = extfields1, |
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
413 |
fieldext = fieldext1}, |
7178 | 414 |
{records = recs2, |
46221
6dcb2cea827d
eliminated dead code, together with spurious warning about congruence rule for "Fun.comp";
wenzelm
parents:
46219
diff
changeset
|
415 |
sel_upd = {selectors = sels2, updates = upds2, simpset = ss2, defset = ds2}, |
15015
c5768e8c4da4
* record_upd_simproc also simplifies trivial updates:
schirmer
parents:
15012
diff
changeset
|
416 |
equalities = equalities2, |
17261 | 417 |
extinjects = extinjects2, |
418 |
extsplit = extsplit2, |
|
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
419 |
splits = splits2, |
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
420 |
extfields = extfields2, |
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
421 |
fieldext = fieldext2}) = |
38012
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
422 |
make_data |
7178 | 423 |
(Symtab.merge (K true) (recs1, recs2)) |
424 |
{selectors = Symtab.merge (K true) (sels1, sels2), |
|
425 |
updates = Symtab.merge (K true) (upds1, upds2), |
|
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
426 |
simpset = Simplifier.merge_ss (ss1, ss2), |
46221
6dcb2cea827d
eliminated dead code, together with spurious warning about congruence rule for "Fun.comp";
wenzelm
parents:
46219
diff
changeset
|
427 |
defset = Simplifier.merge_ss (ds1, ds2)} |
22634 | 428 |
(Symtab.merge Thm.eq_thm_prop (equalities1, equalities2)) |
33522 | 429 |
(Thm.merge_thms (extinjects1, extinjects2)) |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
430 |
(Symtab.merge Thm.eq_thm_prop (extsplit1, extsplit2)) |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
431 |
(Symtab.merge (fn ((a, b, c, d), (w, x, y, z)) => |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
432 |
Thm.eq_thm (a, w) andalso Thm.eq_thm (b, x) andalso |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
433 |
Thm.eq_thm (c, y) andalso Thm.eq_thm (d, z)) (splits1, splits2)) |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
434 |
(Symtab.merge (K true) (extfields1, extfields2)) |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
435 |
(Symtab.merge (K true) (fieldext1, fieldext2)); |
22846 | 436 |
); |
4867
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
437 |
|
16458 | 438 |
|
7178 | 439 |
(* access 'records' *) |
4867
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
440 |
|
38758
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
441 |
val get_info = Symtab.lookup o #records o Data.get; |
38012
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
442 |
|
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
443 |
fun the_info thy name = |
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
444 |
(case get_info thy name of |
35138 | 445 |
SOME info => info |
446 |
| NONE => error ("Unknown record type " ^ quote name)); |
|
447 |
||
38758
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
448 |
fun put_record name info = |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
449 |
Data.map (fn {records, sel_upd, equalities, extinjects, extsplit, splits, extfields, fieldext} => |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
450 |
make_data (Symtab.update (name, info) records) |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
451 |
sel_upd equalities extinjects extsplit splits extfields fieldext); |
7178 | 452 |
|
22846 | 453 |
|
7178 | 454 |
(* access 'sel_upd' *) |
455 |
||
38758
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
456 |
val get_sel_upd = #sel_upd o Data.get; |
7178 | 457 |
|
17510 | 458 |
val is_selector = Symtab.defined o #selectors o get_sel_upd; |
17412 | 459 |
val get_updates = Symtab.lookup o #updates o get_sel_upd; |
35232
f588e1169c8b
renamed Simplifier.theory_context to Simplifier.global_context to emphasize that this is not the real thing;
wenzelm
parents:
35149
diff
changeset
|
460 |
fun get_ss_with_context getss thy = Simplifier.global_context thy (getss (get_sel_upd thy)); |
32764
690f9cccf232
replaced meta_iffD2 by existing Drule.equal_elim_rule2;
wenzelm
parents:
32763
diff
changeset
|
461 |
|
690f9cccf232
replaced meta_iffD2 by existing Drule.equal_elim_rule2;
wenzelm
parents:
32763
diff
changeset
|
462 |
val get_simpset = get_ss_with_context #simpset; |
690f9cccf232
replaced meta_iffD2 by existing Drule.equal_elim_rule2;
wenzelm
parents:
32763
diff
changeset
|
463 |
val get_sel_upd_defs = get_ss_with_context #defset; |
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
464 |
|
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
465 |
fun get_update_details u thy = |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
466 |
let val sel_upd = get_sel_upd thy in |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
467 |
(case Symtab.lookup (#updates sel_upd) u of |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
468 |
SOME s => |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
469 |
let val SOME (dep, ismore) = Symtab.lookup (#selectors sel_upd) s |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
470 |
in SOME (s, dep, ismore) end |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
471 |
| NONE => NONE) |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
472 |
end; |
7178 | 473 |
|
46221
6dcb2cea827d
eliminated dead code, together with spurious warning about congruence rule for "Fun.comp";
wenzelm
parents:
46219
diff
changeset
|
474 |
fun put_sel_upd names more depth simps defs thy = |
32744
50406c4951d9
Record patch imported and working.
Thomas Sewell <tsewell@nicta.com.au>
parents:
32743
diff
changeset
|
475 |
let |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
476 |
val all = names @ [more]; |
32744
50406c4951d9
Record patch imported and working.
Thomas Sewell <tsewell@nicta.com.au>
parents:
32743
diff
changeset
|
477 |
val sels = map (rpair (depth, false)) names @ [(more, (depth, true))]; |
50406c4951d9
Record patch imported and working.
Thomas Sewell <tsewell@nicta.com.au>
parents:
32743
diff
changeset
|
478 |
val upds = map (suffix updateN) all ~~ all; |
50406c4951d9
Record patch imported and working.
Thomas Sewell <tsewell@nicta.com.au>
parents:
32743
diff
changeset
|
479 |
|
46221
6dcb2cea827d
eliminated dead code, together with spurious warning about congruence rule for "Fun.comp";
wenzelm
parents:
46219
diff
changeset
|
480 |
val {records, sel_upd = {selectors, updates, simpset, defset}, |
38758
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
481 |
equalities, extinjects, extsplit, splits, extfields, fieldext} = Data.get thy; |
46221
6dcb2cea827d
eliminated dead code, together with spurious warning about congruence rule for "Fun.comp";
wenzelm
parents:
46219
diff
changeset
|
482 |
val data = |
6dcb2cea827d
eliminated dead code, together with spurious warning about congruence rule for "Fun.comp";
wenzelm
parents:
46219
diff
changeset
|
483 |
make_data records |
6dcb2cea827d
eliminated dead code, together with spurious warning about congruence rule for "Fun.comp";
wenzelm
parents:
46219
diff
changeset
|
484 |
{selectors = fold Symtab.update_new sels selectors, |
6dcb2cea827d
eliminated dead code, together with spurious warning about congruence rule for "Fun.comp";
wenzelm
parents:
46219
diff
changeset
|
485 |
updates = fold Symtab.update_new upds updates, |
6dcb2cea827d
eliminated dead code, together with spurious warning about congruence rule for "Fun.comp";
wenzelm
parents:
46219
diff
changeset
|
486 |
simpset = simpset addsimps simps, |
6dcb2cea827d
eliminated dead code, together with spurious warning about congruence rule for "Fun.comp";
wenzelm
parents:
46219
diff
changeset
|
487 |
defset = defset addsimps defs} |
6dcb2cea827d
eliminated dead code, together with spurious warning about congruence rule for "Fun.comp";
wenzelm
parents:
46219
diff
changeset
|
488 |
equalities extinjects extsplit splits extfields fieldext; |
38758
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
489 |
in Data.put data thy end; |
22846 | 490 |
|
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
491 |
|
14079
1c22e5499eeb
- record_split_tac now also works for object-level universal quantifier
berghofe
parents:
13904
diff
changeset
|
492 |
(* access 'equalities' *) |
1c22e5499eeb
- record_split_tac now also works for object-level universal quantifier
berghofe
parents:
13904
diff
changeset
|
493 |
|
38758
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
494 |
fun add_equalities name thm = |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
495 |
Data.map (fn {records, sel_upd, equalities, extinjects, extsplit, splits, extfields, fieldext} => |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
496 |
make_data records sel_upd |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
497 |
(Symtab.update_new (name, thm) equalities) extinjects extsplit splits extfields fieldext); |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
498 |
|
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
499 |
val get_equalities = Symtab.lookup o #equalities o Data.get; |
14079
1c22e5499eeb
- record_split_tac now also works for object-level universal quantifier
berghofe
parents:
13904
diff
changeset
|
500 |
|
22846 | 501 |
|
15015
c5768e8c4da4
* record_upd_simproc also simplifies trivial updates:
schirmer
parents:
15012
diff
changeset
|
502 |
(* access 'extinjects' *) |
c5768e8c4da4
* record_upd_simproc also simplifies trivial updates:
schirmer
parents:
15012
diff
changeset
|
503 |
|
38758
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
504 |
fun add_extinjects thm = |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
505 |
Data.map (fn {records, sel_upd, equalities, extinjects, extsplit, splits, extfields, fieldext} => |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
506 |
make_data records sel_upd equalities (insert Thm.eq_thm_prop thm extinjects) |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
507 |
extsplit splits extfields fieldext); |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
508 |
|
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
509 |
val get_extinjects = rev o #extinjects o Data.get; |
15015
c5768e8c4da4
* record_upd_simproc also simplifies trivial updates:
schirmer
parents:
15012
diff
changeset
|
510 |
|
22846 | 511 |
|
15015
c5768e8c4da4
* record_upd_simproc also simplifies trivial updates:
schirmer
parents:
15012
diff
changeset
|
512 |
(* access 'extsplit' *) |
c5768e8c4da4
* record_upd_simproc also simplifies trivial updates:
schirmer
parents:
15012
diff
changeset
|
513 |
|
38758
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
514 |
fun add_extsplit name thm = |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
515 |
Data.map (fn {records, sel_upd, equalities, extinjects, extsplit, splits, extfields, fieldext} => |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
516 |
make_data records sel_upd equalities extinjects |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
517 |
(Symtab.update_new (name, thm) extsplit) splits extfields fieldext); |
15015
c5768e8c4da4
* record_upd_simproc also simplifies trivial updates:
schirmer
parents:
15012
diff
changeset
|
518 |
|
26088 | 519 |
|
14255 | 520 |
(* access 'splits' *) |
521 |
||
38758
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
522 |
fun add_splits name thmP = |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
523 |
Data.map (fn {records, sel_upd, equalities, extinjects, extsplit, splits, extfields, fieldext} => |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
524 |
make_data records sel_upd equalities extinjects extsplit |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
525 |
(Symtab.update_new (name, thmP) splits) extfields fieldext); |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
526 |
|
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
527 |
val get_splits = Symtab.lookup o #splits o Data.get; |
14255 | 528 |
|
15015
c5768e8c4da4
* record_upd_simproc also simplifies trivial updates:
schirmer
parents:
15012
diff
changeset
|
529 |
|
26088 | 530 |
(* parent/extension of named record *) |
15015
c5768e8c4da4
* record_upd_simproc also simplifies trivial updates:
schirmer
parents:
15012
diff
changeset
|
531 |
|
38758
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
532 |
val get_parent = (Option.join o Option.map #parent) oo (Symtab.lookup o #records o Data.get); |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
533 |
val get_extension = Option.map #extension oo (Symtab.lookup o #records o Data.get); |
17261 | 534 |
|
14079
1c22e5499eeb
- record_split_tac now also works for object-level universal quantifier
berghofe
parents:
13904
diff
changeset
|
535 |
|
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
536 |
(* access 'extfields' *) |
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
537 |
|
38758
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
538 |
fun add_extfields name fields = |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
539 |
Data.map (fn {records, sel_upd, equalities, extinjects, extsplit, splits, extfields, fieldext} => |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
540 |
make_data records sel_upd equalities extinjects extsplit splits |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
541 |
(Symtab.update_new (name, fields) extfields) fieldext); |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
542 |
|
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
543 |
val get_extfields = Symtab.lookup o #extfields o Data.get; |
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
544 |
|
18858 | 545 |
fun get_extT_fields thy T = |
15059 | 546 |
let |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
547 |
val ((name, Ts), moreT) = dest_recT T; |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
548 |
val recname = |
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
549 |
let val (nm :: _ :: rst) = rev (Long_Name.explode name) (* FIXME !? *) |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
550 |
in Long_Name.implode (rev (nm :: rst)) end; |
45424
01d75cf04497
localized Record.decode_type: use standard Proof_Context.get_sort;
wenzelm
parents:
44653
diff
changeset
|
551 |
val varifyT = varifyT (maxidx_of_typs (moreT :: Ts) + 1); |
38758
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
552 |
val {records, extfields, ...} = Data.get thy; |
35149 | 553 |
val (fields, (more, _)) = split_last (Symtab.lookup_list extfields name); |
17412 | 554 |
val args = map varifyT (snd (#extension (the (Symtab.lookup records recname)))); |
15058 | 555 |
|
41489
8e2b8649507d
standardized split_last/last_elem towards List.last;
wenzelm
parents:
40845
diff
changeset
|
556 |
val subst = fold (Sign.typ_match thy) (#1 (split_last args) ~~ #1 (split_last Ts)) Vartab.empty; |
35149 | 557 |
val fields' = map (apsnd (Envir.norm_type subst o varifyT)) fields; |
558 |
in (fields', (more, moreT)) end; |
|
15058 | 559 |
|
18858 | 560 |
fun get_recT_fields thy T = |
17261 | 561 |
let |
35149 | 562 |
val (root_fields, (root_more, root_moreT)) = get_extT_fields thy T; |
563 |
val (rest_fields, rest_more) = |
|
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
564 |
if is_recT root_moreT then get_recT_fields thy root_moreT |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
565 |
else ([], (root_more, root_moreT)); |
35149 | 566 |
in (root_fields @ rest_fields, rest_more) end; |
15059 | 567 |
|
15058 | 568 |
|
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
569 |
(* access 'fieldext' *) |
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
570 |
|
38758
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
571 |
fun add_fieldext extname_types fields = |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
572 |
Data.map (fn {records, sel_upd, equalities, extinjects, extsplit, splits, extfields, fieldext} => |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
573 |
let |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
574 |
val fieldext' = |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
575 |
fold (fn field => Symtab.update_new (field, extname_types)) fields fieldext; |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
576 |
in make_data records sel_upd equalities extinjects extsplit splits extfields fieldext' end); |
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
577 |
|
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
578 |
val get_fieldext = Symtab.lookup o #fieldext o Data.get; |
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
579 |
|
21962 | 580 |
|
4867
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
581 |
(* parent records *) |
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
582 |
|
41577
9a64c4007864
export Record.get_hierarchy -- external tools typically need this information;
wenzelm
parents:
41576
diff
changeset
|
583 |
local |
9a64c4007864
export Record.get_hierarchy -- external tools typically need this information;
wenzelm
parents:
41576
diff
changeset
|
584 |
|
9a64c4007864
export Record.get_hierarchy -- external tools typically need this information;
wenzelm
parents:
41576
diff
changeset
|
585 |
fun add_parents _ NONE = I |
9a64c4007864
export Record.get_hierarchy -- external tools typically need this information;
wenzelm
parents:
41576
diff
changeset
|
586 |
| add_parents thy (SOME (types, name)) = |
12247 | 587 |
let |
588 |
fun err msg = error (msg ^ " parent record " ^ quote name); |
|
12255 | 589 |
|
41577
9a64c4007864
export Record.get_hierarchy -- external tools typically need this information;
wenzelm
parents:
41576
diff
changeset
|
590 |
val {args, parent, ...} = |
38012
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
591 |
(case get_info thy name of SOME info => info | NONE => err "Unknown"); |
12247 | 592 |
val _ = if length types <> length args then err "Bad number of arguments for" else (); |
12255 | 593 |
|
12247 | 594 |
fun bad_inst ((x, S), T) = |
22578 | 595 |
if Sign.of_sort thy (T, S) then NONE else SOME x |
32952 | 596 |
val bads = map_filter bad_inst (args ~~ types); |
21962 | 597 |
val _ = null bads orelse err ("Ill-sorted instantiation of " ^ commas bads ^ " in"); |
12255 | 598 |
|
41591 | 599 |
val inst = args ~~ types; |
600 |
val subst = Term.map_type_tfree (the o AList.lookup (op =) inst); |
|
15570 | 601 |
val parent' = Option.map (apfst (map subst)) parent; |
41577
9a64c4007864
export Record.get_hierarchy -- external tools typically need this information;
wenzelm
parents:
41576
diff
changeset
|
602 |
in cons (name, inst) #> add_parents thy parent' end; |
9a64c4007864
export Record.get_hierarchy -- external tools typically need this information;
wenzelm
parents:
41576
diff
changeset
|
603 |
|
9a64c4007864
export Record.get_hierarchy -- external tools typically need this information;
wenzelm
parents:
41576
diff
changeset
|
604 |
in |
9a64c4007864
export Record.get_hierarchy -- external tools typically need this information;
wenzelm
parents:
41576
diff
changeset
|
605 |
|
9a64c4007864
export Record.get_hierarchy -- external tools typically need this information;
wenzelm
parents:
41576
diff
changeset
|
606 |
fun get_hierarchy thy (name, types) = add_parents thy (SOME (types, name)) []; |
9a64c4007864
export Record.get_hierarchy -- external tools typically need this information;
wenzelm
parents:
41576
diff
changeset
|
607 |
|
9a64c4007864
export Record.get_hierarchy -- external tools typically need this information;
wenzelm
parents:
41576
diff
changeset
|
608 |
fun get_parent_info thy parent = |
9a64c4007864
export Record.get_hierarchy -- external tools typically need this information;
wenzelm
parents:
41576
diff
changeset
|
609 |
add_parents thy parent [] |> map (fn (name, inst) => |
9a64c4007864
export Record.get_hierarchy -- external tools typically need this information;
wenzelm
parents:
41576
diff
changeset
|
610 |
let |
41591 | 611 |
val subst = Term.map_type_tfree (the o AList.lookup (op =) inst); |
41577
9a64c4007864
export Record.get_hierarchy -- external tools typically need this information;
wenzelm
parents:
41576
diff
changeset
|
612 |
val {fields, extension, induct_scheme, ext_def, ...} = the_info thy name; |
9a64c4007864
export Record.get_hierarchy -- external tools typically need this information;
wenzelm
parents:
41576
diff
changeset
|
613 |
val fields' = map (apsnd subst) fields; |
9a64c4007864
export Record.get_hierarchy -- external tools typically need this information;
wenzelm
parents:
41576
diff
changeset
|
614 |
val extension' = apsnd (map subst) extension; |
9a64c4007864
export Record.get_hierarchy -- external tools typically need this information;
wenzelm
parents:
41576
diff
changeset
|
615 |
in make_parent_info name fields' extension' ext_def induct_scheme end); |
9a64c4007864
export Record.get_hierarchy -- external tools typically need this information;
wenzelm
parents:
41576
diff
changeset
|
616 |
|
9a64c4007864
export Record.get_hierarchy -- external tools typically need this information;
wenzelm
parents:
41576
diff
changeset
|
617 |
end; |
4867
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
618 |
|
9be2bf0ce909
package extensible records with structural subtyping in HOL -- still
wenzelm
parents:
diff
changeset
|
619 |
|
21962 | 620 |
|
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
621 |
(** concrete syntax for records **) |
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
622 |
|
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
623 |
(* parse translations *) |
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
624 |
|
35144 | 625 |
local |
626 |
||
43681 | 627 |
fun split_args (field :: fields) ((name, arg) :: fargs) = |
628 |
if can (unsuffix name) field then |
|
629 |
let val (args, rest) = split_args fields fargs |
|
630 |
in (arg :: args, rest) end |
|
631 |
else raise Fail ("expecting field " ^ quote field ^ " but got " ^ quote name) |
|
632 |
| split_args [] (fargs as (_ :: _)) = ([], fargs) |
|
633 |
| split_args (_ :: _) [] = raise Fail "expecting more fields" |
|
634 |
| split_args _ _ = ([], []); |
|
635 |
||
35146 | 636 |
fun field_type_tr ((Const (@{syntax_const "_field_type"}, _) $ Const (name, _) $ arg)) = |
637 |
(name, arg) |
|
638 |
| field_type_tr t = raise TERM ("field_type_tr", [t]); |
|
639 |
||
640 |
fun field_types_tr (Const (@{syntax_const "_field_types"}, _) $ t $ u) = |
|
641 |
field_type_tr t :: field_types_tr u |
|
642 |
| field_types_tr t = [field_type_tr t]; |
|
643 |
||
644 |
fun record_field_types_tr more ctxt t = |
|
17261 | 645 |
let |
42361 | 646 |
val thy = Proof_Context.theory_of ctxt; |
35146 | 647 |
fun err msg = raise TERM ("Error in record-type input: " ^ msg, [t]); |
648 |
||
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
649 |
fun mk_ext (fargs as (name, _) :: _) = |
42361 | 650 |
(case get_fieldext thy (Proof_Context.intern_const ctxt name) of |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
651 |
SOME (ext, alphas) => |
18858 | 652 |
(case get_extfields thy ext of |
35146 | 653 |
SOME fields => |
654 |
let |
|
41489
8e2b8649507d
standardized split_last/last_elem towards List.last;
wenzelm
parents:
40845
diff
changeset
|
655 |
val (fields', _) = split_last fields; |
35146 | 656 |
val types = map snd fields'; |
43681 | 657 |
val (args, rest) = split_args (map fst fields') fargs |
658 |
handle Fail msg => err msg; |
|
45434 | 659 |
val argtypes = Syntax.check_typs ctxt (map Syntax_Phases.decode_typ args); |
660 |
val varifyT = varifyT (fold Term.maxidx_typ argtypes ~1 + 1); |
|
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
661 |
val vartypes = map varifyT types; |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
662 |
|
36159
bffb04bf4e83
more robust record syntax: use Type.raw_match to ignore sort constraints as in regular abbreviations (also note that constraints only affect operations, not types);
wenzelm
parents:
36153
diff
changeset
|
663 |
val subst = Type.raw_matches (vartypes, argtypes) Vartab.empty |
35146 | 664 |
handle Type.TYPE_MATCH => err "type is no proper record (extension)"; |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
665 |
val alphas' = |
42247
12fe41a92cd5
typed_print_translation: discontinued show_sorts argument;
wenzelm
parents:
42245
diff
changeset
|
666 |
map (Syntax_Phases.term_of_typ ctxt o Envir.norm_type subst o varifyT) |
12fe41a92cd5
typed_print_translation: discontinued show_sorts argument;
wenzelm
parents:
42245
diff
changeset
|
667 |
(#1 (split_last alphas)); |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
668 |
|
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
669 |
val more' = mk_ext rest; |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
670 |
in |
35430
df2862dc23a8
adapted to authentic syntax -- actual types are verbatim;
wenzelm
parents:
35410
diff
changeset
|
671 |
list_comb |
42290
b1f544c84040
discontinued special treatment of structure Lexicon;
wenzelm
parents:
42284
diff
changeset
|
672 |
(Syntax.const (Lexicon.mark_type (suffix ext_typeN ext)), alphas' @ [more']) |
35146 | 673 |
end |
43683 | 674 |
| NONE => err ("no fields defined for " ^ quote ext)) |
675 |
| NONE => err (quote name ^ " is no proper field")) |
|
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
676 |
| mk_ext [] = more; |
35146 | 677 |
in |
678 |
mk_ext (field_types_tr t) |
|
679 |
end; |
|
680 |
||
35363 | 681 |
fun record_type_tr ctxt [t] = record_field_types_tr (Syntax.const @{type_syntax unit}) ctxt t |
35146 | 682 |
| record_type_tr _ ts = raise TERM ("record_type_tr", ts); |
683 |
||
684 |
fun record_type_scheme_tr ctxt [t, more] = record_field_types_tr more ctxt t |
|
685 |
| record_type_scheme_tr _ ts = raise TERM ("record_type_scheme_tr", ts); |
|
686 |
||
35147 | 687 |
|
688 |
fun field_tr ((Const (@{syntax_const "_field"}, _) $ Const (name, _) $ arg)) = (name, arg) |
|
689 |
| field_tr t = raise TERM ("field_tr", [t]); |
|
690 |
||
691 |
fun fields_tr (Const (@{syntax_const "_fields"}, _) $ t $ u) = field_tr t :: fields_tr u |
|
692 |
| fields_tr t = [field_tr t]; |
|
693 |
||
694 |
fun record_fields_tr more ctxt t = |
|
695 |
let |
|
42361 | 696 |
val thy = Proof_Context.theory_of ctxt; |
35147 | 697 |
fun err msg = raise TERM ("Error in record input: " ^ msg, [t]); |
698 |
||
699 |
fun mk_ext (fargs as (name, _) :: _) = |
|
42361 | 700 |
(case get_fieldext thy (Proof_Context.intern_const ctxt name) of |
35147 | 701 |
SOME (ext, _) => |
702 |
(case get_extfields thy ext of |
|
703 |
SOME fields => |
|
704 |
let |
|
43681 | 705 |
val (args, rest) = split_args (map fst (fst (split_last fields))) fargs |
706 |
handle Fail msg => err msg; |
|
35147 | 707 |
val more' = mk_ext rest; |
42290
b1f544c84040
discontinued special treatment of structure Lexicon;
wenzelm
parents:
42284
diff
changeset
|
708 |
in list_comb (Syntax.const (Lexicon.mark_const (ext ^ extN)), args @ [more']) end |
43683 | 709 |
| NONE => err ("no fields defined for " ^ quote ext)) |
710 |
| NONE => err (quote name ^ " is no proper field")) |
|
35147 | 711 |
| mk_ext [] = more; |
712 |
in mk_ext (fields_tr t) end; |
|
713 |
||
714 |
fun record_tr ctxt [t] = record_fields_tr (Syntax.const @{const_syntax Unity}) ctxt t |
|
715 |
| record_tr _ ts = raise TERM ("record_tr", ts); |
|
716 |
||
717 |
fun record_scheme_tr ctxt [t, more] = record_fields_tr more ctxt t |
|
718 |
| record_scheme_tr _ ts = raise TERM ("record_scheme_tr", ts); |
|
719 |
||
720 |
||
721 |
fun field_update_tr (Const (@{syntax_const "_field_update"}, _) $ Const (name, _) $ arg) = |
|
43683 | 722 |
Syntax.const (suffix updateN name) $ Abs (Name.uu_, dummyT, arg) |
35147 | 723 |
| field_update_tr t = raise TERM ("field_update_tr", [t]); |
724 |
||
725 |
fun field_updates_tr (Const (@{syntax_const "_field_updates"}, _) $ t $ u) = |
|
726 |
field_update_tr t :: field_updates_tr u |
|
727 |
| field_updates_tr t = [field_update_tr t]; |
|
728 |
||
729 |
fun record_update_tr [t, u] = fold (curry op $) (field_updates_tr u) t |
|
730 |
| record_update_tr ts = raise TERM ("record_update_tr", ts); |
|
731 |
||
35146 | 732 |
in |
15215 | 733 |
|
24867 | 734 |
val parse_translation = |
35145
f132a4fd8679
moved generic update_name to Pure syntax -- not specific to HOL/record;
wenzelm
parents:
35144
diff
changeset
|
735 |
[(@{syntax_const "_record_update"}, record_update_tr)]; |
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
736 |
|
35146 | 737 |
val advanced_parse_translation = |
738 |
[(@{syntax_const "_record"}, record_tr), |
|
739 |
(@{syntax_const "_record_scheme"}, record_scheme_tr), |
|
740 |
(@{syntax_const "_record_type"}, record_type_tr), |
|
741 |
(@{syntax_const "_record_type_scheme"}, record_type_scheme_tr)]; |
|
742 |
||
743 |
end; |
|
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
744 |
|
21226
a607ae87ee81
field-update in records is generalised to take a function on the field
schirmer
parents:
21109
diff
changeset
|
745 |
|
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
746 |
(* print translations *) |
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
747 |
|
43682 | 748 |
val type_abbr = Attrib.setup_config_bool @{binding record_type_abbr} (K true); |
749 |
val type_as_fields = Attrib.setup_config_bool @{binding record_type_as_fields} (K true); |
|
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
750 |
|
35149 | 751 |
|
752 |
local |
|
753 |
||
754 |
(* FIXME early extern (!??) *) |
|
755 |
(* FIXME Syntax.free (??) *) |
|
756 |
fun field_type_tr' (c, t) = Syntax.const @{syntax_const "_field_type"} $ Syntax.const c $ t; |
|
757 |
||
758 |
fun field_types_tr' (t, u) = Syntax.const @{syntax_const "_field_types"} $ t $ u; |
|
759 |
||
760 |
fun record_type_tr' ctxt t = |
|
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
761 |
let |
42361 | 762 |
val thy = Proof_Context.theory_of ctxt; |
35149 | 763 |
|
45427
fca432074fb2
sort assignment before simultaneous term_check, not isolated parse_term;
wenzelm
parents:
45424
diff
changeset
|
764 |
val T = Syntax_Phases.decode_typ t; |
45424
01d75cf04497
localized Record.decode_type: use standard Proof_Context.get_sort;
wenzelm
parents:
44653
diff
changeset
|
765 |
val varifyT = varifyT (Term.maxidx_of_typ T + 1); |
35149 | 766 |
|
767 |
fun strip_fields T = |
|
768 |
(case T of |
|
35615
61bb9f8af129
record_type_tr': more robust strip_fields (printed types are not necessarily well-formed, e.g. in Syntax.pretty_arity);
wenzelm
parents:
35614
diff
changeset
|
769 |
Type (ext, args as _ :: _) => |
35149 | 770 |
(case try (unsuffix ext_typeN) ext of |
771 |
SOME ext' => |
|
772 |
(case get_extfields thy ext' of |
|
35615
61bb9f8af129
record_type_tr': more robust strip_fields (printed types are not necessarily well-formed, e.g. in Syntax.pretty_arity);
wenzelm
parents:
35614
diff
changeset
|
773 |
SOME (fields as (x, _) :: _) => |
61bb9f8af129
record_type_tr': more robust strip_fields (printed types are not necessarily well-formed, e.g. in Syntax.pretty_arity);
wenzelm
parents:
35614
diff
changeset
|
774 |
(case get_fieldext thy x of |
35149 | 775 |
SOME (_, alphas) => |
776 |
(let |
|
41489
8e2b8649507d
standardized split_last/last_elem towards List.last;
wenzelm
parents:
40845
diff
changeset
|
777 |
val (f :: fs, _) = split_last fields; |
35149 | 778 |
val fields' = |
42361 | 779 |
apfst (Proof_Context.extern_const ctxt) f :: |
42359 | 780 |
map (apfst Long_Name.base_name) fs; |
35149 | 781 |
val (args', more) = split_last args; |
41489
8e2b8649507d
standardized split_last/last_elem towards List.last;
wenzelm
parents:
40845
diff
changeset
|
782 |
val alphavars = map varifyT (#1 (split_last alphas)); |
36159
bffb04bf4e83
more robust record syntax: use Type.raw_match to ignore sort constraints as in regular abbreviations (also note that constraints only affect operations, not types);
wenzelm
parents:
36153
diff
changeset
|
783 |
val subst = Type.raw_matches (alphavars, args') Vartab.empty; |
35149 | 784 |
val fields'' = (map o apsnd) (Envir.norm_type subst o varifyT) fields'; |
785 |
in fields'' @ strip_fields more end |
|
36159
bffb04bf4e83
more robust record syntax: use Type.raw_match to ignore sort constraints as in regular abbreviations (also note that constraints only affect operations, not types);
wenzelm
parents:
36153
diff
changeset
|
786 |
handle Type.TYPE_MATCH => [("", T)]) |
35615
61bb9f8af129
record_type_tr': more robust strip_fields (printed types are not necessarily well-formed, e.g. in Syntax.pretty_arity);
wenzelm
parents:
35614
diff
changeset
|
787 |
| _ => [("", T)]) |
61bb9f8af129
record_type_tr': more robust strip_fields (printed types are not necessarily well-formed, e.g. in Syntax.pretty_arity);
wenzelm
parents:
35614
diff
changeset
|
788 |
| _ => [("", T)]) |
61bb9f8af129
record_type_tr': more robust strip_fields (printed types are not necessarily well-formed, e.g. in Syntax.pretty_arity);
wenzelm
parents:
35614
diff
changeset
|
789 |
| _ => [("", T)]) |
35149 | 790 |
| _ => [("", T)]); |
791 |
||
792 |
val (fields, (_, moreT)) = split_last (strip_fields T); |
|
793 |
val _ = null fields andalso raise Match; |
|
42247
12fe41a92cd5
typed_print_translation: discontinued show_sorts argument;
wenzelm
parents:
42245
diff
changeset
|
794 |
val u = |
12fe41a92cd5
typed_print_translation: discontinued show_sorts argument;
wenzelm
parents:
42245
diff
changeset
|
795 |
foldr1 field_types_tr' |
12fe41a92cd5
typed_print_translation: discontinued show_sorts argument;
wenzelm
parents:
42245
diff
changeset
|
796 |
(map (field_type_tr' o apsnd (Syntax_Phases.term_of_typ ctxt)) fields); |
35149 | 797 |
in |
43682 | 798 |
if not (Config.get ctxt type_as_fields) orelse null fields then raise Match |
35149 | 799 |
else if moreT = HOLogic.unitT then Syntax.const @{syntax_const "_record_type"} $ u |
42247
12fe41a92cd5
typed_print_translation: discontinued show_sorts argument;
wenzelm
parents:
42245
diff
changeset
|
800 |
else |
12fe41a92cd5
typed_print_translation: discontinued show_sorts argument;
wenzelm
parents:
42245
diff
changeset
|
801 |
Syntax.const @{syntax_const "_record_type_scheme"} $ u $ |
12fe41a92cd5
typed_print_translation: discontinued show_sorts argument;
wenzelm
parents:
42245
diff
changeset
|
802 |
Syntax_Phases.term_of_typ ctxt moreT |
35149 | 803 |
end; |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
804 |
|
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
805 |
(*try to reconstruct the record name type abbreviation from |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
806 |
the (nested) extension types*) |
35149 | 807 |
fun record_type_abbr_tr' abbr alphas zeta last_ext schemeT ctxt tm = |
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
808 |
let |
45427
fca432074fb2
sort assignment before simultaneous term_check, not isolated parse_term;
wenzelm
parents:
45424
diff
changeset
|
809 |
val T = Syntax_Phases.decode_typ tm; |
45424
01d75cf04497
localized Record.decode_type: use standard Proof_Context.get_sort;
wenzelm
parents:
44653
diff
changeset
|
810 |
val varifyT = varifyT (maxidx_of_typ T + 1); |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
811 |
|
36151
b89a2a05a3ce
modernized treatment of sort constraints in specification;
wenzelm
parents:
36137
diff
changeset
|
812 |
fun mk_type_abbr subst name args = |
b89a2a05a3ce
modernized treatment of sort constraints in specification;
wenzelm
parents:
36137
diff
changeset
|
813 |
let val abbrT = Type (name, map (varifyT o TFree) args) |
42247
12fe41a92cd5
typed_print_translation: discontinued show_sorts argument;
wenzelm
parents:
42245
diff
changeset
|
814 |
in Syntax_Phases.term_of_typ ctxt (Envir.norm_type subst abbrT) end; |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
815 |
|
36159
bffb04bf4e83
more robust record syntax: use Type.raw_match to ignore sort constraints as in regular abbreviations (also note that constraints only affect operations, not types);
wenzelm
parents:
36153
diff
changeset
|
816 |
fun match rT T = Type.raw_match (varifyT rT, T) Vartab.empty; |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
817 |
in |
43682 | 818 |
if Config.get ctxt type_abbr then |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
819 |
(case last_extT T of |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
820 |
SOME (name, _) => |
35148 | 821 |
if name = last_ext then |
35149 | 822 |
let val subst = match schemeT T in |
36151
b89a2a05a3ce
modernized treatment of sort constraints in specification;
wenzelm
parents:
36137
diff
changeset
|
823 |
if HOLogic.is_unitT (Envir.norm_type subst (varifyT (TFree zeta))) |
32335 | 824 |
then mk_type_abbr subst abbr alphas |
825 |
else mk_type_abbr subst (suffix schemeN abbr) (alphas @ [zeta]) |
|
35149 | 826 |
end handle Type.TYPE_MATCH => record_type_tr' ctxt tm |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
827 |
else raise Match (*give print translation of specialised record a chance*) |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
828 |
| _ => raise Match) |
35149 | 829 |
else record_type_tr' ctxt tm |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
830 |
end; |
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
831 |
|
35149 | 832 |
in |
833 |
||
834 |
fun record_ext_type_tr' name = |
|
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
835 |
let |
42290
b1f544c84040
discontinued special treatment of structure Lexicon;
wenzelm
parents:
42284
diff
changeset
|
836 |
val ext_type_name = Lexicon.mark_type (suffix ext_typeN name); |
35149 | 837 |
fun tr' ctxt ts = |
838 |
record_type_tr' ctxt (list_comb (Syntax.const ext_type_name, ts)); |
|
839 |
in (ext_type_name, tr') end; |
|
840 |
||
841 |
fun record_ext_type_abbr_tr' abbr alphas zeta last_ext schemeT name = |
|
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
842 |
let |
42290
b1f544c84040
discontinued special treatment of structure Lexicon;
wenzelm
parents:
42284
diff
changeset
|
843 |
val ext_type_name = Lexicon.mark_type (suffix ext_typeN name); |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
844 |
fun tr' ctxt ts = |
35149 | 845 |
record_type_abbr_tr' abbr alphas zeta last_ext schemeT ctxt |
846 |
(list_comb (Syntax.const ext_type_name, ts)); |
|
847 |
in (ext_type_name, tr') end; |
|
848 |
||
849 |
end; |
|
14700
2f885b7e5ba7
reimplementation of HOL records; only one type is created for
schirmer
parents:
14643
diff
changeset
|
850 |
|
32335 | 851 |
|
35240 | 852 |
local |
853 |
||
854 |
(* FIXME Syntax.free (??) *) |
|
855 |
fun field_tr' (c, t) = Syntax.const @{syntax_const "_field"} $ Syntax.const c $ t; |
|
856 |
fun fields_tr' (t, u) = Syntax.const @{syntax_const "_fields"} $ t $ u; |
|
857 |
||
858 |
fun record_tr' ctxt t = |
|
859 |
let |
|
42361 | 860 |
val thy = Proof_Context.theory_of ctxt; |
35240 | 861 |
|
862 |
fun strip_fields t = |
|
863 |
(case strip_comb t of |
|
864 |
(Const (ext, _), args as (_ :: _)) => |
|
42290
b1f544c84040
discontinued special treatment of structure Lexicon;
wenzelm
parents:
42284
diff
changeset
|
865 |
(case try (Lexicon.unmark_const o unsuffix extN) ext of |
35240 | 866 |
SOME ext' => |
867 |
(case get_extfields thy ext' of |
|
868 |
SOME fields => |
|
869 |
(let |
|
41489
8e2b8649507d
standardized split_last/last_elem towards List.last;
wenzelm
parents:
40845
diff
changeset
|
870 |
val (f :: fs, _) = split_last (map fst fields); |
42361 | 871 |
val fields' = Proof_Context.extern_const ctxt f :: map Long_Name.base_name fs; |
35240 | 872 |
val (args', more) = split_last args; |
873 |
in (fields' ~~ args') @ strip_fields more end |
|
40722
441260986b63
make two copies (!) of Library.UnequalLengths coincide with ListPair.UnequalLengths;
wenzelm
parents:
40315
diff
changeset
|
874 |
handle ListPair.UnequalLengths => [("", t)]) |
35240 | 875 |
| NONE => [("", t)]) |
876 |
| NONE => [("", t)]) |
|
877 |
| _ => [("", t)]); |
|
878 |
||
879 |
val (fields, (_, more)) = split_last (strip_fields t); |
|
880 |
val _ = null fields andalso raise Match; |
|
881 |
val u = foldr1 fields_tr' (map field_tr' fields); |
|
882 |
in |
|
46046 | 883 |
(case more of |
35240 | 884 |
Const (@{const_syntax Unity}, _) => Syntax.const @{syntax_const "_record"} $ u |
46046 | 885 |
| _ => Syntax.const @{syntax_const "_record_scheme"} $ u $ more) |
35240 | 886 |
end; |
887 |
||
888 |
in |
|
889 |
||
890 |
fun record_ext_tr' name = |
|
891 |
let |
|
42290
b1f544c84040
discontinued special treatment of structure Lexicon;
wenzelm
parents:
42284
diff
changeset
|
892 |
val ext_name = Lexicon.mark_const (name ^ extN); |
35240 | 893 |
fun tr' ctxt ts = record_tr' ctxt (list_comb (Syntax.const ext_name, ts)); |
894 |
in (ext_name, tr') end; |
|
895 |
||
896 |
end; |
|
897 |
||
898 |
||
899 |
local |
|
900 |
||
41578
f5e7f6712815
recovered printing of record updates over compound terms, e.g. "(|x = a|)(|x := b|)", which was apparently broken in 45a2ffc5911e;
wenzelm
parents:
41577
diff
changeset
|
901 |
fun dest_update ctxt c = |
42290
b1f544c84040
discontinued special treatment of structure Lexicon;
wenzelm
parents:
42284
diff
changeset
|
902 |
(case try Lexicon.unmark_const c of |
42361 | 903 |
SOME d => try (unsuffix updateN) (Proof_Context.extern_const ctxt d) |
41578
f5e7f6712815
recovered printing of record updates over compound terms, e.g. "(|x = a|)(|x := b|)", which was apparently broken in 45a2ffc5911e;
wenzelm
parents:
41577
diff
changeset
|
904 |
| NONE => NONE); |
f5e7f6712815
recovered printing of record updates over compound terms, e.g. "(|x = a|)(|x := b|)", which was apparently broken in 45a2ffc5911e;
wenzelm
parents:
41577
diff
changeset
|
905 |
|
35240 | 906 |
fun field_updates_tr' ctxt (tm as Const (c, _) $ k $ u) = |
41578
f5e7f6712815
recovered printing of record updates over compound terms, e.g. "(|x = a|)(|x := b|)", which was apparently broken in 45a2ffc5911e;
wenzelm
parents:
41577
diff
changeset
|
907 |
(case dest_update ctxt c of |
f5e7f6712815
recovered printing of record updates over compound terms, e.g. "(|x = a|)(|x := b|)", which was apparently broken in 45a2ffc5911e;
wenzelm
parents:
41577
diff
changeset
|
908 |
SOME name => |
42284 | 909 |
(case try Syntax_Trans.const_abs_tr' k of |
42086
74bf78db0d87
added Syntax.const_abs_tr' with proper eta_abs and Term.is_dependent;
wenzelm
parents:
41928
diff
changeset
|
910 |
SOME t => |
74bf78db0d87
added Syntax.const_abs_tr' with proper eta_abs and Term.is_dependent;
wenzelm
parents:
41928
diff
changeset
|
911 |
apfst (cons (Syntax.const @{syntax_const "_field_update"} $ Syntax.free name $ t)) |
74bf78db0d87
added Syntax.const_abs_tr' with proper eta_abs and Term.is_dependent;
wenzelm
parents:
41928
diff
changeset
|
912 |
(field_updates_tr' ctxt u) |
74bf78db0d87
added Syntax.const_abs_tr' with proper eta_abs and Term.is_dependent;
wenzelm
parents:
41928
diff
changeset
|
913 |
| NONE => ([], tm)) |
41578
f5e7f6712815
recovered printing of record updates over compound terms, e.g. "(|x = a|)(|x := b|)", which was apparently broken in 45a2ffc5911e;
wenzelm
parents:
41577
diff
changeset
|
914 |
| NONE => ([], tm)) |
35240 | 915 |
| field_updates_tr' _ tm = ([], tm); |
916 |
||
917 |
fun record_update_tr' ctxt tm = |
|
918 |
(case field_updates_tr' ctxt tm of |
|
919 |
([], _) => raise Match |
|
920 |
| (ts, u) => |
|
921 |
Syntax.const @{syntax_const "_record_update"} $ u $ |
|
922 |
foldr1 (fn (v, w) => Syntax.const @{syntax_const "_field_updates"} $ v $ w) (rev ts)); |
|
923 |
||
924 |
in |
|
925 |
||
926 |
fun field_update_tr' name = |
|
927 |
let |
|
42290
b1f544c84040
discontinued special treatment of structure Lexicon;
wenzelm
parents:
42284
diff
changeset
|
928 |
val update_name = Lexicon.mark_const (name ^ updateN); |
35240 | 929 |
fun tr' ctxt [t, u] = record_update_tr' ctxt (Syntax.const update_name $ t $ u) |
930 |
| tr' _ _ = raise Match; |
|
931 |
in (update_name, tr') end; |
|
932 |
||
933 |
end; |
|
934 |
||
935 |
||
32335 | 936 |
|
15015
c5768e8c4da4
* record_upd_simproc also simplifies trivial updates:
schirmer
parents:
15012
diff
changeset
|
937 |
(** record simprocs **) |
14358 | 938 |
|
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
939 |
fun is_sel_upd_pair thy (Const (s, _)) (Const (u, t')) = |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
940 |
(case get_updates thy u of |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
941 |
SOME u_name => u_name = s |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
942 |
| NONE => raise TERM ("is_sel_upd_pair: not update", [Const (u, t')])); |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
943 |
|
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
944 |
fun mk_comp_id f = |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
945 |
let val T = range_type (fastype_of f) |
40845 | 946 |
in HOLogic.mk_comp (Const (@{const_name Fun.id}, T --> T), f) end; |
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
947 |
|
32752
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
948 |
fun get_upd_funs (upd $ _ $ t) = upd :: get_upd_funs t |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
949 |
| get_upd_funs _ = []; |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
950 |
|
32975 | 951 |
fun get_accupd_simps thy term defset = |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
952 |
let |
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
953 |
val (acc, [body]) = strip_comb term; |
35408 | 954 |
val upd_funs = sort_distinct Term_Ord.fast_term_ord (get_upd_funs body); |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
955 |
fun get_simp upd = |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
956 |
let |
35133 | 957 |
(* FIXME fresh "f" (!?) *) |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
958 |
val T = domain_type (fastype_of upd); |
40845 | 959 |
val lhs = HOLogic.mk_comp (acc, upd $ Free ("f", T)); |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
960 |
val rhs = |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
961 |
if is_sel_upd_pair thy acc upd |
40845 | 962 |
then HOLogic.mk_comp (Free ("f", T), acc) |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
963 |
else mk_comp_id acc; |
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
964 |
val prop = lhs === rhs; |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
965 |
val othm = |
42361 | 966 |
Goal.prove (Proof_Context.init_global thy) [] [] prop |
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
967 |
(fn _ => |
32975 | 968 |
simp_tac defset 1 THEN |
34151
8d57ce46b3f7
prefer prefix "iso" over potentially misleading "is"; tuned
haftmann
parents:
33957
diff
changeset
|
969 |
REPEAT_DETERM (Iso_Tuple_Support.iso_tuple_intros_tac 1) THEN |
46043 | 970 |
TRY (simp_tac (HOL_ss addsimps @{thms id_apply id_o o_id}) 1)); |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
971 |
val dest = |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
972 |
if is_sel_upd_pair thy acc upd |
46043 | 973 |
then @{thm o_eq_dest} |
974 |
else @{thm o_eq_id_dest}; |
|
35021
c839a4c670c6
renamed old-style Drule.standard to Drule.export_without_context, to emphasize that this is in no way a standard operation;
wenzelm
parents:
34151
diff
changeset
|
975 |
in Drule.export_without_context (othm RS dest) end; |
32752
f65d74a264dd
Initial response to feedback from Norbert, Makarius on record patch
tsewell@rubicon.NSW.bigpond.net.au
parents:
32749
diff
changeset
|
976 |
in map get_simp upd_funs end; |
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
977 |
|
32975 | 978 |
fun get_updupd_simp thy defset u u' comp = |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
979 |
let |
35133 | 980 |
(* FIXME fresh "f" (!?) *) |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
981 |
val f = Free ("f", domain_type (fastype_of u)); |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
982 |
val f' = Free ("f'", domain_type (fastype_of u')); |
40845 | 983 |
val lhs = HOLogic.mk_comp (u $ f, u' $ f'); |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
984 |
val rhs = |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
985 |
if comp |
40845 | 986 |
then u $ HOLogic.mk_comp (f, f') |
987 |
else HOLogic.mk_comp (u' $ f', u $ f); |
|
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
988 |
val prop = lhs === rhs; |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
989 |
val othm = |
42361 | 990 |
Goal.prove (Proof_Context.init_global thy) [] [] prop |
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
991 |
(fn _ => |
32975 | 992 |
simp_tac defset 1 THEN |
34151
8d57ce46b3f7
prefer prefix "iso" over potentially misleading "is"; tuned
haftmann
parents:
33957
diff
changeset
|
993 |
REPEAT_DETERM (Iso_Tuple_Support.iso_tuple_intros_tac 1) THEN |
46043 | 994 |
TRY (simp_tac (HOL_ss addsimps @{thms id_apply}) 1)); |
995 |
val dest = if comp then @{thm o_eq_dest_lhs} else @{thm o_eq_dest}; |
|
35021
c839a4c670c6
renamed old-style Drule.standard to Drule.export_without_context, to emphasize that this is in no way a standard operation;
wenzelm
parents:
34151
diff
changeset
|
996 |
in Drule.export_without_context (othm RS dest) end; |
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
997 |
|
32975 | 998 |
fun get_updupd_simps thy term defset = |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
999 |
let |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1000 |
val upd_funs = get_upd_funs term; |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1001 |
val cname = fst o dest_Const; |
32975 | 1002 |
fun getswap u u' = get_updupd_simp thy defset u u' (cname u = cname u'); |
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1003 |
fun build_swaps_to_eq _ [] swaps = swaps |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1004 |
| build_swaps_to_eq upd (u :: us) swaps = |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1005 |
let |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1006 |
val key = (cname u, cname upd); |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1007 |
val newswaps = |
32764
690f9cccf232
replaced meta_iffD2 by existing Drule.equal_elim_rule2;
wenzelm
parents:
32763
diff
changeset
|
1008 |
if Symreltab.defined swaps key then swaps |
690f9cccf232
replaced meta_iffD2 by existing Drule.equal_elim_rule2;
wenzelm
parents:
32763
diff
changeset
|
1009 |
else Symreltab.insert (K true) (key, getswap u upd) swaps; |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1010 |
in |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1011 |
if cname u = cname upd then newswaps |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1012 |
else build_swaps_to_eq upd us newswaps |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1013 |
end; |
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1014 |
fun swaps_needed [] _ _ swaps = map snd (Symreltab.dest swaps) |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1015 |
| swaps_needed (u :: us) prev seen swaps = |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1016 |
if Symtab.defined seen (cname u) |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1017 |
then swaps_needed us prev seen (build_swaps_to_eq u prev swaps) |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1018 |
else swaps_needed us (u :: prev) (Symtab.insert (K true) (cname u, ()) seen) swaps; |
32764
690f9cccf232
replaced meta_iffD2 by existing Drule.equal_elim_rule2;
wenzelm
parents:
32763
diff
changeset
|
1019 |
in swaps_needed upd_funs [] Symtab.empty Symreltab.empty end; |
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1020 |
|
34151
8d57ce46b3f7
prefer prefix "iso" over potentially misleading "is"; tuned
haftmann
parents:
33957
diff
changeset
|
1021 |
val named_cterm_instantiate = Iso_Tuple_Support.named_cterm_instantiate; |
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1022 |
|
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1023 |
fun prove_unfold_defs thy ex_simps ex_simprs prop = |
21226
a607ae87ee81
field-update in records is generalised to take a function on the field
schirmer
parents:
21109
diff
changeset
|
1024 |
let |
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1025 |
val defset = get_sel_upd_defs thy; |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1026 |
val prop' = Envir.beta_eta_contract prop; |
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1027 |
val (lhs, _) = Logic.dest_equals (Logic.strip_assums_concl prop'); |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1028 |
val (_, args) = strip_comb lhs; |
32975 | 1029 |
val simps = (if length args = 1 then get_accupd_simps else get_updupd_simps) thy lhs defset; |
16973 | 1030 |
in |
42361 | 1031 |
Goal.prove (Proof_Context.init_global thy) [] [] prop' |
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1032 |
(fn _ => |
46043 | 1033 |
simp_tac (HOL_basic_ss addsimps (simps @ @{thms K_record_comp})) 1 THEN |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1034 |
TRY (simp_tac (HOL_basic_ss addsimps ex_simps addsimprocs ex_simprs) 1)) |
15203 | 1035 |
end; |
15015
c5768e8c4da4
* record_upd_simproc also simplifies trivial updates:
schirmer
parents:
15012
diff
changeset
|
1036 |
|
15215 | 1037 |
|
15059 | 1038 |
local |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1039 |
|
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1040 |
fun eq (s1: string) (s2: string) = (s1 = s2); |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1041 |
|
16822 | 1042 |
fun has_field extfields f T = |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1043 |
exists (fn (eN, _) => exists (eq f o fst) (Symtab.lookup_list extfields eN)) (dest_recTs T); |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1044 |
|
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1045 |
fun K_skeleton n (T as Type (_, [_, kT])) (b as Bound i) (Abs (x, xT, t)) = |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1046 |
if null (loose_bnos t) then ((n, kT), (Abs (x, xT, Bound (i + 1)))) else ((n, T), b) |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1047 |
| K_skeleton n T b _ = ((n, T), b); |
25705 | 1048 |
|
15059 | 1049 |
in |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1050 |
|
38012
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
1051 |
(* simproc *) |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1052 |
|
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1053 |
(* |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1054 |
Simplify selections of an record update: |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1055 |
(1) S (S_update k r) = k (S r) |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1056 |
(2) S (X_update k r) = S r |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1057 |
|
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1058 |
The simproc skips multiple updates at once, eg: |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1059 |
S (X_update x (Y_update y (S_update k r))) = k (S r) |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1060 |
|
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1061 |
But be careful in (2) because of the extensibility of records. |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1062 |
- If S is a more-selector we have to make sure that the update on component |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1063 |
X does not affect the selected subrecord. |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1064 |
- If X is a more-selector we have to make sure that S is not in the updated |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1065 |
subrecord. |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1066 |
*) |
38012
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
1067 |
val simproc = |
38715
6513ea67d95d
renamed Simplifier.simproc(_i) to Simplifier.simproc_global(_i) to emphasize that this is not the real thing;
wenzelm
parents:
38544
diff
changeset
|
1068 |
Simplifier.simproc_global @{theory HOL} "record_simp" ["x"] |
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1069 |
(fn thy => fn _ => fn t => |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1070 |
(case t of |
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1071 |
(sel as Const (s, Type (_, [_, rangeS]))) $ |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1072 |
((upd as Const (u, Type (_, [_, Type (_, [rT, _])]))) $ k $ r) => |
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1073 |
if is_selector thy s andalso is_some (get_updates thy u) then |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1074 |
let |
38758
f2cfb2cc03e8
misc tuning and simplification, notably theory data;
wenzelm
parents:
38715
diff
changeset
|
1075 |
val {sel_upd = {updates, ...}, extfields, ...} = Data.get thy; |
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1076 |
|
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1077 |
fun mk_eq_terms ((upd as Const (u, Type(_, [kT, _]))) $ k $ r) = |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1078 |
(case Symtab.lookup updates u of |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1079 |
NONE => NONE |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1080 |
| SOME u_name => |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1081 |
if u_name = s then |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1082 |
(case mk_eq_terms r of |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1083 |
NONE => |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1084 |
let |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1085 |
val rv = ("r", rT); |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1086 |
val rb = Bound 0; |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1087 |
val (kv, kb) = K_skeleton "k" kT (Bound 1) k; |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1088 |
in SOME (upd $ kb $ rb, kb $ (sel $ rb), [kv, rv]) end |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1089 |
| SOME (trm, trm', vars) => |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1090 |
let |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1091 |
val (kv, kb) = K_skeleton "k" kT (Bound (length vars)) k; |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1092 |
in SOME (upd $ kb $ trm, kb $ trm', kv :: vars) end) |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1093 |
else if has_field extfields u_name rangeS orelse |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1094 |
has_field extfields s (domain_type kT) then NONE |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1095 |
else |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1096 |
(case mk_eq_terms r of |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1097 |
SOME (trm, trm', vars) => |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1098 |
let val (kv, kb) = K_skeleton "k" kT (Bound (length vars)) k |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1099 |
in SOME (upd $ kb $ trm, trm', kv :: vars) end |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1100 |
| NONE => |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1101 |
let |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1102 |
val rv = ("r", rT); |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1103 |
val rb = Bound 0; |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1104 |
val (kv, kb) = K_skeleton "k" kT (Bound 1) k; |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1105 |
in SOME (upd $ kb $ rb, sel $ rb, [kv, rv]) end)) |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1106 |
| mk_eq_terms _ = NONE; |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1107 |
in |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1108 |
(case mk_eq_terms (upd $ k $ r) of |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1109 |
SOME (trm, trm', vars) => |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1110 |
SOME |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1111 |
(prove_unfold_defs thy [] [] |
46218
ecf6375e2abb
renamed Term.list_all to Logic.list_all, in accordance to HOLogic.list_all;
wenzelm
parents:
46215
diff
changeset
|
1112 |
(Logic.list_all (vars, Logic.mk_equals (sel $ trm, trm')))) |
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1113 |
| NONE => NONE) |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1114 |
end |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1115 |
else NONE |
15531 | 1116 |
| _ => NONE)); |
7178 | 1117 |
|
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1118 |
fun get_upd_acc_cong_thm upd acc thy simpset = |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1119 |
let |
38401 | 1120 |
val insts = [("upd", cterm_of thy upd), ("ac", cterm_of thy acc)]; |
32975 | 1121 |
val prop = Thm.concl_of (named_cterm_instantiate insts updacc_cong_triv); |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1122 |
in |
42361 | 1123 |
Goal.prove (Proof_Context.init_global thy) [] [] prop |
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1124 |
(fn _ => |
32975 | 1125 |
simp_tac simpset 1 THEN |
34151
8d57ce46b3f7
prefer prefix "iso" over potentially misleading "is"; tuned
haftmann
parents:
33957
diff
changeset
|
1126 |
REPEAT_DETERM (Iso_Tuple_Support.iso_tuple_intros_tac 1) THEN |
32975 | 1127 |
TRY (resolve_tac [updacc_cong_idI] 1)) |
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1128 |
end; |
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1129 |
|
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1130 |
|
38012
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
1131 |
(* upd_simproc *) |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1132 |
|
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1133 |
(*Simplify multiple updates: |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1134 |
(1) "N_update y (M_update g (N_update x (M_update f r))) = |
21226
a607ae87ee81
field-update in records is generalised to take a function on the field
schirmer
parents:
21109
diff
changeset
|
1135 |
(N_update (y o x) (M_update (g o f) r))" |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1136 |
(2) "r(|M:= M r|) = r" |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1137 |
|
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1138 |
In both cases "more" updates complicate matters: for this reason |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1139 |
we omit considering further updates if doing so would introduce |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1140 |
both a more update and an update to a field within it.*) |
38012
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
1141 |
val upd_simproc = |
38715
6513ea67d95d
renamed Simplifier.simproc(_i) to Simplifier.simproc_global(_i) to emphasize that this is not the real thing;
wenzelm
parents:
38544
diff
changeset
|
1142 |
Simplifier.simproc_global @{theory HOL} "record_upd_simp" ["x"] |
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1143 |
(fn thy => fn _ => fn t => |
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1144 |
let |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1145 |
(*We can use more-updators with other updators as long |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1146 |
as none of the other updators go deeper than any more |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1147 |
updator. min here is the depth of the deepest other |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1148 |
updator, max the depth of the shallowest more updator.*) |
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1149 |
fun include_depth (dep, true) (min, max) = |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1150 |
if min <= dep |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1151 |
then SOME (min, if dep <= max orelse max = ~1 then dep else max) |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1152 |
else NONE |
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1153 |
| include_depth (dep, false) (min, max) = |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1154 |
if dep <= max orelse max = ~1 |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1155 |
then SOME (if min <= dep then dep else min, max) |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1156 |
else NONE; |
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1157 |
|
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1158 |
fun getupdseq (term as (upd as Const (u, _)) $ f $ tm) min max = |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1159 |
(case get_update_details u thy of |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1160 |
SOME (s, dep, ismore) => |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1161 |
(case include_depth (dep, ismore) (min, max) of |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1162 |
SOME (min', max') => |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1163 |
let val (us, bs, _) = getupdseq tm min' max' |
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1164 |
in ((upd, s, f) :: us, bs, fastype_of term) end |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1165 |
| NONE => ([], term, HOLogic.unitT)) |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1166 |
| NONE => ([], term, HOLogic.unitT)) |
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1167 |
| getupdseq term _ _ = ([], term, HOLogic.unitT); |
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1168 |
|
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1169 |
val (upds, base, baseT) = getupdseq t 0 ~1; |
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1170 |
|
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1171 |
fun is_upd_noop s (Abs (n, T, Const (s', T') $ tm')) tm = |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1172 |
if s = s' andalso null (loose_bnos tm') |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1173 |
andalso subst_bound (HOLogic.unit, tm') = tm |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1174 |
then (true, Abs (n, T, Const (s', T') $ Bound 1)) |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1175 |
else (false, HOLogic.unit) |
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1176 |
| is_upd_noop _ _ _ = (false, HOLogic.unit); |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1177 |
|
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1178 |
fun get_noop_simps (upd as Const _) (Abs (_, _, (acc as Const _) $ _)) = |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1179 |
let |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1180 |
val ss = get_sel_upd_defs thy; |
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1181 |
val uathm = get_upd_acc_cong_thm upd acc thy ss; |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1182 |
in |
35021
c839a4c670c6
renamed old-style Drule.standard to Drule.export_without_context, to emphasize that this is in no way a standard operation;
wenzelm
parents:
34151
diff
changeset
|
1183 |
[Drule.export_without_context (uathm RS updacc_noopE), |
c839a4c670c6
renamed old-style Drule.standard to Drule.export_without_context, to emphasize that this is in no way a standard operation;
wenzelm
parents:
34151
diff
changeset
|
1184 |
Drule.export_without_context (uathm RS updacc_noop_compE)] |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1185 |
end; |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1186 |
|
32974
2a1aaa2d9e64
eliminated old List.foldr and OldTerm operations;
wenzelm
parents:
32973
diff
changeset
|
1187 |
(*If f is constant then (f o g) = f. We know that K_skeleton |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1188 |
only returns constant abstractions thus when we see an |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1189 |
abstraction we can discard inner updates.*) |
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1190 |
fun add_upd (f as Abs _) fs = [f] |
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1191 |
| add_upd f fs = (f :: fs); |
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1192 |
|
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1193 |
(*mk_updterm returns |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1194 |
(orig-term-skeleton, simplified-skeleton, |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1195 |
variables, duplicate-updates, simp-flag, noop-simps) |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1196 |
|
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1197 |
where duplicate-updates is a table used to pass upward |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1198 |
the list of update functions which can be composed |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1199 |
into an update above them, simp-flag indicates whether |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1200 |
any simplification was achieved, and noop-simps are |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1201 |
used for eliminating case (2) defined above*) |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1202 |
fun mk_updterm ((upd as Const (u, T), s, f) :: upds) above term = |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1203 |
let |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1204 |
val (lhs, rhs, vars, dups, simp, noops) = |
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1205 |
mk_updterm upds (Symtab.update (u, ()) above) term; |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1206 |
val (fvar, skelf) = |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1207 |
K_skeleton (Long_Name.base_name s) (domain_type T) (Bound (length vars)) f; |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1208 |
val (isnoop, skelf') = is_upd_noop s f term; |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1209 |
val funT = domain_type T; |
35133 | 1210 |
fun mk_comp_local (f, f') = |
1211 |
Const (@{const_name Fun.comp}, funT --> funT --> funT) $ f $ f'; |
|
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1212 |
in |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1213 |
if isnoop then |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1214 |
(upd $ skelf' $ lhs, rhs, vars, |
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1215 |
Symtab.update (u, []) dups, true, |
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1216 |
if Symtab.defined noops u then noops |
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1217 |
else Symtab.update (u, get_noop_simps upd skelf') noops) |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1218 |
else if Symtab.defined above u then |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1219 |
(upd $ skelf $ lhs, rhs, fvar :: vars, |
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1220 |
Symtab.map_default (u, []) (add_upd skelf) dups, |
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1221 |
true, noops) |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1222 |
else |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1223 |
(case Symtab.lookup dups u of |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1224 |
SOME fs => |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1225 |
(upd $ skelf $ lhs, |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1226 |
upd $ foldr1 mk_comp_local (add_upd skelf fs) $ rhs, |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1227 |
fvar :: vars, dups, true, noops) |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1228 |
| NONE => (upd $ skelf $ lhs, upd $ skelf $ rhs, fvar :: vars, dups, simp, noops)) |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1229 |
end |
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1230 |
| mk_updterm [] _ _ = |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1231 |
(Bound 0, Bound 0, [("r", baseT)], Symtab.empty, false, Symtab.empty) |
32799
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1232 |
| mk_updterm us _ _ = raise TERM ("mk_updterm match", map (fn (x, _, _) => x) us); |
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1233 |
|
7478ea535416
eliminated dead code, redundant bindings and parameters;
wenzelm
parents:
32770
diff
changeset
|
1234 |
val (lhs, rhs, vars, _, simp, noops) = mk_updterm upds Symtab.empty base; |
32952 | 1235 |
val noops' = maps snd (Symtab.dest noops); |
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1236 |
in |
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1237 |
if simp then |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1238 |
SOME |
38012
3ca193a6ae5a
delete structure Basic_Record; avoid `record` in names in structure Record
haftmann
parents:
37781
diff
changeset
|
1239 |
(prove_unfold_defs thy noops' [simproc] |
46218
ecf6375e2abb
renamed Term.list_all to Logic.list_all, in accordance to HOLogic.list_all;
wenzelm
parents:
46215
diff
changeset
|
1240 |
(Logic.list_all (vars, Logic.mk_equals (lhs, rhs)))) |
32743
c4e9a48bc50e
Initial attempt at porting record update to repository Isabelle.
tsewell@rubicon.NSW.bigpond.net.au
parents:
32335
diff
changeset
|
1241 |
else NONE |
32761
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1242 |
end); |
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1243 |
|
54fee94b2b29
tuned whitespace -- recover basic Isabelle conventions;
wenzelm
parents:
32760
diff
changeset
|
1244 |
end; |
15015
c5768e8c4da4
* record_upd_simproc also simplifies trivial updates:
schirmer
parents:
15012
diff
changeset
|