30 {prems: 'a, context: Proof.context} -> tactic |
30 {prems: 'a, context: Proof.context} -> tactic |
31 val mk_init_induct_tac: int -> thm -> thm -> thm list -> thm list -> tactic |
31 val mk_init_induct_tac: int -> thm -> thm -> thm list -> thm list -> tactic |
32 val mk_init_unique_mor_tac: int -> thm -> thm -> thm list -> thm list -> thm list -> thm list -> |
32 val mk_init_unique_mor_tac: int -> thm -> thm -> thm list -> thm list -> thm list -> thm list -> |
33 thm list -> tactic |
33 thm list -> tactic |
34 val mk_iso_alt_tac: thm list -> thm -> tactic |
34 val mk_iso_alt_tac: thm list -> thm -> tactic |
35 val mk_iter_unique_mor_tac: thm list -> thm list -> thm list -> thm -> thm -> thm -> tactic |
35 val mk_fold_unique_mor_tac: thm list -> thm list -> thm list -> thm -> thm -> thm -> tactic |
36 val mk_least_min_alg_tac: thm -> thm -> tactic |
36 val mk_least_min_alg_tac: thm -> thm -> tactic |
37 val mk_lfp_map_wpull_tac: int -> (int -> tactic) -> thm list -> thm list -> thm list list -> |
37 val mk_lfp_map_wpull_tac: int -> (int -> tactic) -> thm list -> thm list -> thm list list -> |
38 thm list list list -> thm list -> tactic |
38 thm list list list -> thm list -> tactic |
39 val mk_map_comp_tac: thm list -> thm list -> thm -> int -> tactic |
39 val mk_map_comp_tac: thm list -> thm list -> thm -> int -> tactic |
40 val mk_map_id_tac: thm list -> thm -> tactic |
40 val mk_map_id_tac: thm list -> thm -> tactic |
54 val mk_mor_comp_tac: thm -> thm list list -> thm list -> tactic |
54 val mk_mor_comp_tac: thm -> thm list list -> thm list -> tactic |
55 val mk_mor_convol_tac: 'a list -> thm -> tactic |
55 val mk_mor_convol_tac: 'a list -> thm -> tactic |
56 val mk_mor_elim_tac: thm -> tactic |
56 val mk_mor_elim_tac: thm -> tactic |
57 val mk_mor_incl_tac: thm -> thm list -> tactic |
57 val mk_mor_incl_tac: thm -> thm list -> tactic |
58 val mk_mor_inv_tac: thm -> thm -> thm list list -> thm list -> thm list -> thm list -> tactic |
58 val mk_mor_inv_tac: thm -> thm -> thm list list -> thm list -> thm list -> thm list -> tactic |
59 val mk_mor_iter_tac: ctyp -> cterm -> thm list -> thm -> thm -> tactic |
59 val mk_mor_fold_tac: ctyp -> cterm -> thm list -> thm -> thm -> tactic |
60 val mk_mor_select_tac: thm -> thm -> thm -> thm -> thm -> thm -> thm list -> thm list list -> |
60 val mk_mor_select_tac: thm -> thm -> thm -> thm -> thm -> thm -> thm list -> thm list list -> |
61 thm list -> tactic |
61 thm list -> tactic |
62 val mk_mor_str_tac: 'a list -> thm -> tactic |
62 val mk_mor_str_tac: 'a list -> thm -> tactic |
63 val mk_rec_tac: thm list -> thm -> thm list -> {prems: 'a, context: Proof.context} -> tactic |
63 val mk_rec_tac: thm list -> thm -> thm list -> {prems: 'a, context: Proof.context} -> tactic |
64 val mk_rel_simp_tac: thm list -> int -> thm -> thm -> thm -> thm -> thm list -> thm -> |
64 val mk_rel_simp_tac: thm list -> int -> thm -> thm -> thm -> thm -> thm list -> thm -> |
384 EVERY' [stac min_alg_def, rtac @{thm UN_least}, dtac least, dtac mp, atac, |
384 EVERY' [stac min_alg_def, rtac @{thm UN_least}, dtac least, dtac mp, atac, |
385 REPEAT_DETERM o etac conjE, atac] 1; |
385 REPEAT_DETERM o etac conjE, atac] 1; |
386 |
386 |
387 fun mk_alg_select_tac Abs_inverse {context = ctxt, prems = _} = |
387 fun mk_alg_select_tac Abs_inverse {context = ctxt, prems = _} = |
388 EVERY' [rtac ballI, REPEAT_DETERM o eresolve_tac [CollectE, exE, conjE], hyp_subst_tac] 1 THEN |
388 EVERY' [rtac ballI, REPEAT_DETERM o eresolve_tac [CollectE, exE, conjE], hyp_subst_tac] 1 THEN |
389 unfold_defs_tac ctxt (Abs_inverse :: fst_snd_convs) THEN atac 1; |
389 unfold_thms_tac ctxt (Abs_inverse :: fst_snd_convs) THEN atac 1; |
390 |
390 |
391 fun mk_mor_select_tac mor_def mor_cong mor_comp mor_incl_min_alg alg_def alg_select |
391 fun mk_mor_select_tac mor_def mor_cong mor_comp mor_incl_min_alg alg_def alg_select |
392 alg_sets set_natural's str_init_defs = |
392 alg_sets set_natural's str_init_defs = |
393 let |
393 let |
394 val n = length alg_sets; |
394 val n = length alg_sets; |
484 in |
484 in |
485 CONJ_WRAP' mk_induct_tac least_min_algs 1 |
485 CONJ_WRAP' mk_induct_tac least_min_algs 1 |
486 end; |
486 end; |
487 |
487 |
488 fun mk_mor_Rep_tac ctor_defs copy bijs inver_Abss inver_Reps {context = ctxt, prems = _} = |
488 fun mk_mor_Rep_tac ctor_defs copy bijs inver_Abss inver_Reps {context = ctxt, prems = _} = |
489 (K (unfold_defs_tac ctxt ctor_defs) THEN' rtac conjunct1 THEN' rtac copy THEN' |
489 (K (unfold_thms_tac ctxt ctor_defs) THEN' rtac conjunct1 THEN' rtac copy THEN' |
490 EVERY' (map (fn bij => EVERY' [rtac bij, atac, etac bexI, rtac UNIV_I]) bijs) THEN' |
490 EVERY' (map (fn bij => EVERY' [rtac bij, atac, etac bexI, rtac UNIV_I]) bijs) THEN' |
491 EVERY' (map rtac inver_Abss) THEN' |
491 EVERY' (map rtac inver_Abss) THEN' |
492 EVERY' (map rtac inver_Reps)) 1; |
492 EVERY' (map rtac inver_Reps)) 1; |
493 |
493 |
494 fun mk_mor_Abs_tac inv inver_Abss inver_Reps = |
494 fun mk_mor_Abs_tac inv inver_Abss inver_Reps = |
495 (rtac inv THEN' |
495 (rtac inv THEN' |
496 EVERY' (map2 (fn inver_Abs => fn inver_Rep => |
496 EVERY' (map2 (fn inver_Abs => fn inver_Rep => |
497 EVERY' [rtac conjI, rtac subset_UNIV, rtac conjI, rtac inver_Rep, rtac inver_Abs]) |
497 EVERY' [rtac conjI, rtac subset_UNIV, rtac conjI, rtac inver_Rep, rtac inver_Abs]) |
498 inver_Abss inver_Reps)) 1; |
498 inver_Abss inver_Reps)) 1; |
499 |
499 |
500 fun mk_mor_iter_tac cT ct iter_defs ex_mor mor = |
500 fun mk_mor_fold_tac cT ct fold_defs ex_mor mor = |
501 (EVERY' (map stac iter_defs) THEN' EVERY' [rtac rev_mp, rtac ex_mor, rtac impI] THEN' |
501 (EVERY' (map stac fold_defs) THEN' EVERY' [rtac rev_mp, rtac ex_mor, rtac impI] THEN' |
502 REPEAT_DETERM_N (length iter_defs) o etac exE THEN' |
502 REPEAT_DETERM_N (length fold_defs) o etac exE THEN' |
503 rtac (Drule.instantiate' [SOME cT] [SOME ct] @{thm someI}) THEN' etac mor) 1; |
503 rtac (Drule.instantiate' [SOME cT] [SOME ct] @{thm someI}) THEN' etac mor) 1; |
504 |
504 |
505 fun mk_iter_unique_mor_tac type_defs init_unique_mors Reps mor_comp mor_Abs mor_iter = |
505 fun mk_fold_unique_mor_tac type_defs init_unique_mors Reps mor_comp mor_Abs mor_fold = |
506 let |
506 let |
507 fun mk_unique type_def = |
507 fun mk_unique type_def = |
508 EVERY' [rtac @{thm surj_fun_eq}, rtac (type_def RS @{thm type_definition.Abs_image}), |
508 EVERY' [rtac @{thm surj_fun_eq}, rtac (type_def RS @{thm type_definition.Abs_image}), |
509 rtac ballI, resolve_tac init_unique_mors, |
509 rtac ballI, resolve_tac init_unique_mors, |
510 EVERY' (map (fn thm => atac ORELSE' rtac thm) Reps), |
510 EVERY' (map (fn thm => atac ORELSE' rtac thm) Reps), |
511 rtac mor_comp, rtac mor_Abs, atac, |
511 rtac mor_comp, rtac mor_Abs, atac, |
512 rtac mor_comp, rtac mor_Abs, rtac mor_iter]; |
512 rtac mor_comp, rtac mor_Abs, rtac mor_fold]; |
513 in |
513 in |
514 CONJ_WRAP' mk_unique type_defs 1 |
514 CONJ_WRAP' mk_unique type_defs 1 |
515 end; |
515 end; |
516 |
516 |
517 fun mk_dtor_o_ctor_tac dtor_def iterx map_comp_id map_congL ctor_o_iters = |
517 fun mk_dtor_o_ctor_tac dtor_def foldx map_comp_id map_congL ctor_o_folds = |
518 EVERY' [stac dtor_def, rtac ext, rtac trans, rtac o_apply, rtac trans, rtac iterx, |
518 EVERY' [stac dtor_def, rtac ext, rtac trans, rtac o_apply, rtac trans, rtac foldx, |
519 rtac trans, rtac map_comp_id, rtac trans, rtac map_congL, |
519 rtac trans, rtac map_comp_id, rtac trans, rtac map_congL, |
520 EVERY' (map (fn thm => rtac ballI THEN' rtac (trans OF [thm RS fun_cong, id_apply])) |
520 EVERY' (map (fn thm => rtac ballI THEN' rtac (trans OF [thm RS fun_cong, id_apply])) |
521 ctor_o_iters), |
521 ctor_o_folds), |
522 rtac sym, rtac id_apply] 1; |
522 rtac sym, rtac id_apply] 1; |
523 |
523 |
524 fun mk_rec_tac rec_defs iterx fst_recs {context = ctxt, prems = _}= |
524 fun mk_rec_tac rec_defs foldx fst_recs {context = ctxt, prems = _}= |
525 unfold_defs_tac ctxt |
525 unfold_thms_tac ctxt |
526 (rec_defs @ map (fn thm => thm RS @{thm convol_expand_snd}) fst_recs) THEN |
526 (rec_defs @ map (fn thm => thm RS @{thm convol_expand_snd}) fst_recs) THEN |
527 EVERY' [rtac trans, rtac o_apply, rtac trans, rtac (iterx RS @{thm arg_cong[of _ _ snd]}), |
527 EVERY' [rtac trans, rtac o_apply, rtac trans, rtac (foldx RS @{thm arg_cong[of _ _ snd]}), |
528 rtac @{thm snd_convol'}] 1; |
528 rtac @{thm snd_convol'}] 1; |
529 |
529 |
530 fun mk_ctor_induct_tac m set_natural'ss init_induct morEs mor_Abs Rep_invs Abs_invs Reps = |
530 fun mk_ctor_induct_tac m set_natural'ss init_induct morEs mor_Abs Rep_invs Abs_invs Reps = |
531 let |
531 let |
532 val n = length set_natural'ss; |
532 val n = length set_natural'ss; |
568 EVERY' (map2 mk_inner_induct_tac weak_ctor_inducts ks), rtac impI, |
568 EVERY' (map2 mk_inner_induct_tac weak_ctor_inducts ks), rtac impI, |
569 REPEAT_DETERM o eresolve_tac [conjE, allE], |
569 REPEAT_DETERM o eresolve_tac [conjE, allE], |
570 CONJ_WRAP' (K atac) ks] 1 |
570 CONJ_WRAP' (K atac) ks] 1 |
571 end; |
571 end; |
572 |
572 |
573 fun mk_map_tac m n iterx map_comp_id map_cong = |
573 fun mk_map_tac m n foldx map_comp_id map_cong = |
574 EVERY' [rtac ext, rtac trans, rtac o_apply, rtac trans, rtac iterx, rtac trans, rtac o_apply, |
574 EVERY' [rtac ext, rtac trans, rtac o_apply, rtac trans, rtac foldx, rtac trans, rtac o_apply, |
575 rtac trans, rtac (map_comp_id RS arg_cong), rtac trans, rtac (map_cong RS arg_cong), |
575 rtac trans, rtac (map_comp_id RS arg_cong), rtac trans, rtac (map_cong RS arg_cong), |
576 REPEAT_DETERM_N m o rtac refl, |
576 REPEAT_DETERM_N m o rtac refl, |
577 REPEAT_DETERM_N n o (EVERY' (map rtac [trans, o_apply, id_apply])), |
577 REPEAT_DETERM_N n o (EVERY' (map rtac [trans, o_apply, id_apply])), |
578 rtac sym, rtac o_apply] 1; |
578 rtac sym, rtac o_apply] 1; |
579 |
579 |
580 fun mk_map_unique_tac m mor_def iter_unique_mor map_comp_ids map_congs = |
580 fun mk_map_unique_tac m mor_def fold_unique_mor map_comp_ids map_congs = |
581 let |
581 let |
582 val n = length map_congs; |
582 val n = length map_congs; |
583 fun mk_mor (comp_id, cong) = EVERY' [rtac ballI, rtac trans, etac @{thm pointfreeE}, |
583 fun mk_mor (comp_id, cong) = EVERY' [rtac ballI, rtac trans, etac @{thm pointfreeE}, |
584 rtac sym, rtac trans, rtac o_apply, rtac trans, rtac (comp_id RS arg_cong), |
584 rtac sym, rtac trans, rtac o_apply, rtac trans, rtac (comp_id RS arg_cong), |
585 rtac (cong RS arg_cong), |
585 rtac (cong RS arg_cong), |
586 REPEAT_DETERM_N m o rtac refl, |
586 REPEAT_DETERM_N m o rtac refl, |
587 REPEAT_DETERM_N n o (EVERY' (map rtac [trans, o_apply, id_apply]))]; |
587 REPEAT_DETERM_N n o (EVERY' (map rtac [trans, o_apply, id_apply]))]; |
588 in |
588 in |
589 EVERY' [rtac iter_unique_mor, rtac ssubst, rtac mor_def, rtac conjI, |
589 EVERY' [rtac fold_unique_mor, rtac ssubst, rtac mor_def, rtac conjI, |
590 CONJ_WRAP' (K (EVERY' [rtac ballI, rtac UNIV_I])) map_congs, |
590 CONJ_WRAP' (K (EVERY' [rtac ballI, rtac UNIV_I])) map_congs, |
591 CONJ_WRAP' mk_mor (map_comp_ids ~~ map_congs)] 1 |
591 CONJ_WRAP' mk_mor (map_comp_ids ~~ map_congs)] 1 |
592 end; |
592 end; |
593 |
593 |
594 fun mk_set_tac iterx = EVERY' [rtac ext, rtac trans, rtac o_apply, |
594 fun mk_set_tac foldx = EVERY' [rtac ext, rtac trans, rtac o_apply, |
595 rtac trans, rtac iterx, rtac sym, rtac o_apply] 1; |
595 rtac trans, rtac foldx, rtac sym, rtac o_apply] 1; |
596 |
596 |
597 fun mk_set_simp_tac set set_natural' set_natural's = |
597 fun mk_set_simp_tac set set_natural' set_natural's = |
598 let |
598 let |
599 val n = length set_natural's; |
599 val n = length set_natural's; |
600 fun mk_UN thm = rtac (thm RS @{thm arg_cong[of _ _ Union]} RS trans) THEN' |
600 fun mk_UN thm = rtac (thm RS @{thm arg_cong[of _ _ Union]} RS trans) THEN' |