src/HOL/Codatatype/Tools/bnf_lfp_tactics.ML
changeset 49504 df9b897fb254
parent 49502 92a7c1842c78
child 49506 aeb0cc8889f2
equal deleted inserted replaced
49503:dbbde075a42e 49504:df9b897fb254
    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;
   429     REPEAT_DETERM o eresolve_tac [exE, conjE] THEN'
   429     REPEAT_DETERM o eresolve_tac [exE, conjE] THEN'
   430     REPEAT_DETERM o rtac exI THEN'
   430     REPEAT_DETERM o rtac exI THEN'
   431     rtac mor_select THEN' atac THEN' rtac CollectI THEN'
   431     rtac mor_select THEN' atac THEN' rtac CollectI THEN'
   432     REPEAT_DETERM o rtac exI THEN'
   432     REPEAT_DETERM o rtac exI THEN'
   433     rtac conjI THEN' rtac refl THEN' atac THEN'
   433     rtac conjI THEN' rtac refl THEN' atac THEN'
   434     K (unfold_defs_tac ctxt (Abs_inverse :: fst_snd_convs)) THEN'
   434     K (unfold_thms_tac ctxt (Abs_inverse :: fst_snd_convs)) THEN'
   435     etac mor_comp THEN' etac mor_incl_min_alg) 1
   435     etac mor_comp THEN' etac mor_incl_min_alg) 1
   436   end;
   436   end;
   437 
   437 
   438 fun mk_init_unique_mor_tac m
   438 fun mk_init_unique_mor_tac m
   439     alg_def alg_min_alg least_min_algs in_monos alg_sets morEs map_congs =
   439     alg_def alg_min_alg least_min_algs in_monos alg_sets morEs map_congs =
   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'