src/HOL/Tools/BNF/bnf_lfp_basic_sugar.ML
author desharna
Tue, 14 Oct 2014 15:11:35 +0200
changeset 58671 4cc24f1e52d5
parent 58665 50b229a5a097
child 58672 3f0d612ebd8e
permissions -rw-r--r--
preserve the structure of 'set_sel' theorem in ML
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
c9f374b64d99 tuned fact visibility
blanchet
parents: 58352
diff changeset
     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
c9f374b64d99 tuned fact visibility
blanchet
parents: 58352
diff changeset
    22
   abs = Const (@{const_name id_bnf}, fpT --> fpT),
c9f374b64d99 tuned fact visibility
blanchet
parents: 58352
diff changeset
    23
   rep = Const (@{const_name id_bnf}, fpT --> fpT),
c9f374b64d99 tuned fact visibility
blanchet
parents: 58352
diff changeset
    24
   abs_inject = @{thm type_definition.Abs_inject[OF type_definition_id_bnf_UNIV UNIV_I UNIV_I]},
c9f374b64d99 tuned fact visibility
blanchet
parents: 58352
diff changeset
    25
   abs_inverse = @{thm type_definition.Abs_inverse[OF type_definition_id_bnf_UNIV UNIV_I]},
c9f374b64d99 tuned fact visibility
blanchet
parents: 58352
diff changeset
    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
1dd83cbba636 rename 'xtor_map_thms' to 'xtor_maps'
desharna
parents: 58581
diff changeset
    44
   xtor_maps = [xtor_map],
58584
b6492a7abb59 rename 'xtor_set_thmss' to 'xtor_setss'
desharna
parents: 58583
diff changeset
    45
   xtor_setss = [xtor_sets],
58585
efc8b2c54a38 rename 'xtor_rel_thms' to 'xtor_rels'
desharna
parents: 58584
diff changeset
    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*),
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
    76
     absT_info = trivial_absT_info_of fpT,
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
    77
     fp_nesting_bnfs = [],
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
    78
     live_nesting_bnfs = [],
58460
a88eb33058f7 refactor fp_sugar move theorems
desharna
parents: 58459
diff changeset
    79
     fp_ctr_sugar =
a88eb33058f7 refactor fp_sugar move theorems
desharna
parents: 58459
diff changeset
    80
       {ctrXs_Tss = ctr_Tss,
a88eb33058f7 refactor fp_sugar move theorems
desharna
parents: 58459
diff changeset
    81
        ctr_defs = @{thms Inl_def_alt Inr_def_alt},
58569
3f61adcc1fc9 add 'ctr_transfers' to 'fp_sugar'
desharna
parents: 58568
diff changeset
    82
        ctr_sugar = the_frozen_ctr_sugar_of ctxt fpT_name,
58570
a3434015faf0 add 'case_transfers' to 'fp_sugar'
desharna
parents: 58569
diff changeset
    83
        ctr_transfers = [],
58571
d78b00f98de8 add 'disc_transfers' to 'fp_sugar'
desharna
parents: 58570
diff changeset
    84
        case_transfers = [],
d78b00f98de8 add 'disc_transfers' to 'fp_sugar'
desharna
parents: 58570
diff changeset
    85
        disc_transfers = []},
58459
f70bffabd7cf refactor fp_sugar move theorems
desharna
parents: 58458
diff changeset
    86
     fp_bnf_sugar =
58462
b46874f2090f refactor fp_sugar move theorems
desharna
parents: 58461
diff changeset
    87
       {map_thms = @{thms map_sum.simps},
58560
ee502a9b38aa add 'map_disc_iffs' to 'fp_sugar'
desharna
parents: 58462
diff changeset
    88
        map_disc_iffs = [],
58561
7d7473b54fe0 add 'map_sels' to 'fp_sugar'
desharna
parents: 58560
diff changeset
    89
        map_sels = [],
58462
b46874f2090f refactor fp_sugar move theorems
desharna
parents: 58461
diff changeset
    90
        rel_injects = @{thms rel_sum_simps(1,4)},
58562
e94cd4f71d0c add 'rel_sels' to 'fp_sugar'
desharna
parents: 58561
diff changeset
    91
        rel_distincts = @{thms rel_sum_simps(2,3)[THEN eq_False[THEN iffD1]]},
58563
f5019700efa5 add 'rel_intros' to 'fp_sugar'
desharna
parents: 58562
diff changeset
    92
        rel_sels = [],
58564
778a80674112 add 'rel_cases' to 'fp_sugar'
desharna
parents: 58563
diff changeset
    93
        rel_intros = [],
58565
97cefa5ef0be add 'set_thms' to 'fp_sugar'
desharna
parents: 58564
diff changeset
    94
        rel_cases = [],
58566
62aa83edad7e add 'set_sels' to 'fp_sugar'
desharna
parents: 58565
diff changeset
    95
        set_thms = [],
58671
4cc24f1e52d5 preserve the structure of 'set_sel' theorem in ML
desharna
parents: 58665
diff changeset
    96
        set_selssss = [],
58568
727e014c6dbd add 'set_cases' to 'fp_sugar'
desharna
parents: 58567
diff changeset
    97
        set_intros = [],
727e014c6dbd add 'set_cases' to 'fp_sugar'
desharna
parents: 58567
diff changeset
    98
        set_cases = []},
