1.1 --- a/src/HOL/Codatatype/Tools/bnf_fp_sugar_tactics.ML Fri Sep 14 21:26:01 2012 +0200
1.2 +++ b/src/HOL/Codatatype/Tools/bnf_fp_sugar_tactics.ML Fri Sep 14 22:23:10 2012 +0200
1.3 @@ -13,8 +13,8 @@
1.4 val mk_fld_iff_unf_tac: Proof.context -> ctyp option list -> cterm -> cterm -> thm -> thm ->
1.5 tactic
1.6 val mk_half_distinct_tac: Proof.context -> thm -> thm list -> tactic
1.7 - val mk_induct_tac: Proof.context -> int list -> int list list -> int list list -> thm list ->
1.8 - thm -> thm list list -> thm list -> tactic
1.9 + val mk_induct_tac: Proof.context -> int list -> int list list -> (int * int) list list list ->
1.10 + thm list -> thm -> thm list -> thm list list -> tactic
1.11 val mk_inject_tac: Proof.context -> thm -> thm -> tactic
1.12 val mk_iter_like_tac: thm list -> thm list -> thm list -> thm -> thm -> Proof.context -> tactic
1.13 end;
1.14 @@ -112,32 +112,30 @@
1.15 @{thms fsts_def[abs_def] snds_def[abs_def] sum_setl_def[abs_def] sum_setr_def[abs_def]};
1.16
1.17 (* TODO: Get rid of the "blast_tac" *)
1.18 -fun mk_induct_discharge_prem_prems_tac ctxt r pre_set_defs set_natural's =
1.19 - EVERY' (maps (fn i =>
1.20 - [dtac meta_spec, rotate_tac ~1, etac meta_mp,
1.21 - SELECT_GOAL (Local_Defs.unfold_tac ctxt pre_set_defs),
1.22 +fun mk_induct_discharge_prem_prems_tac ctxt ppis set_natural's pre_set_defs =
1.23 + EVERY' (maps (fn (pp, i) =>
1.24 + [(* ### select_prem_tac pp (dtac meta_spec) i, *) dtac meta_spec, rotate_tac ~1, etac meta_mp,
1.25 + SELECT_GOAL (Local_Defs.unfold_tac ctxt pre_set_defs), (* ### why on a line of its own? *)
1.26 SELECT_GOAL (Local_Defs.unfold_tac ctxt (set_natural's @ induct_prem_prem_thms)),
1.27 SELECT_GOAL (Local_Defs.unfold_tac ctxt
1.28 (induct_prem_prem_thms_delayed @ induct_prem_prem_thms)),
1.29 - TRY o rtac (mk_UnIN r i), (* FIXME: crude hack, doesn't work in the general case *)
1.30 + TRY o rtac (mk_UnIN pp i), (*#####*)
1.31 atac ORELSE'
1.32 rtac @{thm singletonI} ORELSE'
1.33 (REPEAT_DETERM o (SELECT_GOAL (Local_Defs.unfold_tac ctxt @{thms Union_iff bex_simps(6)}) THEN'
1.34 etac @{thm induct_set_step}) THEN'
1.35 - (atac ORELSE' blast_tac ctxt))]) (r downto 1)) 1;
1.36 + (atac ORELSE' blast_tac ctxt))]) (rev ppis)) 1;
1.37
1.38 -fun mk_induct_discharge_prem_tac ctxt n m k r pre_set_defs set_natural's =
1.39 +fun mk_induct_discharge_prem_tac ctxt n set_natural's pre_set_defs m k ppis =
1.40 EVERY [mk_induct_prepare_prem_tac n m k,
1.41 - mk_induct_prepare_prem_prems_tac r, atac 1,
1.42 - mk_induct_discharge_prem_prems_tac ctxt r pre_set_defs set_natural's];
1.43 + mk_induct_prepare_prem_prems_tac (length ppis), atac 1,
1.44 + mk_induct_discharge_prem_prems_tac ctxt ppis set_natural's pre_set_defs];
1.45
1.46 -fun mk_induct_tac ctxt ns mss rss ctr_defs fld_induct' pre_set_defss set_natural's =
1.47 +fun mk_induct_tac ctxt ns mss ppisss ctr_defs fld_induct' set_natural's pre_set_defss =
1.48 let val n = Integer.sum ns in
1.49 mk_induct_prelude_tac ctxt ctr_defs fld_induct' THEN
1.50 - EVERY (map4 (fn pre_set_defs =>
1.51 - EVERY ooo map3 (fn m => fn k => fn r =>
1.52 - mk_induct_discharge_prem_tac ctxt n m k r pre_set_defs set_natural's))
1.53 - pre_set_defss mss (unflat mss (1 upto n)) rss)
1.54 + EVERY (map4 (EVERY oooo map3 o mk_induct_discharge_prem_tac ctxt n set_natural's)
1.55 + pre_set_defss mss (unflat mss (1 upto n)) ppisss)
1.56 end;
1.57
1.58 end;