388 EVERY' [stac min_alg_def, rtac @{thm UN_least}, dtac least, dtac mp, atac, |
388 EVERY' [stac min_alg_def, rtac @{thm UN_least}, dtac least, dtac mp, atac, |
389 REPEAT_DETERM o etac conjE, atac] 1; |
389 REPEAT_DETERM o etac conjE, atac] 1; |
390 |
390 |
391 fun mk_alg_select_tac Abs_inverse {context = ctxt, prems = _} = |
391 fun mk_alg_select_tac Abs_inverse {context = ctxt, prems = _} = |
392 EVERY' [rtac ballI, REPEAT_DETERM o eresolve_tac [CollectE, exE, conjE], hyp_subst_tac] 1 THEN |
392 EVERY' [rtac ballI, REPEAT_DETERM o eresolve_tac [CollectE, exE, conjE], hyp_subst_tac] 1 THEN |
393 Local_Defs.unfold_tac ctxt (Abs_inverse :: fst_snd_convs) THEN atac 1; |
393 unfold_defs_tac ctxt (Abs_inverse :: fst_snd_convs) THEN atac 1; |
394 |
394 |
395 fun mk_mor_select_tac mor_def mor_cong mor_comp mor_incl_min_alg alg_def alg_select |
395 fun mk_mor_select_tac mor_def mor_cong mor_comp mor_incl_min_alg alg_def alg_select |
396 alg_sets set_natural's str_init_defs = |
396 alg_sets set_natural's str_init_defs = |
397 let |
397 let |
398 val n = length alg_sets; |
398 val n = length alg_sets; |
433 REPEAT_DETERM o eresolve_tac [exE, conjE] THEN' |
433 REPEAT_DETERM o eresolve_tac [exE, conjE] THEN' |
434 REPEAT_DETERM o rtac exI THEN' |
434 REPEAT_DETERM o rtac exI THEN' |
435 rtac mor_select THEN' atac THEN' rtac CollectI THEN' |
435 rtac mor_select THEN' atac THEN' rtac CollectI THEN' |
436 REPEAT_DETERM o rtac exI THEN' |
436 REPEAT_DETERM o rtac exI THEN' |
437 rtac conjI THEN' rtac refl THEN' atac THEN' |
437 rtac conjI THEN' rtac refl THEN' atac THEN' |
438 K (Local_Defs.unfold_tac ctxt (Abs_inverse :: fst_snd_convs)) THEN' |
438 K (unfold_defs_tac ctxt (Abs_inverse :: fst_snd_convs)) THEN' |
439 etac mor_comp THEN' etac mor_incl_min_alg) 1 |
439 etac mor_comp THEN' etac mor_incl_min_alg) 1 |
440 end; |
440 end; |
441 |
441 |
442 fun mk_init_unique_mor_tac m |
442 fun mk_init_unique_mor_tac m |
443 alg_def alg_min_alg least_min_algs in_monos alg_sets morEs map_congs = |
443 alg_def alg_min_alg least_min_algs in_monos alg_sets morEs map_congs = |
488 in |
488 in |
489 CONJ_WRAP' mk_induct_tac least_min_algs 1 |
489 CONJ_WRAP' mk_induct_tac least_min_algs 1 |
490 end; |
490 end; |
491 |
491 |
492 fun mk_mor_Rep_tac fld_defs copy bijs inver_Abss inver_Reps {context = ctxt, prems = _} = |
492 fun mk_mor_Rep_tac fld_defs copy bijs inver_Abss inver_Reps {context = ctxt, prems = _} = |
493 (K (Local_Defs.unfold_tac ctxt fld_defs) THEN' rtac conjunct1 THEN' rtac copy THEN' |
493 (K (unfold_defs_tac ctxt fld_defs) THEN' rtac conjunct1 THEN' rtac copy THEN' |
494 EVERY' (map (fn bij => EVERY' [rtac bij, atac, etac bexI, rtac UNIV_I]) bijs) THEN' |
494 EVERY' (map (fn bij => EVERY' [rtac bij, atac, etac bexI, rtac UNIV_I]) bijs) THEN' |
495 EVERY' (map rtac inver_Abss) THEN' |
495 EVERY' (map rtac inver_Abss) THEN' |
496 EVERY' (map rtac inver_Reps)) 1; |
496 EVERY' (map rtac inver_Reps)) 1; |
497 |
497 |
498 fun mk_mor_Abs_tac inv inver_Abss inver_Reps = |
498 fun mk_mor_Abs_tac inv inver_Abss inver_Reps = |
524 EVERY' (map (fn thm => rtac ballI THEN' rtac (trans OF [thm RS fun_cong, id_apply])) |
524 EVERY' (map (fn thm => rtac ballI THEN' rtac (trans OF [thm RS fun_cong, id_apply])) |
525 fld_o_iters), |
525 fld_o_iters), |
526 rtac sym, rtac id_apply] 1; |
526 rtac sym, rtac id_apply] 1; |
527 |
527 |
528 fun mk_rec_tac rec_defs iter fst_recs {context = ctxt, prems = _}= |
528 fun mk_rec_tac rec_defs iter fst_recs {context = ctxt, prems = _}= |
529 Local_Defs.unfold_tac ctxt |
529 unfold_defs_tac ctxt |
530 (rec_defs @ map (fn thm => thm RS @{thm convol_expand_snd}) fst_recs) THEN |
530 (rec_defs @ map (fn thm => thm RS @{thm convol_expand_snd}) fst_recs) THEN |
531 EVERY' [rtac trans, rtac o_apply, rtac trans, rtac (iter RS @{thm arg_cong[of _ _ snd]}), |
531 EVERY' [rtac trans, rtac o_apply, rtac trans, rtac (iter RS @{thm arg_cong[of _ _ snd]}), |
532 rtac @{thm snd_convol'}] 1; |
532 rtac @{thm snd_convol'}] 1; |
533 |
533 |
534 fun mk_fld_induct_tac m set_natural'ss init_induct morEs mor_Abs Rep_invs Abs_invs Reps = |
534 fun mk_fld_induct_tac m set_natural'ss init_induct morEs mor_Abs Rep_invs Abs_invs Reps = |
811 EVERY' [dtac (in_rel RS iffD1), REPEAT_DETERM o eresolve_tac [exE, conjE, CollectE], |
811 EVERY' [dtac (in_rel RS iffD1), REPEAT_DETERM o eresolve_tac [exE, conjE, CollectE], |
812 rtac (in_Irel RS iffD2), rtac exI, rtac conjI, rtac CollectI, |
812 rtac (in_Irel RS iffD2), rtac exI, rtac conjI, rtac CollectI, |
813 CONJ_WRAP' (fn (set_simp, passive_set_natural) => |
813 CONJ_WRAP' (fn (set_simp, passive_set_natural) => |
814 EVERY' [rtac ord_eq_le_trans, rtac set_simp, rtac @{thm Un_least}, |
814 EVERY' [rtac ord_eq_le_trans, rtac set_simp, rtac @{thm Un_least}, |
815 rtac ord_eq_le_trans, rtac @{thm box_equals[OF _ refl]}, |
815 rtac ord_eq_le_trans, rtac @{thm box_equals[OF _ refl]}, |
816 rtac passive_set_natural, rtac trans_fun_cong_image_id_id_apply, |
816 rtac passive_set_natural, rtac trans_fun_cong_image_id_id_apply, atac, |
817 atac, |
|
818 CONJ_WRAP_GEN' (rtac (Thm.permute_prems 0 1 @{thm Un_least})) |
817 CONJ_WRAP_GEN' (rtac (Thm.permute_prems 0 1 @{thm Un_least})) |
819 (fn (active_set_natural, in_Irel) => EVERY' [rtac ord_eq_le_trans, |
818 (fn (active_set_natural, in_Irel) => EVERY' [rtac ord_eq_le_trans, |
820 rtac @{thm UN_cong[OF _ refl]}, rtac active_set_natural, rtac @{thm UN_least}, |
819 rtac @{thm UN_cong[OF _ refl]}, rtac active_set_natural, rtac @{thm UN_least}, |
821 dtac set_rev_mp, etac @{thm image_mono}, etac imageE, |
820 dtac set_rev_mp, etac @{thm image_mono}, etac imageE, |
822 dtac @{thm ssubst_mem[OF pair_collapse]}, dtac (in_Irel RS iffD1), |
821 dtac @{thm ssubst_mem[OF pair_collapse]}, dtac (in_Irel RS iffD1), |