src/HOL/Codatatype/Tools/bnf_fp_sugar_tactics.ML
changeset 50390 993677c1cf2a
parent 50387 c62165188971
child 50391 c6366fd0415a
     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;