| author | wenzelm |
| Sun, 18 Jan 2015 20:15:05 +0100 | |
| changeset 59396 | a2f4252c5489 |
| parent 58916 | 229765cc3414 |
| child 59819 | dbec7f33093d |
| permissions | -rw-r--r-- |
|
58352
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
1 |
(* Title: HOL/Tools/BNF/bnf_lfp_basic_sugar.ML |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
2 |
Author: Jasmin Blanchette, TU Muenchen |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
3 |
Copyright 2014 |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
4 |
|
| 58353 | 5 |
Registration of basic types as BNF least fixpoints (datatypes). |
|
58352
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
6 |
*) |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
7 |
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
8 |
structure BNF_LFP_Basic_Sugar : sig end = |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
9 |
struct |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
10 |
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
11 |
open Ctr_Sugar |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
12 |
open BNF_Util |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
13 |
open BNF_Def |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
14 |
open BNF_Comp |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
15 |
open BNF_FP_Rec_Sugar_Util |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
16 |
open BNF_FP_Util |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
17 |
open BNF_FP_Def_Sugar |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
18 |
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
19 |
fun trivial_absT_info_of fpT = |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
20 |
{absT = fpT,
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
21 |
repT = fpT, |
| 58353 | 22 |
abs = Const (@{const_name id_bnf}, fpT --> fpT),
|
23 |
rep = Const (@{const_name id_bnf}, fpT --> fpT),
|
|
24 |
abs_inject = @{thm type_definition.Abs_inject[OF type_definition_id_bnf_UNIV UNIV_I UNIV_I]},
|
|
25 |
abs_inverse = @{thm type_definition.Abs_inverse[OF type_definition_id_bnf_UNIV UNIV_I]},
|
|
26 |
type_definition = @{thm type_definition_id_bnf_UNIV}};
|
|
|
58352
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
27 |
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
28 |
fun the_frozen_ctr_sugar_of ctxt fpT_name = |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
29 |
the (ctr_sugar_of ctxt fpT_name) |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
30 |
|> morph_ctr_sugar (Morphism.typ_morphism "BNF" Logic.unvarifyT_global |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
31 |
$> Morphism.term_morphism "BNF" (Term.map_types Logic.unvarifyT_global)); |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
32 |
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
33 |
fun trivial_fp_result_of fp_bnf fpT C xtor_map xtor_sets xtor_rel ctor_rec_o_map xtor_rel_induct = |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
34 |
{Ts = [fpT],
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
35 |
bnfs = [fp_bnf], |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
36 |
ctors = [Const (@{const_name xtor}, fpT --> fpT)],
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
37 |
dtors = [Const (@{const_name xtor}, fpT --> fpT)],
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
38 |
xtor_co_recs = [Const (@{const_name ctor_rec}, (fpT --> C) --> (fpT --> C))],
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
39 |
xtor_co_induct = @{thm xtor_induct},
|
|
58377
c6f93b8d2d8e
moved old 'size' generator together with 'old_datatype'
blanchet
parents:
58353
diff
changeset
|
40 |
dtor_ctors = @{thms xtor_xtor},
|
|
c6f93b8d2d8e
moved old 'size' generator together with 'old_datatype'
blanchet
parents:
58353
diff
changeset
|
41 |
ctor_dtors = @{thms xtor_xtor},
|
|
c6f93b8d2d8e
moved old 'size' generator together with 'old_datatype'
blanchet
parents:
58353
diff
changeset
|
42 |
ctor_injects = @{thms xtor_inject},
|
|
c6f93b8d2d8e
moved old 'size' generator together with 'old_datatype'
blanchet
parents:
58353
diff
changeset
|
43 |
dtor_injects = @{thms xtor_inject},
|
| 58583 | 44 |
xtor_maps = [xtor_map], |
| 58584 | 45 |
xtor_setss = [xtor_sets], |
| 58585 | 46 |
xtor_rels = [xtor_rel], |
|
58352
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
47 |
xtor_co_rec_thms = [map_id0_of_bnf fp_bnf RS @{thm ctor_rec}],
|
|
58578
9ff8ca957c02
rename 'xtor_co_rec_o_map_thms' to 'xtor_co_rec_o_maps'
desharna
parents:
58577
diff
changeset
|
48 |
xtor_co_rec_o_maps = [ctor_rec_o_map], |
|
58579
b7bc5ba2f3fb
rename 'rel_xtor_co_induct_thm' to 'xtor_rel_co_induct'
desharna
parents:
58578
diff
changeset
|
49 |
xtor_rel_co_induct = xtor_rel_induct, |
|
58580
8ee2d984caa8
rename 'dtor_set_induct_thms' to 'dtor_set_inducts'
desharna
parents:
58579
diff
changeset
|
50 |
dtor_set_inducts = [], |
|
58581
e2e2d775869c
rename 'xtor_co_rec_transfer_thms' to 'xtor_co_rec_transfers'
desharna
parents:
58580
diff
changeset
|
51 |
xtor_co_rec_transfers = []}; |
|
58352
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
52 |
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
53 |
fun fp_sugar_of_sum ctxt = |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
54 |
let |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
55 |
val fpT as Type (fpT_name, As) = @{typ "'a + 'b"};
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
56 |
val fpBT = @{typ "'c + 'd"};
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
57 |
val C = @{typ 'e};
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
58 |
val X = @{typ 'sum};
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
59 |
val ctr_Tss = map single As; |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
60 |
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
61 |
val fp_bnf = the (bnf_of ctxt fpT_name); |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
62 |
val xtor_map = @{thm xtor_map[of "map_sum f1 f2" for f1 f2]};
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
63 |
val xtor_sets = @{thms xtor_set[of setl] xtor_set[of setr]};
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
64 |
val xtor_rel = @{thm xtor_rel[of "rel_sum R1 R2" for R1 R2]};
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
65 |
val ctor_rec_o_map = @{thm ctor_rec_o_map[of _ "map_sum g1 g2" for g1 g2]};
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
66 |
val xtor_rel_induct = @{thm xtor_rel_induct[of "rel_sum R1 R2" for R1 R2]};
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
67 |
in |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
68 |
{T = fpT,
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
69 |
BT = fpBT, |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
70 |
X = X, |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
71 |
fp = Least_FP, |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
72 |
fp_res_index = 0, |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
73 |
fp_res = |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
74 |
trivial_fp_result_of fp_bnf fpT C xtor_map xtor_sets xtor_rel ctor_rec_o_map xtor_rel_induct, |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
75 |
pre_bnf = ID_bnf (*wrong*), |
| 58674 | 76 |
fp_bnf = fp_bnf, |
|
58352
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
77 |
absT_info = trivial_absT_info_of fpT, |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
78 |
fp_nesting_bnfs = [], |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
79 |
live_nesting_bnfs = [], |
| 58460 | 80 |
fp_ctr_sugar = |
81 |
{ctrXs_Tss = ctr_Tss,
|
|
82 |
ctr_defs = @{thms Inl_def_alt Inr_def_alt},
|
|
| 58569 | 83 |
ctr_sugar = the_frozen_ctr_sugar_of ctxt fpT_name, |
| 58916 | 84 |
ctr_transfers = @{thms Inl_transfer Inr_transfer},
|
85 |
case_transfers = @{thms case_sum_transfer},
|
|
86 |
disc_transfers = @{thms isl_transfer},
|
|
| 58676 | 87 |
sel_transfers = []}, |
| 58459 | 88 |
fp_bnf_sugar = |
| 58462 | 89 |
{map_thms = @{thms map_sum.simps},
|
| 58916 | 90 |
map_disc_iffs = @{thms isl_map_sum},
|
91 |
map_selss = map single @{thms map_sum_sel},
|
|
| 58462 | 92 |
rel_injects = @{thms rel_sum_simps(1,4)},
|
| 58562 | 93 |
rel_distincts = @{thms rel_sum_simps(2,3)[THEN eq_False[THEN iffD1]]},
|
| 58916 | 94 |
rel_sels = @{thms rel_sum_sel},
|
95 |
rel_intros = @{thms rel_sum.intros},
|
|
96 |
rel_cases = @{thms rel_sum.cases},
|
|
97 |
set_thms = @{thms sum_set_simps},
|
|
98 |
set_selssss = [[[@{thms set_sum_sel(1)}], [[]]], [[[]], [@{thms set_sum_sel(2)}]]],
|
|
99 |
set_introssss = [[[@{thms setl.intros[OF refl]}], [[]]],
|
|
100 |
[[[]], [@{thms setr.intros[OF refl]}]]],
|
|
101 |
set_cases = @{thms setl.cases[unfolded hypsubst_in_prems]
|
|
102 |
setr.cases[unfolded hypsubst_in_prems]}}, |
|
| 58459 | 103 |
fp_co_induct_sugar = |
| 58461 | 104 |
{co_rec = Const (@{const_name case_sum}, map (fn Ts => (Ts ---> C)) ctr_Tss ---> fpT --> C),
|
105 |
common_co_inducts = @{thms sum.induct},
|
|
106 |
co_inducts = @{thms sum.induct},
|
|
107 |
co_rec_def = @{thm ctor_rec_def_alt[of "case_sum f1 f2" for f1 f2]},
|
|
| 58459 | 108 |
co_rec_thms = @{thms sum.case},
|
109 |
co_rec_discs = [], |
|
| 58572 | 110 |
co_rec_disc_iffs = [], |
| 58573 | 111 |
co_rec_selss = [], |
112 |
co_rec_codes = [], |
|
| 58916 | 113 |
co_rec_transfers = @{thms case_sum_transfer},
|
| 58734 | 114 |
co_rec_o_maps = @{thms case_sum_o_map_sum},
|
| 58916 | 115 |
common_rel_co_inducts = @{thms rel_sum.inducts},
|
116 |
rel_co_inducts = @{thms rel_sum.induct},
|
|
| 58577 | 117 |
common_set_inducts = [], |
118 |
set_inducts = []}} |
|
|
58352
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
119 |
end; |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
120 |
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
121 |
fun fp_sugar_of_prod ctxt = |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
122 |
let |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
123 |
val fpT as Type (fpT_name, As) = @{typ "'a * 'b"};
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
124 |
val fpBT = @{typ "'c * 'd"};
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
125 |
val C = @{typ 'e};
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
126 |
val X = @{typ 'prod};
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
127 |
val ctr_Ts = As; |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
128 |
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
129 |
val fp_bnf = the (bnf_of ctxt fpT_name); |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
130 |
val xtor_map = @{thm xtor_map[of "map_prod f1 f2" for f1 f2]};
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
131 |
val xtor_sets = @{thms xtor_set[of fsts] xtor_set[of snds]};
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
132 |
val xtor_rel = @{thm xtor_rel[of "rel_prod R1 R2" for R1 R2]};
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
133 |
val ctor_rec_o_map = @{thm ctor_rec_o_map[of _ "map_prod g1 g2" for g1 g2]};
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
134 |
val xtor_rel_induct = @{thm xtor_rel_induct[of "rel_prod R1 R2" for R1 R2]};
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
135 |
in |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
136 |
{T = fpT,
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
137 |
BT = fpBT, |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
138 |
X = X, |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
139 |
fp = Least_FP, |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
140 |
fp_res_index = 0, |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
141 |
fp_res = |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
142 |
trivial_fp_result_of fp_bnf fpT C xtor_map xtor_sets xtor_rel ctor_rec_o_map xtor_rel_induct, |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
143 |
pre_bnf = ID_bnf (*wrong*), |
| 58674 | 144 |
fp_bnf = fp_bnf, |
|
58352
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
145 |
absT_info = trivial_absT_info_of fpT, |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
146 |
fp_nesting_bnfs = [], |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
147 |
live_nesting_bnfs = [], |
| 58460 | 148 |
fp_ctr_sugar = |
149 |
{ctrXs_Tss = [ctr_Ts],
|
|
150 |
ctr_defs = @{thms Pair_def_alt},
|
|
| 58569 | 151 |
ctr_sugar = the_frozen_ctr_sugar_of ctxt fpT_name, |
| 58916 | 152 |
ctr_transfers = @{thms Pair_transfer},
|
153 |
case_transfers = @{thms case_prod_transfer},
|
|
| 58676 | 154 |
disc_transfers = [], |
| 58916 | 155 |
sel_transfers = @{thms fst_transfer snd_transfer}},
|
| 58459 | 156 |
fp_bnf_sugar = |
| 58462 | 157 |
{map_thms = @{thms map_prod_simp},
|
| 58560 | 158 |
map_disc_iffs = [], |
| 58916 | 159 |
map_selss = [@{thms fst_map_prod snd_map_prod}],
|
| 58462 | 160 |
rel_injects = @{thms rel_prod_apply},
|
| 58562 | 161 |
rel_distincts = [], |
| 58916 | 162 |
rel_sels = @{thms rel_prod_sel},
|
163 |
rel_intros = @{thms rel_prod.intros},
|
|
164 |
rel_cases = @{thms rel_prod.cases},
|
|
165 |
set_thms = @{thms prod_set_simps},
|
|
166 |
set_selssss = [[[@{thms fsts.intros}, []]], [[[], @{thms snds.intros}]]],
|
|
167 |
set_introssss = [[[@{thms fsts.intros[of "(a, b)" for a b, unfolded fst_conv]}, []]],
|
|
168 |
[[[], @{thms snds.intros[of "(a, b)" for a b, unfolded snd_conv]}]]],
|
|
169 |
set_cases = @{thms fsts.cases[unfolded eq_fst_iff ex_neg_all_pos]
|
|
170 |
snds.cases[unfolded eq_snd_iff ex_neg_all_pos]}}, |
|
| 58459 | 171 |
fp_co_induct_sugar = |
| 58461 | 172 |
{co_rec = Const (@{const_name case_prod}, (ctr_Ts ---> C) --> fpT --> C),
|
173 |
common_co_inducts = @{thms prod.induct},
|
|
174 |
co_inducts = @{thms prod.induct},
|
|
175 |
co_rec_def = @{thm ctor_rec_def_alt[of "case_prod f" for f]},
|
|
| 58459 | 176 |
co_rec_thms = @{thms prod.case},
|
177 |
co_rec_discs = [], |
|
| 58572 | 178 |
co_rec_disc_iffs = [], |
| 58573 | 179 |
co_rec_selss = [], |
180 |
co_rec_codes = [], |
|
| 58916 | 181 |
co_rec_transfers = @{thms case_prod_transfer},
|
| 58734 | 182 |
co_rec_o_maps = @{thms case_prod_o_map_prod},
|
| 58916 | 183 |
common_rel_co_inducts = @{thms rel_prod.inducts},
|
184 |
rel_co_inducts = @{thms rel_prod.induct},
|
|
| 58577 | 185 |
common_set_inducts = [], |
186 |
set_inducts = []}} |
|
|
58352
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
187 |
end; |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
188 |
|
| 58665 | 189 |
val _ = Theory.setup (Named_Target.theory_map (fn lthy => |
|
58377
c6f93b8d2d8e
moved old 'size' generator together with 'old_datatype'
blanchet
parents:
58353
diff
changeset
|
190 |
fold (BNF_FP_Def_Sugar.register_fp_sugars (K true) o single o (fn f => f lthy)) |
|
58352
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
191 |
[fp_sugar_of_sum, fp_sugar_of_prod] lthy)); |
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
192 |
|
|
37745650a3f4
register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff
changeset
|
193 |
end; |