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 => |