11 val mk_coiter_like_tac: thm list -> thm list -> thm -> thm -> thm -> Proof.context -> tactic |
11 val mk_coiter_like_tac: thm list -> thm list -> thm -> thm -> thm -> Proof.context -> tactic |
12 val mk_exhaust_tac: Proof.context -> int -> thm list -> thm -> thm -> tactic |
12 val mk_exhaust_tac: Proof.context -> int -> thm list -> thm -> thm -> tactic |
13 val mk_fld_iff_unf_tac: Proof.context -> ctyp option list -> cterm -> cterm -> thm -> thm -> |
13 val mk_fld_iff_unf_tac: Proof.context -> ctyp option list -> cterm -> cterm -> thm -> thm -> |
14 tactic |
14 tactic |
15 val mk_half_distinct_tac: Proof.context -> thm -> thm list -> tactic |
15 val mk_half_distinct_tac: Proof.context -> thm -> thm list -> tactic |
16 val mk_induct_tac: Proof.context -> int list -> int list list -> int list list -> thm list -> |
16 val mk_induct_tac: Proof.context -> int list -> int list list -> (int * int) list list list -> |
17 thm -> thm list list -> thm list -> tactic |
17 thm list -> thm -> thm list -> thm list list -> tactic |
18 val mk_inject_tac: Proof.context -> thm -> thm -> tactic |
18 val mk_inject_tac: Proof.context -> thm -> thm -> tactic |
19 val mk_iter_like_tac: thm list -> thm list -> thm list -> thm -> thm -> Proof.context -> tactic |
19 val mk_iter_like_tac: thm list -> thm list -> thm list -> thm -> thm -> Proof.context -> tactic |
20 end; |
20 end; |
21 |
21 |
22 structure BNF_FP_Sugar_Tactics : BNF_FP_SUGAR_TACTICS = |
22 structure BNF_FP_Sugar_Tactics : BNF_FP_SUGAR_TACTICS = |
110 delay them. *) |
110 delay them. *) |
111 val induct_prem_prem_thms_delayed = |
111 val induct_prem_prem_thms_delayed = |
112 @{thms fsts_def[abs_def] snds_def[abs_def] sum_setl_def[abs_def] sum_setr_def[abs_def]}; |
112 @{thms fsts_def[abs_def] snds_def[abs_def] sum_setl_def[abs_def] sum_setr_def[abs_def]}; |
113 |
113 |
114 (* TODO: Get rid of the "blast_tac" *) |
114 (* TODO: Get rid of the "blast_tac" *) |
115 fun mk_induct_discharge_prem_prems_tac ctxt r pre_set_defs set_natural's = |
115 fun mk_induct_discharge_prem_prems_tac ctxt ppis set_natural's pre_set_defs = |
116 EVERY' (maps (fn i => |
116 EVERY' (maps (fn (pp, i) => |
117 [dtac meta_spec, rotate_tac ~1, etac meta_mp, |
117 [(* ### select_prem_tac pp (dtac meta_spec) i, *) dtac meta_spec, rotate_tac ~1, etac meta_mp, |
118 SELECT_GOAL (Local_Defs.unfold_tac ctxt pre_set_defs), |
118 SELECT_GOAL (Local_Defs.unfold_tac ctxt pre_set_defs), (* ### why on a line of its own? *) |
119 SELECT_GOAL (Local_Defs.unfold_tac ctxt (set_natural's @ induct_prem_prem_thms)), |
119 SELECT_GOAL (Local_Defs.unfold_tac ctxt (set_natural's @ induct_prem_prem_thms)), |
120 SELECT_GOAL (Local_Defs.unfold_tac ctxt |
120 SELECT_GOAL (Local_Defs.unfold_tac ctxt |
121 (induct_prem_prem_thms_delayed @ induct_prem_prem_thms)), |
121 (induct_prem_prem_thms_delayed @ induct_prem_prem_thms)), |
122 TRY o rtac (mk_UnIN r i), (* FIXME: crude hack, doesn't work in the general case *) |
122 TRY o rtac (mk_UnIN pp i), (*#####*) |
123 atac ORELSE' |
123 atac ORELSE' |
124 rtac @{thm singletonI} ORELSE' |
124 rtac @{thm singletonI} ORELSE' |
125 (REPEAT_DETERM o (SELECT_GOAL (Local_Defs.unfold_tac ctxt @{thms Union_iff bex_simps(6)}) THEN' |
125 (REPEAT_DETERM o (SELECT_GOAL (Local_Defs.unfold_tac ctxt @{thms Union_iff bex_simps(6)}) THEN' |
126 etac @{thm induct_set_step}) THEN' |
126 etac @{thm induct_set_step}) THEN' |
127 (atac ORELSE' blast_tac ctxt))]) (r downto 1)) 1; |
127 (atac ORELSE' blast_tac ctxt))]) (rev ppis)) 1; |
128 |
128 |
129 fun mk_induct_discharge_prem_tac ctxt n m k r pre_set_defs set_natural's = |
129 fun mk_induct_discharge_prem_tac ctxt n set_natural's pre_set_defs m k ppis = |
130 EVERY [mk_induct_prepare_prem_tac n m k, |
130 EVERY [mk_induct_prepare_prem_tac n m k, |
131 mk_induct_prepare_prem_prems_tac r, atac 1, |
131 mk_induct_prepare_prem_prems_tac (length ppis), atac 1, |
132 mk_induct_discharge_prem_prems_tac ctxt r pre_set_defs set_natural's]; |
132 mk_induct_discharge_prem_prems_tac ctxt ppis set_natural's pre_set_defs]; |
133 |
133 |
134 fun mk_induct_tac ctxt ns mss rss ctr_defs fld_induct' pre_set_defss set_natural's = |
134 fun mk_induct_tac ctxt ns mss ppisss ctr_defs fld_induct' set_natural's pre_set_defss = |
135 let val n = Integer.sum ns in |
135 let val n = Integer.sum ns in |
136 mk_induct_prelude_tac ctxt ctr_defs fld_induct' THEN |
136 mk_induct_prelude_tac ctxt ctr_defs fld_induct' THEN |
137 EVERY (map4 (fn pre_set_defs => |
137 EVERY (map4 (EVERY oooo map3 o mk_induct_discharge_prem_tac ctxt n set_natural's) |
138 EVERY ooo map3 (fn m => fn k => fn r => |
138 pre_set_defss mss (unflat mss (1 upto n)) ppisss) |
139 mk_induct_discharge_prem_tac ctxt n m k r pre_set_defs set_natural's)) |
|
140 pre_set_defss mss (unflat mss (1 upto n)) rss) |
|
141 end; |
139 end; |
142 |
140 |
143 end; |
141 end; |