35 val mk_iso_alt_tac: thm list -> thm -> tactic |
35 val mk_iso_alt_tac: thm list -> thm -> tactic |
36 val mk_fold_unique_mor_tac: thm list -> thm list -> thm list -> thm -> thm -> thm -> tactic |
36 val mk_fold_unique_mor_tac: thm list -> thm list -> thm list -> thm -> thm -> thm -> tactic |
37 val mk_fold_transfer_tac: int -> thm -> thm list -> thm list -> |
37 val mk_fold_transfer_tac: int -> thm -> thm list -> thm list -> |
38 {prems: thm list, context: Proof.context} -> tactic |
38 {prems: thm list, context: Proof.context} -> tactic |
39 val mk_least_min_alg_tac: thm -> thm -> tactic |
39 val mk_least_min_alg_tac: thm -> thm -> tactic |
40 val mk_lfp_map_wpull_tac: Proof.context -> int -> (int -> tactic) -> thm list -> thm list -> |
40 val mk_le_rel_OO_tac: int -> thm -> thm list -> thm list -> thm list -> thm list -> |
41 thm list list -> thm list list list -> thm list -> tactic |
41 {prems: 'a, context: Proof.context} -> tactic |
42 val mk_map_comp0_tac: thm list -> thm list -> thm -> int -> tactic |
42 val mk_map_comp0_tac: thm list -> thm list -> thm -> int -> tactic |
43 val mk_map_id0_tac: thm list -> thm -> tactic |
43 val mk_map_id0_tac: thm list -> thm -> tactic |
44 val mk_map_tac: int -> int -> thm -> thm -> thm -> tactic |
44 val mk_map_tac: int -> int -> thm -> thm -> thm -> tactic |
45 val mk_ctor_map_unique_tac: thm -> thm list -> {prems: thm list, context: Proof.context} -> tactic |
45 val mk_ctor_map_unique_tac: thm -> thm list -> Proof.context -> tactic |
46 val mk_mcong_tac: (int -> tactic) -> thm list list list -> thm list -> thm list -> |
46 val mk_mcong_tac: (int -> tactic) -> thm list list list -> thm list -> thm list -> |
47 {prems: 'a, context: Proof.context} -> tactic |
47 {prems: 'a, context: Proof.context} -> tactic |
48 val mk_min_algs_card_of_tac: ctyp -> cterm -> int -> thm -> thm list -> thm list -> thm -> thm -> |
48 val mk_min_algs_card_of_tac: ctyp -> cterm -> int -> thm -> thm list -> thm list -> thm -> thm -> |
49 thm -> thm -> thm -> thm -> thm -> tactic |
49 thm -> thm -> thm -> thm -> thm -> tactic |
50 val mk_min_algs_least_tac: ctyp -> cterm -> thm -> thm list -> thm list -> tactic |
50 val mk_min_algs_least_tac: ctyp -> cterm -> thm -> thm list -> thm list -> tactic |
67 {prems: thm list, context: Proof.context} -> tactic |
67 {prems: thm list, context: Proof.context} -> tactic |
68 val mk_rec_tac: thm list -> thm -> thm list -> {prems: 'a, context: Proof.context} -> tactic |
68 val mk_rec_tac: thm list -> thm -> thm list -> {prems: 'a, context: Proof.context} -> tactic |
69 val mk_rec_unique_mor_tac: thm list -> thm list -> thm -> {prems: 'a, context: Proof.context} -> |
69 val mk_rec_unique_mor_tac: thm list -> thm list -> thm -> {prems: 'a, context: Proof.context} -> |
70 tactic |
70 tactic |
71 val mk_set_bd_tac: int -> (int -> tactic) -> thm -> thm list list -> thm list -> int -> |
71 val mk_set_bd_tac: int -> (int -> tactic) -> thm -> thm list list -> thm list -> int -> |
72 {prems: 'a, context: Proof.context} -> tactic |
72 Proof.context -> tactic |
73 val mk_set_nat_tac: int -> (int -> tactic) -> thm list list -> thm list -> cterm list -> |
73 val mk_set_nat_tac: int -> (int -> tactic) -> thm list list -> thm list -> cterm list -> |
74 thm list -> int -> {prems: 'a, context: Proof.context} -> tactic |
74 thm list -> int -> {prems: 'a, context: Proof.context} -> tactic |
75 val mk_set_map0_tac: thm -> tactic |
75 val mk_set_map0_tac: thm -> tactic |
76 val mk_set_tac: thm -> tactic |
76 val mk_set_tac: thm -> tactic |
77 val mk_wit_tac: Proof.context -> int -> thm list -> thm list -> tactic |
77 val mk_wit_tac: Proof.context -> int -> thm list -> thm list -> tactic |
78 val mk_wpull_tac: thm -> tactic |
|
79 end; |
78 end; |
80 |
79 |
81 structure BNF_LFP_Tactics : BNF_LFP_TACTICS = |
80 structure BNF_LFP_Tactics : BNF_LFP_TACTICS = |
82 struct |
81 struct |
83 |
82 |
582 rtac trans, rtac (map_comp_id RS arg_cong), rtac trans, rtac (map_cong0 RS arg_cong), |
581 rtac trans, rtac (map_comp_id RS arg_cong), rtac trans, rtac (map_cong0 RS arg_cong), |
583 REPEAT_DETERM_N m o rtac refl, |
582 REPEAT_DETERM_N m o rtac refl, |
584 REPEAT_DETERM_N n o (EVERY' (map rtac [trans, o_apply, id_apply])), |
583 REPEAT_DETERM_N n o (EVERY' (map rtac [trans, o_apply, id_apply])), |
585 rtac sym, rtac o_apply] 1; |
584 rtac sym, rtac o_apply] 1; |
586 |
585 |
587 fun mk_ctor_map_unique_tac fold_unique sym_map_comps {context = ctxt, prems = _} = |
586 fun mk_ctor_map_unique_tac fold_unique sym_map_comps ctxt = |
588 rtac fold_unique 1 THEN |
587 rtac fold_unique 1 THEN |
589 unfold_thms_tac ctxt (sym_map_comps @ @{thms o_assoc[symmetric] id_o o_id}) THEN |
588 unfold_thms_tac ctxt (sym_map_comps @ @{thms o_assoc[symmetric] id_o o_id}) THEN |
590 ALLGOALS atac; |
589 ALLGOALS atac; |
591 |
590 |
592 fun mk_set_tac foldx = EVERY' [rtac ext, rtac trans, rtac o_apply, |
591 fun mk_set_tac foldx = EVERY' [rtac ext, rtac trans, rtac o_apply, |
656 rtac sym, rtac ctor_map]; |
655 rtac sym, rtac ctor_map]; |
657 in |
656 in |
658 (induct_tac THEN' EVERY' (map3 mk_map_cong0 ctor_maps map_cong0s set_setsss)) 1 |
657 (induct_tac THEN' EVERY' (map3 mk_map_cong0 ctor_maps map_cong0s set_setsss)) 1 |
659 end; |
658 end; |
660 |
659 |
661 fun mk_lfp_map_wpull_tac ctxt m induct_tac wpulls ctor_maps ctor_setss set_setsss ctor_injects = |
660 fun mk_le_rel_OO_tac m induct ctor_nchotomys ctor_Irels rel_mono_strongs rel_OOs |
662 let |
661 {context = ctxt, prems = _} = |
663 val n = length wpulls; |
662 EVERY' (rtac induct :: |
664 val ks = 1 upto n; |
663 map4 (fn nchotomy => fn Irel => fn rel_mono => fn rel_OO => |
665 val ls = 1 upto m; |
664 EVERY' [rtac impI, etac (nchotomy RS @{thm nchotomy_relcomppE}), |
666 |
665 REPEAT_DETERM_N 2 o dtac (Irel RS iffD1), rtac (Irel RS iffD2), |
667 fun use_pass_asm thm = rtac conjI THEN' etac (thm RS subset_trans); |
666 rtac rel_mono, rtac (rel_OO RS @{thm predicate2_eqD} RS iffD2), |
668 fun use_act_asm thm = etac (thm RS subset_trans) THEN' atac; |
667 rtac @{thm relcomppI}, atac, atac, |
669 |
668 REPEAT_DETERM_N m o EVERY' [rtac ballI, rtac ballI, rtac impI, atac], |
670 fun useIH set_sets i = EVERY' [rtac ssubst, rtac @{thm wpull_def}, |
669 REPEAT_DETERM_N (length rel_OOs) o |
671 REPEAT_DETERM_N m o etac thin_rl, select_prem_tac n (dtac asm_rl) i, |
670 EVERY' [rtac ballI, rtac ballI, Goal.assume_rule_tac ctxt]]) |
672 rtac allI, rtac allI, rtac impI, REPEAT_DETERM o etac conjE, |
671 ctor_nchotomys ctor_Irels rel_mono_strongs rel_OOs) 1; |
673 REPEAT_DETERM o dtac @{thm meta_spec}, |
|
674 dtac meta_mp, atac, |
|
675 dtac meta_mp, atac, etac mp, |
|
676 rtac conjI, rtac CollectI, CONJ_WRAP' use_act_asm set_sets, |
|
677 rtac conjI, rtac CollectI, CONJ_WRAP' use_act_asm set_sets, |
|
678 atac]; |
|
679 |
|
680 fun mk_subset thm = EVERY' [rtac ord_eq_le_trans, rtac thm, rtac @{thm Un_least}, atac, |
|
681 REPEAT_DETERM_N (n - 1) o rtac @{thm Un_least}, |
|
682 REPEAT_DETERM_N n o |
|
683 EVERY' [rtac @{thm UN_least}, rtac CollectE, etac set_rev_mp, atac, |
|
684 REPEAT_DETERM o etac conjE, atac]]; |
|
685 |
|
686 fun mk_wpull wpull ctor_map ctor_sets set_setss ctor_inject = |
|
687 EVERY' [rtac impI, REPEAT_DETERM o eresolve_tac [CollectE, conjE], |
|
688 rtac rev_mp, rtac wpull, |
|
689 EVERY' (map (fn i => REPEAT_DETERM_N (i - 1) o etac thin_rl THEN' atac) ls), |
|
690 EVERY' (map2 useIH (transpose (map tl set_setss)) ks), |
|
691 rtac impI, REPEAT_DETERM_N (m + n) o etac thin_rl, |
|
692 dtac @{thm subst[OF wpull_def, of "%x. x"]}, etac allE, etac allE, etac impE, |
|
693 rtac conjI, rtac CollectI, EVERY' (map (use_pass_asm o hd) set_setss), |
|
694 CONJ_WRAP' (K (rtac subset_refl)) ks, |
|
695 rtac conjI, rtac CollectI, EVERY' (map (use_pass_asm o hd) set_setss), |
|
696 CONJ_WRAP' (K (rtac subset_refl)) ks, |
|
697 rtac subst, rtac ctor_inject, rtac trans, rtac sym, rtac ctor_map, |
|
698 rtac trans, atac, rtac ctor_map, REPEAT_DETERM o eresolve_tac [CollectE, conjE, bexE], |
|
699 hyp_subst_tac ctxt, rtac bexI, rtac conjI, rtac ctor_map, rtac ctor_map, rtac CollectI, |
|
700 CONJ_WRAP' mk_subset ctor_sets]; |
|
701 in |
|
702 (induct_tac THEN' EVERY' (map5 mk_wpull wpulls ctor_maps ctor_setss set_setsss ctor_injects)) 1 |
|
703 end; |
|
704 |
672 |
705 (* BNF tactics *) |
673 (* BNF tactics *) |
706 |
674 |
707 fun mk_map_id0_tac map_id0s unique = |
675 fun mk_map_id0_tac map_id0s unique = |
708 (rtac sym THEN' rtac unique THEN' |
676 (rtac sym THEN' rtac unique THEN' |
727 fun mk_set_map0_tac set_nat = |
695 fun mk_set_map0_tac set_nat = |
728 EVERY' (map rtac [ext, trans, o_apply, sym, trans, o_apply, set_nat]) 1; |
696 EVERY' (map rtac [ext, trans, o_apply, sym, trans, o_apply, set_nat]) 1; |
729 |
697 |
730 fun mk_bd_card_order_tac bd_card_orders = |
698 fun mk_bd_card_order_tac bd_card_orders = |
731 CONJ_WRAP_GEN' (rtac @{thm card_order_csum}) rtac bd_card_orders 1; |
699 CONJ_WRAP_GEN' (rtac @{thm card_order_csum}) rtac bd_card_orders 1; |
732 |
|
733 fun mk_wpull_tac wpull = |
|
734 EVERY' [rtac ssubst, rtac @{thm wpull_def}, rtac allI, rtac allI, |
|
735 rtac wpull, REPEAT_DETERM o atac] 1; |
|
736 |
700 |
737 fun mk_wit_tac ctxt n ctor_set wit = |
701 fun mk_wit_tac ctxt n ctor_set wit = |
738 REPEAT_DETERM (atac 1 ORELSE |
702 REPEAT_DETERM (atac 1 ORELSE |
739 EVERY' [dtac set_rev_mp, rtac equalityD1, resolve_tac ctor_set, |
703 EVERY' [dtac set_rev_mp, rtac equalityD1, resolve_tac ctor_set, |
740 REPEAT_DETERM o |
704 REPEAT_DETERM o |