src/HOL/Tools/BNF/bnf_fp_def_sugar_tactics.ML
changeset 57525 f9dd8a33f820
parent 57471 11cd462e31ec
child 57528 9afc832252a3
equal deleted inserted replaced
57524:b8448367f9c7 57525:f9dd8a33f820
    24   val mk_induct_tac: Proof.context -> int -> int list -> int list list -> int list list list ->
    24   val mk_induct_tac: Proof.context -> int -> int list -> int list list -> int list list list ->
    25     thm list -> thm -> thm list -> thm list -> thm list -> thm list list -> tactic
    25     thm list -> thm -> thm list -> thm list -> thm list -> thm list list -> tactic
    26   val mk_inject_tac: Proof.context -> thm -> thm -> thm -> tactic
    26   val mk_inject_tac: Proof.context -> thm -> thm -> thm -> tactic
    27   val mk_rec_tac: thm list -> thm list -> thm list -> thm -> thm -> thm -> thm -> Proof.context ->
    27   val mk_rec_tac: thm list -> thm list -> thm list -> thm -> thm -> thm -> thm -> Proof.context ->
    28     tactic
    28     tactic
       
    29   val mk_rel_cases_tac:  Proof.context -> cterm -> cterm -> thm -> thm list -> thm list ->
       
    30     thm list -> thm list -> tactic
    29   val mk_rel_coinduct0_tac: Proof.context -> thm -> cterm list -> thm list -> thm list ->
    31   val mk_rel_coinduct0_tac: Proof.context -> thm -> cterm list -> thm list -> thm list ->
    30     thm list list -> thm list list -> thm list list -> thm list -> thm list -> thm list ->
    32     thm list list -> thm list list -> thm list list -> thm list -> thm list -> thm list ->
    31     thm list -> thm list -> thm list -> tactic
    33     thm list -> thm list -> thm list -> tactic
    32   val mk_rel_induct0_tac: Proof.context -> thm -> thm list -> cterm list -> thm list ->
    34   val mk_rel_induct0_tac: Proof.context -> thm -> thm list -> cterm list -> thm list ->
    33     thm list list -> thm list -> thm list -> thm list -> thm list -> tactic
    35     thm list list -> thm list -> thm list -> thm list -> thm list -> tactic
   208     dtor_ctors exhausts ctr_defss discsss selsss =
   210     dtor_ctors exhausts ctr_defss discsss selsss =
   209   HEADGOAL (rtac dtor_coinduct' THEN'
   211   HEADGOAL (rtac dtor_coinduct' THEN'
   210     EVERY' (map10 (mk_coinduct_discharge_prem_tac ctxt rel_eqs' nn)
   212     EVERY' (map10 (mk_coinduct_discharge_prem_tac ctxt rel_eqs' nn)
   211       (1 upto nn) ns pre_rel_defs fp_abs_inverses abs_inverses dtor_ctors exhausts ctr_defss discsss
   213       (1 upto nn) ns pre_rel_defs fp_abs_inverses abs_inverses dtor_ctors exhausts ctr_defss discsss
   212       selsss));
   214       selsss));
       
   215 
       
   216 fun mk_rel_cases_tac ctxt ct1 ct2 exhaust injects rel_injects distincts rel_distincts =
       
   217   HEADGOAL (rtac (cterm_instantiate_pos [SOME ct1] exhaust) THEN_ALL_NEW
       
   218     rtac (cterm_instantiate_pos [SOME ct2] exhaust) THEN_ALL_NEW
       
   219       hyp_subst_tac ctxt) THEN
       
   220   Local_Defs.unfold_tac ctxt (injects @ rel_injects @ @{thms conj_imp_eq_imp_imp simp_thms(6)
       
   221     True_implies_equals conj_imp_eq_imp_imp} @
       
   222     map (fn thm => iffD2 OF [@{thm eq_False}, thm]) (distincts @ rel_distincts) @
       
   223     map (fn thm => thm RS @{thm eqTrueI}) rel_injects) THEN
       
   224   TRYALL (atac ORELSE' etac FalseE ORELSE' (REPEAT_DETERM o dtac @{thm meta_spec} THEN'
       
   225     REPEAT_DETERM o (dtac @{thm meta_mp} THEN' rtac refl) THEN' Goal.assume_rule_tac ctxt));
   213 
   226 
   214 fun mk_rel_coinduct0_tac ctxt dtor_rel_coinduct cts assms exhausts discss selss ctor_defss
   227 fun mk_rel_coinduct0_tac ctxt dtor_rel_coinduct cts assms exhausts discss selss ctor_defss
   215   dtor_ctors ctor_injects abs_injects rel_pre_defs abs_inverses nesting_rel_eqs =
   228   dtor_ctors ctor_injects abs_injects rel_pre_defs abs_inverses nesting_rel_eqs =
   216   rtac dtor_rel_coinduct 1 THEN
   229   rtac dtor_rel_coinduct 1 THEN
   217   EVERY (map11 (fn ct => fn assm => fn exhaust => fn discs => fn sels => fn ctor_defs =>
   230   EVERY (map11 (fn ct => fn assm => fn exhaust => fn discs => fn sels => fn ctor_defs =>