58459
f70bffabd7cf refactor fp_sugar move theorems
desharna
parents: 58458
diff changeset
    99
     fp_co_induct_sugar =
58461
75ee8d49c724 refactor fp_sugar move theorems
desharna
parents: 58460
diff changeset
   100
       {co_rec = Const (@{const_name case_sum}, map (fn Ts => (Ts ---> C)) ctr_Tss ---> fpT --> C),
75ee8d49c724 refactor fp_sugar move theorems
desharna
parents: 58460
diff changeset
   101
        common_co_inducts = @{thms sum.induct},
75ee8d49c724 refactor fp_sugar move theorems
desharna
parents: 58460
diff changeset
   102
        co_inducts = @{thms sum.induct},
75ee8d49c724 refactor fp_sugar move theorems
desharna
parents: 58460
diff changeset
   103
        co_rec_def = @{thm ctor_rec_def_alt[of "case_sum f1 f2" for f1 f2]},
58459
f70bffabd7cf refactor fp_sugar move theorems
desharna
parents: 58458
diff changeset
   104
        co_rec_thms = @{thms sum.case},
f70bffabd7cf refactor fp_sugar move theorems
desharna
parents: 58458
diff changeset
   105
        co_rec_discs = [],
58572
2e0cf67fa89f add 'co_rec_disc_iffs' to 'fp_sugar'
desharna
parents: 58571
diff changeset
   106
        co_rec_disc_iffs = [],
58573
04f5d23cd9e5 add 'co_rec_transfers' to 'fp_sugar'
desharna
parents: 58572
diff changeset
   107
        co_rec_selss = [],
04f5d23cd9e5 add 'co_rec_transfers' to 'fp_sugar'
desharna
parents: 58572
diff changeset
   108
        co_rec_codes = [],
58574
e66ed9634a74 add 'common_rel_co_induct' to 'fp_sugar'
desharna
parents: 58573
diff changeset
   109
        co_rec_transfers = [],
58575
629891fd8c51 add 'rel_co_inducts' to 'fp_sugar'
desharna
parents: 58574
diff changeset
   110
        common_rel_co_inducts = [],
58576
1f4a2d8142fe add 'common_set_inducts' to 'fp_sugar'
desharna
parents: 58575
diff changeset
   111
        rel_co_inducts = [],
58577
15337ad05370 add 'set_inducts' to 'fp_sugar'
desharna
parents: 58576
diff changeset
   112
        common_set_inducts = [],
15337ad05370 add 'set_inducts' to 'fp_sugar'
desharna
parents: 58576
diff changeset
   113
        set_inducts = []}}
58352
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
   114
  end;
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
   115
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
   116
