25 val empty = Symtab.empty; |
30 val empty = Symtab.empty; |
26 val extend = I |
31 val extend = I |
27 fun merge data = Symtab.merge (K true) data; |
32 fun merge data = Symtab.merge (K true) data; |
28 ); |
33 ); |
29 |
34 |
|
35 fun register_size T_name size_name size_simps size_o_maps = |
|
36 Data.map (Symtab.update_new (T_name, (size_name, (size_simps, size_o_maps)))); |
|
37 |
30 val zero_nat = @{const zero_class.zero (nat)}; |
38 val zero_nat = @{const zero_class.zero (nat)}; |
31 |
39 |
32 fun mk_plus_nat (t1, t2) = Const (@{const_name Groups.plus}, |
40 fun mk_plus_nat (t1, t2) = Const (@{const_name Groups.plus}, |
33 HOLogic.natT --> HOLogic.natT --> HOLogic.natT) $ t1 $ t2; |
41 HOLogic.natT --> HOLogic.natT --> HOLogic.natT) $ t1 $ t2; |
34 |
42 |
50 HEADGOAL (rtac (ctor_rec_o_map RS trans) THEN' |
58 HEADGOAL (rtac (ctor_rec_o_map RS trans) THEN' |
51 K (PRIMITIVE (Conv.fconv_rule Thm.eta_long_conversion)) THEN' asm_simp_tac |
59 K (PRIMITIVE (Conv.fconv_rule Thm.eta_long_conversion)) THEN' asm_simp_tac |
52 (ss_only (pre_map_defs @ distinct Thm.eq_thm_prop abs_inverses @ rec_o_map_simp_thms) ctxt)); |
60 (ss_only (pre_map_defs @ distinct Thm.eq_thm_prop abs_inverses @ rec_o_map_simp_thms) ctxt)); |
53 |
61 |
54 val size_o_map_simp_thms = |
62 val size_o_map_simp_thms = |
55 @{thms o_apply prod_inj_map inj_on_id snd_comp_apfst[unfolded apfst_def]}; |
63 @{thms prod_inj_map inj_on_id snd_comp_apfst[unfolded apfst_def]}; |
56 |
64 |
57 fun mk_size_o_map_tac ctxt size_def rec_o_map inj_maps size_maps = |
65 fun mk_size_o_map_tac ctxt size_def rec_o_map inj_maps size_maps = |
58 unfold_thms_tac ctxt [size_def] THEN |
66 unfold_thms_tac ctxt [size_def] THEN |
59 HEADGOAL (rtac (rec_o_map RS trans) THEN' |
67 HEADGOAL (rtac (rec_o_map RS trans) THEN' |
60 asm_simp_tac (ss_only (inj_maps @ size_maps @ size_o_map_simp_thms) ctxt)); |
68 asm_simp_tac (ss_only (inj_maps @ size_maps @ size_o_map_simp_thms) ctxt)) THEN |
|
69 IF_UNSOLVED (unfold_thms_tac ctxt [o_apply] THEN HEADGOAL (rtac refl)); |
61 |
70 |
62 fun generate_size (fp_sugars as ({T = Type (_, As), BT = Type (_, Bs), fp = Least_FP, |
71 fun generate_size (fp_sugars as ({T = Type (_, As), BT = Type (_, Bs), fp = Least_FP, |
63 fp_res = {bnfs = fp_bnfs, xtor_co_rec_o_map_thms = ctor_rec_o_maps, ...}, nested_bnfs, ...} |
72 fp_res = {bnfs = fp_bnfs, xtor_co_rec_o_map_thms = ctor_rec_o_maps, ...}, nested_bnfs, ...} |
64 : fp_sugar) :: _) thy = |
73 : fp_sugar) :: _) thy = |
65 let |
74 let |