src/HOL/Tools/BNF/bnf_def_tactics.ML
changeset 58104 c5316f843f72
parent 57970 eaa986cd285a
child 58106 c8cba801c483
equal deleted inserted replaced
58103:c23bdb4ed2f6 58104:c5316f843f72
    25   val mk_rel_conversep_tac: thm -> thm -> tactic
    25   val mk_rel_conversep_tac: thm -> thm -> tactic
    26   val mk_rel_conversep_le_tac: Proof.context -> thm list -> thm -> thm -> thm -> thm list -> tactic
    26   val mk_rel_conversep_le_tac: Proof.context -> thm list -> thm -> thm -> thm -> thm list -> tactic
    27   val mk_rel_map0_tac: Proof.context -> int -> thm -> thm -> thm -> thm -> tactic
    27   val mk_rel_map0_tac: Proof.context -> int -> thm -> thm -> thm -> thm -> tactic
    28   val mk_rel_mono_tac: thm list -> thm -> tactic
    28   val mk_rel_mono_tac: thm list -> thm -> tactic
    29   val mk_rel_mono_strong0_tac: Proof.context -> thm -> thm list -> tactic
    29   val mk_rel_mono_strong0_tac: Proof.context -> thm -> thm list -> tactic
       
    30   val mk_rel_transfer_tac: Proof.context -> thm -> thm list -> thm -> tactic
    30 
    31 
    31   val mk_map_transfer_tac: Proof.context -> thm -> thm -> thm list -> thm -> thm -> tactic
    32   val mk_map_transfer_tac: Proof.context -> thm -> thm -> thm list -> thm -> thm -> tactic
    32 
    33 
    33   val mk_in_bd_tac: Proof.context -> int -> thm -> thm -> thm -> thm -> thm list -> thm list ->
    34   val mk_in_bd_tac: Proof.context -> int -> thm -> thm -> thm -> thm -> thm list -> thm list ->
    34     thm -> thm -> thm -> thm -> tactic
    35     thm -> thm -> thm -> thm -> tactic
   231     hyp_subst_tac ctxt 1 THEN
   232     hyp_subst_tac ctxt 1 THEN
   232     EVERY' [rtac exI, rtac @{thm conjI[OF CollectI conjI[OF refl refl]]},
   233     EVERY' [rtac exI, rtac @{thm conjI[OF CollectI conjI[OF refl refl]]},
   233       CONJ_WRAP' (fn thm =>
   234       CONJ_WRAP' (fn thm =>
   234         (etac (@{thm Collect_split_mono_strong} OF [thm, thm]) THEN' atac))
   235         (etac (@{thm Collect_split_mono_strong} OF [thm, thm]) THEN' atac))
   235       set_maps] 1;
   236       set_maps] 1;
       
   237 
       
   238 fun mk_rel_transfer_tac ctxt in_rel rel_map rel_mono_strong =
       
   239   let
       
   240     fun last_tac iffD =
       
   241       HEADGOAL (etac rel_mono_strong) THEN
       
   242       REPEAT_DETERM (HEADGOAL (etac (@{thm predicate2_transferD} RS iffD) THEN'
       
   243         REPEAT_DETERM o atac));
       
   244   in
       
   245     REPEAT_DETERM (HEADGOAL (rtac @{thm rel_funI})) THEN
       
   246     (HEADGOAL (hyp_subst_tac ctxt THEN' rtac refl) ORELSE
       
   247      REPEAT_DETERM (HEADGOAL (eresolve_tac (Tactic.make_elim (in_rel RS iffD1) ::
       
   248        @{thms exE conjE CollectE}))) THEN
       
   249      HEADGOAL (hyp_subst_tac ctxt) THEN unfold_thms_tac ctxt rel_map THEN HEADGOAL (rtac iffI) THEN
       
   250      last_tac iffD1 THEN last_tac iffD2)
       
   251   end;
   236 
   252 
   237 fun mk_map_transfer_tac ctxt rel_mono in_rel set_maps map_cong0 map_comp =
   253 fun mk_map_transfer_tac ctxt rel_mono in_rel set_maps map_cong0 map_comp =
   238   let
   254   let
   239     val n = length set_maps;
   255     val n = length set_maps;
   240     val in_tac = if n = 0 then rtac UNIV_I else
   256     val in_tac = if n = 0 then rtac UNIV_I else