src/HOL/Codatatype/Tools/bnf_fp_sugar_tactics.ML
changeset 49375 993677c1cf2a
parent 49372 c62165188971
child 49376 c6366fd0415a
equal deleted inserted replaced
49374:b08c6312782b 49375:993677c1cf2a
    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;