src/HOL/BNF/Tools/bnf_lfp_tactics.ML
changeset 54841 af71b753c459
parent 54793 c99f0fdb0886
child 54998 8601434fa334
equal deleted inserted replaced
54840:fac0c76bbda2 54841:af71b753c459
    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,
   622         EVERY' (map useIH (drop m set_nats))];
   621         EVERY' (map useIH (drop m set_nats))];
   623   in
   622   in
   624     (induct_tac THEN' EVERY' (map4 mk_set_nat csets ctor_maps ctor_sets set_mapss)) 1
   623     (induct_tac THEN' EVERY' (map4 mk_set_nat csets ctor_maps ctor_sets set_mapss)) 1
   625   end;
   624   end;
   626 
   625 
   627 fun mk_set_bd_tac m induct_tac bd_Cinfinite set_bdss ctor_sets i {context = ctxt, prems = _} =
   626 fun mk_set_bd_tac m induct_tac bd_Cinfinite set_bdss ctor_sets i ctxt =
   628   let
   627   let
   629     val n = length ctor_sets;
   628     val n = length ctor_sets;
   630 
   629 
   631     fun useIH set_bd = EVERY' [rtac @{thm UNION_Cinfinite_bound}, rtac set_bd, rtac ballI,
   630     fun useIH set_bd = EVERY' [rtac @{thm UNION_Cinfinite_bound}, rtac set_bd, rtac ballI,
   632       Goal.assume_rule_tac ctxt, rtac bd_Cinfinite];
   631       Goal.assume_rule_tac ctxt, rtac bd_Cinfinite];
   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