src/HOL/Codatatype/Tools/bnf_lfp_tactics.ML
changeset 49463 83ac281bcdc2
parent 49456 fa8302c8dea1
child 49488 02eb07152998
equal deleted inserted replaced
49462:9ef072c757ca 49463:83ac281bcdc2
   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),