fun fp_sugar_of_prod ctxt =
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
   117
  let
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
   118
    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
   119
    val fpBT = @{typ "'c * 'd"};
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
   120
    val C = @{typ 'e};
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
   121
    val X = @{typ 'prod};
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
   122
    val ctr_Ts = As;
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
   123
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
   124
    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
   125
    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
   126
    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
   127
    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
   128
    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
   129
    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
   130
  in
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
   131
    {T = fpT,
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
   132
     BT = fpBT,
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
   133
     X = X,
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
   134
     fp = Least_FP,
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
   135
     fp_res_index = 0,
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
   136
     fp_res =
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
   137
       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
   138
     pre_bnf = ID_bnf (*wrong*),
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
   139
     absT_info = trivial_absT_info_of fpT,
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
   140
     fp_nesting_bnfs = [],
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
   141
     live_nesting_bnfs = [],
58460
a88eb33058f7 refactor fp_sugar move theorems
desharna
parents: 58459
diff changeset
   142
     fp_ctr_sugar =
a88eb33058f7 refactor fp_sugar move theorems
desharna
parents: 58459
diff changeset
   143
       {ctrXs_Tss = [ctr_Ts],
a88eb33058f7 refactor fp_sugar move theorems
desharna
parents: 58459
diff changeset
   144
        ctr_defs = @{thms Pair_def_alt},
58569
3f61adcc1fc9 add 'ctr_transfers' to 'fp_sugar'
desharna
parents: 58568
diff changeset
   145
        ctr_sugar = the_frozen_ctr_sugar_of ctxt fpT_name,
58570
a3434015faf0 add 'case_transfers' to 'fp_sugar'
desharna
parents: 58569
diff changeset
   146
        ctr_transfers = [],
58571
d78b00f98de8 add 'disc_transfers' to 'fp_sugar'
desharna
parents: 58570
diff changeset
   147
        case_transfers = [],
d78b00f98de8 add 'disc_transfers' to 'fp_sugar'
desharna
parents: 58570
diff changeset
   148
        disc_transfers = []},
58459
f70bffabd7cf refactor fp_sugar move theorems
desharna
parents: 58458
diff changeset
   149
     fp_bnf_sugar =
58462
b46874f2090f refactor fp_sugar move theorems
desharna
parents: 58461
diff changeset
   150
       {map_thms = @{thms map_prod_simp},
58560
ee502a9b38aa add 'map_disc_iffs' to 'fp_sugar'
desharna
parents: 58462
diff changeset
   151
        map_disc_iffs = [],
58561
7d7473b54fe0 add 'map_sels' to 'fp_sugar'
desharna
parents: 58560
diff changeset
   152
        map_sels = [],
58462
b46874f2090f refactor fp_sugar move theorems
desharna
parents: 58461
diff changeset
   153
        rel_injects = @{thms rel_prod_apply},
58562
e94cd4f71d0c add 'rel_sels' to 'fp_sugar'
desharna
parents: 58561
diff changeset
   154
        rel_distincts = [],
58563
f5019700efa5 add 'rel_intros' to 'fp_sugar'
desharna
parents: 58562
diff changeset
   155
        rel_sels = [],
58564
778a80674112 add 'rel_cases' to 'fp_sugar'
desharna
parents: 58563
diff changeset
   156
        rel_intros = [],
58565
97cefa5ef0be add 'set_thms' to 'fp_sugar'
desharna
parents: 58564
diff changeset
   157
        rel_cases = [],
58566
62aa83edad7e add 'set_sels' to 'fp_sugar'
desharna
parents: 58565
diff changeset
   158
        set_thms = [],
58671
4cc24f1e52d5 preserve the structure of 'set_sel' theorem in ML
desharna
parents: 58665
diff changeset
   159
        set_selssss = [],
58568
727e014c6dbd add 'set_cases' to 'fp_sugar'
desharna
parents: 58567
diff changeset
   160
        set_intros = [],
727e014c6dbd add 'set_cases' to 'fp_sugar'
desharna
parents: 58567
diff changeset
   161
        set_cases = []},
58459
f70bffabd7cf refactor fp_sugar move theorems
desharna
parents: 58458
diff changeset
   162
     fp_co_induct_sugar =
58461
75ee8d49c724 refactor fp_sugar move theorems
desharna
parents: 58460
diff changeset
   163
       {co_rec = Const (@{const_name case_prod}, (ctr_Ts ---> C) --> fpT --> C),
75ee8d49c724 refactor fp_sugar move theorems
desharna
parents: 58460
diff changeset
   164
        common_co_inducts = @{thms prod.induct},
75ee8d49c724 refactor fp_sugar move theorems
desharna
parents: 58460
diff changeset
   165
        co_inducts = @{thms prod.induct},
75ee8d49c724 refactor fp_sugar move theorems
desharna
parents: 58460
diff changeset
   166
        co_rec_def = @{thm ctor_rec_def_alt[of "case_prod f" for f]},
58459
f70bffabd7cf refactor fp_sugar move theorems
desharna
parents: 58458
diff changeset
   167
        co_rec_thms = @{thms prod.case},
f70bffabd7cf refactor fp_sugar move theorems
desharna
parents: 58458
diff changeset
   168
        co_rec_discs = [],
58572
2e0cf67fa89f add 'co_rec_disc_iffs' to 'fp_sugar'
desharna
parents: 58571
diff changeset
   169
        co_rec_disc_iffs = [],
58573
04f5d23cd9e5 add 'co_rec_transfers' to 'fp_sugar'
desharna
parents: 58572
diff changeset
   170
        co_rec_selss = [],
04f5d23cd9e5 add 'co_rec_transfers' to 'fp_sugar'
desharna
parents: 58572
diff changeset
   171
        co_rec_codes = [],
58574
e66ed9634a74 add 'common_rel_co_induct' to 'fp_sugar'
desharna
parents: 58573
diff changeset
   172
        co_rec_transfers = [],
58575
629891fd8c51 add 'rel_co_inducts' to 'fp_sugar'
desharna
parents: 58574
diff changeset
   173
        common_rel_co_inducts = [],
58576
1f4a2d8142fe add 'common_set_inducts' to 'fp_sugar'
desharna
parents: 58575
diff changeset
   174
        rel_co_inducts = [],
58577
15337ad05370 add 'set_inducts' to 'fp_sugar'
desharna
parents: 58576
diff changeset
   175
        common_set_inducts = [],
15337ad05370 add 'set_inducts' to 'fp_sugar'
desharna
parents: 58576
diff changeset
   176
        set_inducts = []}}
58352
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
   177
  end;
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
   178
58665
50b229a5a097 tuned signature;
wenzelm
parents: 58585
diff changeset
   179
val _ = Theory.setup (Named_Target.theory_map (fn lthy =>
58377
c6f93b8d2d8e moved old 'size' generator together with 'old_datatype'
blanchet
parents: 58353
diff changeset
   180
  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
   181
    [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
   182
37745650a3f4 register 'prod' and 'sum' as datatypes, to allow N2M through them
blanchet
parents:
diff changeset
   183
end;