src/HOL/Codatatype/Tools/bnf_comp_tactics.ML
changeset 49304 6964373dd6ac
parent 49284 5f39b7940b49
child 49305 8241f21d104b
equal deleted inserted replaced
49303:c87930fb5b90 49304:6964373dd6ac
    17   val mk_comp_set_alt_tac: Proof.context -> thm -> tactic
    17   val mk_comp_set_alt_tac: Proof.context -> thm -> tactic
    18   val mk_comp_set_bd_tac: Proof.context -> thm -> thm list -> tactic
    18   val mk_comp_set_bd_tac: Proof.context -> thm -> thm list -> tactic
    19   val mk_comp_set_natural_tac: thm -> thm -> thm -> thm list -> tactic
    19   val mk_comp_set_natural_tac: thm -> thm -> thm -> thm list -> tactic
    20   val mk_comp_wit_tac: Proof.context -> thm list -> thm -> thm list -> tactic
    20   val mk_comp_wit_tac: Proof.context -> thm list -> thm -> thm list -> tactic
    21 
    21 
    22   val mk_killN_bd_card_order_tac: int -> thm -> tactic
    22   val mk_kill_bd_card_order_tac: int -> thm -> tactic
    23   val mk_killN_bd_cinfinite_tac: thm -> tactic
    23   val mk_kill_bd_cinfinite_tac: thm -> tactic
    24   val killN_in_alt_tac: tactic
    24   val kill_in_alt_tac: tactic
    25   val mk_killN_in_bd_tac: int -> bool -> thm -> thm -> thm -> thm -> thm -> tactic
    25   val mk_kill_in_bd_tac: int -> bool -> thm -> thm -> thm -> thm -> thm -> tactic
    26   val mk_killN_map_cong_tac: Proof.context -> int -> int -> thm -> tactic
    26   val mk_kill_map_cong_tac: Proof.context -> int -> int -> thm -> tactic
    27   val mk_killN_set_bd_tac: thm -> thm -> tactic
    27   val mk_kill_set_bd_tac: thm -> thm -> tactic
    28 
    28 
    29   val empty_natural_tac: tactic
    29   val empty_natural_tac: tactic
    30   val liftN_in_alt_tac: tactic
    30   val lift_in_alt_tac: tactic
    31   val mk_liftN_in_bd_tac: int -> thm -> thm -> thm -> tactic
    31   val mk_lift_in_bd_tac: int -> thm -> thm -> thm -> tactic
    32   val mk_liftN_set_bd_tac: thm -> tactic
    32   val mk_lift_set_bd_tac: thm -> tactic
    33 
    33 
    34   val mk_permute_in_alt_tac: ''a list -> ''a list -> tactic
    34   val mk_permute_in_alt_tac: ''a list -> ''a list -> tactic
    35   val mk_permute_in_bd_tac: ''a list -> ''a list -> thm -> thm -> thm -> tactic
    35   val mk_permute_in_bd_tac: ''a list -> ''a list -> thm -> thm -> thm -> tactic
    36 
    36 
    37   val mk_map_wpull_tac: thm -> thm list -> thm -> tactic
    37   val mk_map_wpull_tac: thm -> thm list -> thm -> tactic
   218 
   218 
   219 
   219 
   220 
   220 
   221 (* Kill operation *)
   221 (* Kill operation *)
   222 
   222 
   223 fun mk_killN_map_cong_tac ctxt n m map_cong =
   223 fun mk_kill_map_cong_tac ctxt n m map_cong =
   224   (rtac map_cong THEN' EVERY' (replicate n (rtac refl)) THEN'
   224   (rtac map_cong THEN' EVERY' (replicate n (rtac refl)) THEN'
   225     EVERY' (replicate m (Goal.assume_rule_tac ctxt))) 1;
   225     EVERY' (replicate m (Goal.assume_rule_tac ctxt))) 1;
   226 
   226 
   227 fun mk_killN_bd_card_order_tac n bd_card_order =
   227 fun mk_kill_bd_card_order_tac n bd_card_order =
   228   (rtac @{thm card_order_cprod} THEN'
   228   (rtac @{thm card_order_cprod} THEN'
   229   K (REPEAT_DETERM_N (n - 1)
   229   K (REPEAT_DETERM_N (n - 1)
   230     ((rtac @{thm card_order_csum} THEN'
   230     ((rtac @{thm card_order_csum} THEN'
   231     rtac @{thm card_of_card_order_on}) 1)) THEN'
   231     rtac @{thm card_of_card_order_on}) 1)) THEN'
   232   rtac @{thm card_of_card_order_on} THEN'
   232   rtac @{thm card_of_card_order_on} THEN'
   233   rtac bd_card_order) 1;
   233   rtac bd_card_order) 1;
   234 
   234 
   235 fun mk_killN_bd_cinfinite_tac bd_Cinfinite =
   235 fun mk_kill_bd_cinfinite_tac bd_Cinfinite =
   236   (rtac @{thm cinfinite_cprod2} THEN'
   236   (rtac @{thm cinfinite_cprod2} THEN'
   237   TRY o rtac @{thm csum_Cnotzero1} THEN'
   237   TRY o rtac @{thm csum_Cnotzero1} THEN'
   238   rtac @{thm Cnotzero_UNIV} THEN'
   238   rtac @{thm Cnotzero_UNIV} THEN'
   239   rtac bd_Cinfinite) 1;
   239   rtac bd_Cinfinite) 1;
   240 
   240 
   241 fun mk_killN_set_bd_tac bd_Card_order set_bd =
   241 fun mk_kill_set_bd_tac bd_Card_order set_bd =
   242   (rtac ctrans THEN'
   242   (rtac ctrans THEN'
   243   rtac set_bd THEN'
   243   rtac set_bd THEN'
   244   rtac @{thm ordLeq_cprod2} THEN'
   244   rtac @{thm ordLeq_cprod2} THEN'
   245   TRY o rtac @{thm csum_Cnotzero1} THEN'
   245   TRY o rtac @{thm csum_Cnotzero1} THEN'
   246   rtac @{thm Cnotzero_UNIV} THEN'
   246   rtac @{thm Cnotzero_UNIV} THEN'
   247   rtac bd_Card_order) 1
   247   rtac bd_Card_order) 1
   248 
   248 
   249 val killN_in_alt_tac =
   249 val kill_in_alt_tac =
   250   ((rtac @{thm Collect_cong} THEN' rtac @{thm iffI}) 1 THEN
   250   ((rtac @{thm Collect_cong} THEN' rtac @{thm iffI}) 1 THEN
   251   REPEAT_DETERM (CHANGED (etac conjE 1)) THEN
   251   REPEAT_DETERM (CHANGED (etac conjE 1)) THEN
   252   REPEAT_DETERM (CHANGED ((etac conjI ORELSE'
   252   REPEAT_DETERM (CHANGED ((etac conjI ORELSE'
   253     rtac conjI THEN' rtac @{thm subset_UNIV}) 1)) THEN
   253     rtac conjI THEN' rtac @{thm subset_UNIV}) 1)) THEN
   254   (rtac @{thm subset_UNIV} ORELSE' atac) 1 THEN
   254   (rtac @{thm subset_UNIV} ORELSE' atac) 1 THEN
   255   REPEAT_DETERM (CHANGED (etac conjE 1)) THEN
   255   REPEAT_DETERM (CHANGED (etac conjE 1)) THEN
   256   REPEAT_DETERM (CHANGED ((etac conjI ORELSE' atac) 1))) ORELSE
   256   REPEAT_DETERM (CHANGED ((etac conjI ORELSE' atac) 1))) ORELSE
   257   ((rtac @{thm UNIV_eq_I} THEN' rtac CollectI) 1 THEN
   257   ((rtac @{thm UNIV_eq_I} THEN' rtac CollectI) 1 THEN
   258     REPEAT_DETERM (TRY (rtac conjI 1) THEN rtac @{thm subset_UNIV} 1));
   258     REPEAT_DETERM (TRY (rtac conjI 1) THEN rtac @{thm subset_UNIV} 1));
   259 
   259 
   260 fun mk_killN_in_bd_tac n nontrivial_killN_in in_alt in_bd bd_Card_order bd_Cinfinite bd_Cnotzero =
   260 fun mk_kill_in_bd_tac n nontrivial_kill_in in_alt in_bd bd_Card_order bd_Cinfinite bd_Cnotzero =
   261   (rtac @{thm ordIso_ordLeq_trans} THEN'
   261   (rtac @{thm ordIso_ordLeq_trans} THEN'
   262   rtac @{thm card_of_ordIso_subst} THEN'
   262   rtac @{thm card_of_ordIso_subst} THEN'
   263   rtac in_alt THEN'
   263   rtac in_alt THEN'
   264   rtac ctrans THEN'
   264   rtac ctrans THEN'
   265   rtac in_bd THEN'
   265   rtac in_bd THEN'
   266   rtac @{thm ordIso_ordLeq_trans} THEN'
   266   rtac @{thm ordIso_ordLeq_trans} THEN'
   267   rtac @{thm cexp_cong1}) 1 THEN
   267   rtac @{thm cexp_cong1}) 1 THEN
   268   (if nontrivial_killN_in then
   268   (if nontrivial_kill_in then
   269     rtac @{thm ordIso_transitive} 1 THEN
   269     rtac @{thm ordIso_transitive} 1 THEN
   270     REPEAT_DETERM_N (n - 1)
   270     REPEAT_DETERM_N (n - 1)
   271       ((rtac @{thm csum_cong1} THEN'
   271       ((rtac @{thm csum_cong1} THEN'
   272       rtac @{thm ordIso_symmetric} THEN'
   272       rtac @{thm ordIso_symmetric} THEN'
   273       rtac @{thm csum_assoc} THEN'
   273       rtac @{thm csum_assoc} THEN'
   331 
   331 
   332 (* Lift operation *)
   332 (* Lift operation *)
   333 
   333 
   334 val empty_natural_tac = rtac @{thm empty_natural} 1;
   334 val empty_natural_tac = rtac @{thm empty_natural} 1;
   335 
   335 
   336 fun mk_liftN_set_bd_tac bd_Card_order = (rtac @{thm Card_order_empty} THEN' rtac bd_Card_order) 1;
   336 fun mk_lift_set_bd_tac bd_Card_order = (rtac @{thm Card_order_empty} THEN' rtac bd_Card_order) 1;
   337 
   337 
   338 val liftN_in_alt_tac =
   338 val lift_in_alt_tac =
   339   ((rtac @{thm Collect_cong} THEN' rtac @{thm iffI}) 1 THEN
   339   ((rtac @{thm Collect_cong} THEN' rtac @{thm iffI}) 1 THEN
   340   REPEAT_DETERM (CHANGED (etac conjE 1)) THEN
   340   REPEAT_DETERM (CHANGED (etac conjE 1)) THEN
   341   REPEAT_DETERM (CHANGED ((etac conjI ORELSE' atac) 1)) THEN
   341   REPEAT_DETERM (CHANGED ((etac conjI ORELSE' atac) 1)) THEN
   342   REPEAT_DETERM (CHANGED (etac conjE 1)) THEN
   342   REPEAT_DETERM (CHANGED (etac conjE 1)) THEN
   343   REPEAT_DETERM (CHANGED ((etac conjI ORELSE'
   343   REPEAT_DETERM (CHANGED ((etac conjI ORELSE'
   344     rtac conjI THEN' rtac @{thm empty_subsetI}) 1)) THEN
   344     rtac conjI THEN' rtac @{thm empty_subsetI}) 1)) THEN
   345   (rtac @{thm empty_subsetI} ORELSE' atac) 1) ORELSE
   345   (rtac @{thm empty_subsetI} ORELSE' atac) 1) ORELSE
   346   ((rtac sym THEN' rtac @{thm UNIV_eq_I} THEN' rtac CollectI) 1 THEN
   346   ((rtac sym THEN' rtac @{thm UNIV_eq_I} THEN' rtac CollectI) 1 THEN
   347     REPEAT_DETERM (TRY (rtac conjI 1) THEN rtac @{thm empty_subsetI} 1));
   347     REPEAT_DETERM (TRY (rtac conjI 1) THEN rtac @{thm empty_subsetI} 1));
   348 
   348 
   349 fun mk_liftN_in_bd_tac n in_alt in_bd bd_Card_order =
   349 fun mk_lift_in_bd_tac n in_alt in_bd bd_Card_order =
   350   (rtac @{thm ordIso_ordLeq_trans} THEN'
   350   (rtac @{thm ordIso_ordLeq_trans} THEN'
   351   rtac @{thm card_of_ordIso_subst} THEN'
   351   rtac @{thm card_of_ordIso_subst} THEN'
   352   rtac in_alt THEN'
   352   rtac in_alt THEN'
   353   rtac ctrans THEN'
   353   rtac ctrans THEN'
   354   rtac in_bd THEN'
   354   rtac in_bd THEN'