src/HOL/Tools/BNF/bnf_gfp_tactics.ML
changeset 56114 bc7335979247
parent 56113 e3b8f8319d73
child 56179 6b5c46582260
equal deleted inserted replaced
56113:e3b8f8319d73 56114:bc7335979247
   115   REPEAT_DETERM (etac conjE 1) THEN
   115   REPEAT_DETERM (etac conjE 1) THEN
   116   EVERY' [dtac rev_bspec, atac] 1 THEN
   116   EVERY' [dtac rev_bspec, atac] 1 THEN
   117   REPEAT_DETERM (eresolve_tac [CollectE, conjE] 1) THEN atac 1;
   117   REPEAT_DETERM (eresolve_tac [CollectE, conjE] 1) THEN atac 1;
   118 
   118 
   119 fun mk_mor_elim_tac mor_def =
   119 fun mk_mor_elim_tac mor_def =
   120   (dtac (subst OF [mor_def]) THEN'
   120   (dtac (mor_def RS iffD1) THEN'
   121   REPEAT o etac conjE THEN'
   121   REPEAT o etac conjE THEN'
   122   TRY o rtac @{thm image_subsetI} THEN'
   122   TRY o rtac @{thm image_subsetI} THEN'
   123   etac bspec THEN'
   123   etac bspec THEN'
   124   atac) 1;
   124   atac) 1;
   125 
   125 
   126 fun mk_mor_incl_tac mor_def map_ids =
   126 fun mk_mor_incl_tac mor_def map_ids =
   127   (stac mor_def THEN'
   127   (rtac (mor_def RS iffD2) THEN'
   128   rtac conjI THEN'
   128   rtac conjI THEN'
   129   CONJ_WRAP' (K (EVERY' [rtac ballI, etac set_mp, stac id_apply, atac])) map_ids THEN'
   129   CONJ_WRAP' (K (EVERY' [rtac ballI, etac set_mp, etac (id_apply RS @{thm ssubst_mem})]))
       
   130     map_ids THEN'
   130   CONJ_WRAP' (fn thm =>
   131   CONJ_WRAP' (fn thm =>
   131    (EVERY' [rtac ballI, rtac (thm RS trans), rtac sym, rtac (id_apply RS arg_cong)])) map_ids) 1;
   132     (EVERY' [rtac ballI, rtac (thm RS trans), rtac sym, rtac (id_apply RS arg_cong)])) map_ids) 1;
   132 
   133 
   133 fun mk_mor_comp_tac mor_def mor_images morEs map_comp_ids =
   134 fun mk_mor_comp_tac mor_def mor_images morEs map_comp_ids =
   134   let
   135   let
   135     fun fbetw_tac image = EVERY' [rtac ballI, stac o_apply, etac image, etac image, atac];
   136     fun fbetw_tac image = EVERY' [rtac ballI, rtac (o_apply RS @{thm ssubst_mem}), etac image,
       
   137       etac image, atac];
   136     fun mor_tac ((mor_image, morE), map_comp_id) =
   138     fun mor_tac ((mor_image, morE), map_comp_id) =
   137       EVERY' [rtac ballI, stac o_apply, rtac trans, rtac (map_comp_id RS sym), rtac trans,
   139       EVERY' [rtac ballI, stac o_apply, rtac trans, rtac (map_comp_id RS sym), rtac trans,
   138         etac (morE RS arg_cong), atac, etac morE, etac mor_image, atac];
   140         etac (morE RS arg_cong), atac, etac morE, etac mor_image, atac];
   139   in
   141   in
   140     (stac mor_def THEN' rtac conjI THEN'
   142     (rtac (mor_def RS iffD2) THEN' rtac conjI THEN'
   141     CONJ_WRAP' fbetw_tac mor_images THEN'
   143     CONJ_WRAP' fbetw_tac mor_images THEN'
   142     CONJ_WRAP' mor_tac ((mor_images ~~ morEs) ~~ map_comp_ids)) 1
   144     CONJ_WRAP' mor_tac ((mor_images ~~ morEs) ~~ map_comp_ids)) 1
   143   end;
   145   end;
   144 
   146 
   145 fun mk_mor_UNIV_tac morEs mor_def =
   147 fun mk_mor_UNIV_tac morEs mor_def =
   147     val n = length morEs;
   149     val n = length morEs;
   148     fun mor_tac morE = EVERY' [rtac @{thm ext}, rtac trans, rtac o_apply, rtac trans, etac morE,
   150     fun mor_tac morE = EVERY' [rtac @{thm ext}, rtac trans, rtac o_apply, rtac trans, etac morE,
   149       rtac UNIV_I, rtac sym, rtac o_apply];
   151       rtac UNIV_I, rtac sym, rtac o_apply];
   150   in
   152   in
   151     EVERY' [rtac iffI, CONJ_WRAP' mor_tac morEs,
   153     EVERY' [rtac iffI, CONJ_WRAP' mor_tac morEs,
   152     stac mor_def, rtac conjI, CONJ_WRAP' (K (rtac ballI THEN' rtac UNIV_I)) morEs,
   154     rtac (mor_def RS iffD2), rtac conjI, CONJ_WRAP' (K (rtac ballI THEN' rtac UNIV_I)) morEs,
   153     CONJ_WRAP' (fn i =>
   155     CONJ_WRAP' (fn i =>
   154       EVERY' [dtac (mk_conjunctN n i), rtac ballI, etac @{thm comp_eq_dest}]) (1 upto n)] 1
   156       EVERY' [dtac (mk_conjunctN n i), rtac ballI, etac @{thm comp_eq_dest}]) (1 upto n)] 1
   155   end;
   157   end;
   156 
   158 
   157 fun mk_mor_str_tac ks mor_UNIV =
   159 fun mk_mor_str_tac ks mor_UNIV =
   158   (stac mor_UNIV THEN' CONJ_WRAP' (K (rtac refl)) ks) 1;
   160   (rtac (mor_UNIV RS iffD2) THEN' CONJ_WRAP' (K (rtac refl)) ks) 1;
   159 
   161 
   160 fun mk_mor_case_sum_tac ks mor_UNIV =
   162 fun mk_mor_case_sum_tac ks mor_UNIV =
   161   (stac mor_UNIV THEN' CONJ_WRAP' (K (rtac @{thm case_sum_o_inj(1)[symmetric]})) ks) 1;
   163   (rtac (mor_UNIV RS iffD2) THEN' CONJ_WRAP' (K (rtac @{thm case_sum_o_inj(1)[symmetric]})) ks) 1;
   162 
   164 
   163 fun mk_set_incl_hset_tac rec_Suc =
   165 fun mk_set_incl_hset_tac rec_Suc =
   164   EVERY' (map rtac [@{thm SUP_upper2}, UNIV_I, @{thm ord_le_eq_trans}, @{thm Un_upper1}, sym,
   166   EVERY' (map rtac [@{thm SUP_upper2}, UNIV_I, @{thm ord_le_eq_trans}, @{thm Un_upper1}, sym,
   165     rec_Suc]) 1;
   167     rec_Suc]) 1;
   166 
   168 
   260       rtac iffI, etac conjE, etac conjI, CONJ_WRAP' mk_if_tac thms,
   262       rtac iffI, etac conjE, etac conjI, CONJ_WRAP' mk_if_tac thms,
   261       etac conjE, etac conjI, CONJ_WRAP' mk_only_if_tac thms] 1
   263       etac conjE, etac conjI, CONJ_WRAP' mk_only_if_tac thms] 1
   262   end;
   264   end;
   263 
   265 
   264 fun mk_bis_converse_tac m bis_rel rel_congs rel_converseps =
   266 fun mk_bis_converse_tac m bis_rel rel_congs rel_converseps =
   265   EVERY' [stac bis_rel, dtac (bis_rel RS iffD1),
   267   EVERY' [rtac (bis_rel RS iffD2), dtac (bis_rel RS iffD1),
   266     REPEAT_DETERM o etac conjE, rtac conjI,
   268     REPEAT_DETERM o etac conjE, rtac conjI,
   267     CONJ_WRAP' (K (EVERY' [rtac converse_shift, etac subset_trans,
   269     CONJ_WRAP' (K (EVERY' [rtac converse_shift, etac subset_trans,
   268       rtac equalityD2, rtac @{thm converse_Times}])) rel_congs,
   270       rtac equalityD2, rtac @{thm converse_Times}])) rel_congs,
   269     CONJ_WRAP' (fn (rel_cong, rel_conversep) =>
   271     CONJ_WRAP' (fn (rel_cong, rel_conversep) =>
   270       EVERY' [rtac allI, rtac allI, rtac impI,
   272       EVERY' [rtac allI, rtac allI, rtac impI,
   274         rtac (rel_conversep RS sym RS @{thm eq_refl} RS @{thm predicate2D}),
   276         rtac (rel_conversep RS sym RS @{thm eq_refl} RS @{thm predicate2D}),
   275         REPEAT_DETERM o etac allE,
   277         REPEAT_DETERM o etac allE,
   276         rtac @{thm conversepI}, etac mp, etac @{thm converseD}]) (rel_congs ~~ rel_converseps)] 1;
   278         rtac @{thm conversepI}, etac mp, etac @{thm converseD}]) (rel_congs ~~ rel_converseps)] 1;
   277 
   279 
   278 fun mk_bis_O_tac ctxt m bis_rel rel_congs rel_OOs =
   280 fun mk_bis_O_tac ctxt m bis_rel rel_congs rel_OOs =
   279   EVERY' [stac bis_rel, REPEAT_DETERM o dtac (bis_rel RS iffD1),
   281   EVERY' [rtac (bis_rel RS iffD2), REPEAT_DETERM o dtac (bis_rel RS iffD1),
   280     REPEAT_DETERM o etac conjE, rtac conjI,
   282     REPEAT_DETERM o etac conjE, rtac conjI,
   281     CONJ_WRAP' (K (EVERY' [etac @{thm relcomp_subset_Sigma}, atac])) rel_congs,
   283     CONJ_WRAP' (K (EVERY' [etac @{thm relcomp_subset_Sigma}, atac])) rel_congs,
   282     CONJ_WRAP' (fn (rel_cong, rel_OO) =>
   284     CONJ_WRAP' (fn (rel_cong, rel_OO) =>
   283       EVERY' [rtac allI, rtac allI, rtac impI,
   285       EVERY' [rtac allI, rtac allI, rtac impI,
   284         rtac (rel_cong RS @{thm eq_refl} RS @{thm predicate2D}),
   286         rtac (rel_cong RS @{thm eq_refl} RS @{thm predicate2D}),
   292         etac mp, atac, etac mp, atac]) (rel_congs ~~ rel_OOs)] 1;
   294         etac mp, atac, etac mp, atac]) (rel_congs ~~ rel_OOs)] 1;
   293 
   295 
   294 fun mk_bis_Gr_tac ctxt bis_rel rel_Grps mor_images morEs coalg_ins =
   296 fun mk_bis_Gr_tac ctxt bis_rel rel_Grps mor_images morEs coalg_ins =
   295   unfold_thms_tac ctxt (bis_rel :: @{thm eq_alt} :: @{thm in_rel_Gr} :: rel_Grps) THEN
   297   unfold_thms_tac ctxt (bis_rel :: @{thm eq_alt} :: @{thm in_rel_Gr} :: rel_Grps) THEN
   296   EVERY' [rtac conjI,
   298   EVERY' [rtac conjI,
   297     CONJ_WRAP' (fn thm => rtac (@{thm Gr_incl} RS ssubst) THEN' etac thm) mor_images,
   299     CONJ_WRAP' (fn thm => rtac (@{thm Gr_incl} RS iffD2) THEN' etac thm) mor_images,
   298     CONJ_WRAP' (fn (coalg_in, morE) =>
   300     CONJ_WRAP' (fn (coalg_in, morE) =>
   299       EVERY' [rtac allI, rtac allI, rtac impI, rtac @{thm GrpI}, etac (morE RS trans),
   301       EVERY' [rtac allI, rtac allI, rtac impI, rtac @{thm GrpI}, etac (morE RS trans),
   300         etac @{thm GrD1}, etac (@{thm GrD2} RS arg_cong), etac coalg_in, etac @{thm GrD1}])
   302         etac @{thm GrD1}, etac (@{thm GrD2} RS arg_cong), etac coalg_in, etac @{thm GrD1}])
   301     (coalg_ins ~~ morEs)] 1;
   303     (coalg_ins ~~ morEs)] 1;
   302 
   304 
   558           rtac ballI, etac @{thm UN_E},
   560           rtac ballI, etac @{thm UN_E},
   559           CONJ_WRAP' (fn (i, (rv_last, (isNode_def, (set_map0s,
   561           CONJ_WRAP' (fn (i, (rv_last, (isNode_def, (set_map0s,
   560             (set_Levs, set_image_Levs))))) =>
   562             (set_Levs, set_image_Levs))))) =>
   561             EVERY' [rtac ballI,
   563             EVERY' [rtac ballI,
   562               REPEAT_DETERM o eresolve_tac [CollectE, @{thm SuccE}, @{thm UN_E}],
   564               REPEAT_DETERM o eresolve_tac [CollectE, @{thm SuccE}, @{thm UN_E}],
   563               rtac (rev_mp OF [rv_last, impI]), etac exE, rtac (isNode_def RS ssubst),
   565               rtac (rev_mp OF [rv_last, impI]), etac exE, rtac (isNode_def RS iffD2),
   564               rtac exI, rtac conjI,
   566               rtac exI, rtac conjI,
   565               if n = 1 then rtac refl
   567               if n = 1 then rtac refl
   566               else etac (sum_weak_case_cong RS trans) THEN' rtac (mk_sum_caseN n i),
   568               else etac (sum_weak_case_cong RS trans) THEN' rtac (mk_sum_caseN n i),
   567               CONJ_WRAP' (fn (set_map0, (set_Lev, set_image_Lev)) =>
   569               CONJ_WRAP' (fn (set_map0, (set_Lev, set_image_Lev)) =>
   568                 EVERY' [rtac (set_map0 RS trans), rtac equalityI, rtac @{thm image_subsetI},
   570                 EVERY' [rtac (set_map0 RS trans), rtac equalityI, rtac @{thm image_subsetI},
   576                   if n = 1 then rtac refl else atac])
   578                   if n = 1 then rtac refl else atac])
   577               (drop m set_map0s ~~ (set_Levs ~~ set_image_Levs))])
   579               (drop m set_map0s ~~ (set_Levs ~~ set_image_Levs))])
   578           (ks ~~ (rv_lasts ~~ (isNode_defs ~~ (set_map0ss ~~
   580           (ks ~~ (rv_lasts ~~ (isNode_defs ~~ (set_map0ss ~~
   579             (set_Levss ~~ set_image_Levss))))),
   581             (set_Levss ~~ set_image_Levss))))),
   580         (*root isNode*)
   582         (*root isNode*)
   581           rtac (isNode_def RS ssubst), rtac exI, rtac conjI,
   583           rtac (isNode_def RS iffD2), rtac exI, rtac conjI,
   582           CONVERSION (Conv.top_conv
   584           CONVERSION (Conv.top_conv
   583             (K (Conv.try_conv (Conv.rewr_conv (rv_Nil RS eq_reflection)))) ctxt),
   585             (K (Conv.try_conv (Conv.rewr_conv (rv_Nil RS eq_reflection)))) ctxt),
   584           if n = 1 then rtac refl else rtac (mk_sum_caseN n i),
   586           if n = 1 then rtac refl else rtac (mk_sum_caseN n i),
   585           CONJ_WRAP' (fn (set_map0, (set_Lev, set_image_Lev)) =>
   587           CONJ_WRAP' (fn (set_map0, (set_Lev, set_image_Lev)) =>
   586             EVERY' [rtac (set_map0 RS trans), rtac equalityI, rtac @{thm image_subsetI},
   588             EVERY' [rtac (set_map0 RS trans), rtac equalityI, rtac @{thm image_subsetI},
   620                 else etac (mk_InN_not_InM i' i'' RS notE)])
   622                 else etac (mk_InN_not_InM i' i'' RS notE)])
   621             (rev ks),
   623             (rev ks),
   622             rtac @{thm UN_least}, rtac subsetI, rtac CollectI, rtac @{thm UN_I[OF UNIV_I]},
   624             rtac @{thm UN_least}, rtac subsetI, rtac CollectI, rtac @{thm UN_I[OF UNIV_I]},
   623             rtac (Lev_Suc RS equalityD2 RS set_mp), rtac (mk_UnIN n i'), rtac CollectI,
   625             rtac (Lev_Suc RS equalityD2 RS set_mp), rtac (mk_UnIN n i'), rtac CollectI,
   624             REPEAT_DETERM o rtac exI, rtac conjI, rtac refl, etac conjI, atac,
   626             REPEAT_DETERM o rtac exI, rtac conjI, rtac refl, etac conjI, atac,
   625             rtac trans, rtac @{thm shift_def}, rtac ssubst, rtac @{thm fun_eq_iff}, rtac allI,
   627             rtac trans, rtac @{thm shift_def}, rtac iffD2, rtac @{thm fun_eq_iff}, rtac allI,
   626             CONVERSION (Conv.top_conv
   628             CONVERSION (Conv.top_conv
   627               (K (Conv.try_conv (Conv.rewr_conv (rv_Cons RS eq_reflection)))) ctxt),
   629               (K (Conv.try_conv (Conv.rewr_conv (rv_Cons RS eq_reflection)))) ctxt),
   628             if n = 1 then K all_tac
   630             if n = 1 then K all_tac
   629             else rtac sum_weak_case_cong THEN' rtac (mk_sum_caseN n i' RS trans),
   631             else rtac sum_weak_case_cong THEN' rtac (mk_sum_caseN n i' RS trans),
   630             SELECT_GOAL (unfold_thms_tac ctxt [from_to_sbd]), rtac refl])
   632             SELECT_GOAL (unfold_thms_tac ctxt [from_to_sbd]), rtac refl])
   631         ks to_sbd_injs from_to_sbds)];
   633         ks to_sbd_injs from_to_sbds)];
   632   in
   634   in
   633     (rtac mor_cong THEN'
   635     (rtac mor_cong THEN'
   634     EVERY' (map (fn thm => rtac (thm RS @{thm ext})) beh_defs) THEN'
   636     EVERY' (map (fn thm => rtac (thm RS @{thm ext})) beh_defs) THEN'
   635     stac mor_def THEN' rtac conjI THEN'
   637     rtac (mor_def RS iffD2) THEN' rtac conjI THEN'
   636     CONJ_WRAP' fbetw_tac
   638     CONJ_WRAP' fbetw_tac
   637       (ks ~~ (carT_defs ~~ (isNode_defs ~~ (Lev_0s ~~ (rv_Nils ~~ ((length_Levs ~~ length_Lev's) ~~
   639       (ks ~~ (carT_defs ~~ (isNode_defs ~~ (Lev_0s ~~ (rv_Nils ~~ ((length_Levs ~~ length_Lev's) ~~
   638         (rv_lastss ~~ (set_map0ss ~~ (set_Levsss ~~ set_image_Levsss))))))))) THEN'
   640         (rv_lastss ~~ (set_map0ss ~~ (set_Levsss ~~ set_image_Levsss))))))))) THEN'
   639     CONJ_WRAP' mor_tac
   641     CONJ_WRAP' mor_tac
   640       (ks ~~ (strT_defs ~~ ((Lev_Sucs ~~ (rv_Nils ~~ rv_Conss)) ~~
   642       (ks ~~ (strT_defs ~~ ((Lev_Sucs ~~ (rv_Nils ~~ rv_Conss)) ~~
   651       EVERY' [rtac @{thm equiv_proj}, rtac equiv_LSBIS, etac set_mp, atac])
   653       EVERY' [rtac @{thm equiv_proj}, rtac equiv_LSBIS, etac set_mp, atac])
   652     equiv_LSBISs), rtac sym, rtac (o_apply RS trans),
   654     equiv_LSBISs), rtac sym, rtac (o_apply RS trans),
   653     etac (sym RS arg_cong RS trans), rtac map_comp_id] 1;
   655     etac (sym RS arg_cong RS trans), rtac map_comp_id] 1;
   654 
   656 
   655 fun mk_coalg_final_tac m coalg_def congruent_str_finals equiv_LSBISs set_map0ss coalgT_setss =
   657 fun mk_coalg_final_tac m coalg_def congruent_str_finals equiv_LSBISs set_map0ss coalgT_setss =
   656   EVERY' [stac coalg_def,
   658   EVERY' [rtac (coalg_def RS iffD2),
   657     CONJ_WRAP' (fn ((set_map0s, coalgT_sets), (equiv_LSBIS, congruent_str_final)) =>
   659     CONJ_WRAP' (fn ((set_map0s, coalgT_sets), (equiv_LSBIS, congruent_str_final)) =>
   658       EVERY' [rtac @{thm univ_preserves}, rtac equiv_LSBIS, rtac congruent_str_final,
   660       EVERY' [rtac @{thm univ_preserves}, rtac equiv_LSBIS, rtac congruent_str_final,
   659         rtac ballI, rtac @{thm ssubst_mem}, rtac o_apply, rtac CollectI,
   661         rtac ballI, rtac @{thm ssubst_mem}, rtac o_apply, rtac CollectI,
   660         REPEAT_DETERM_N m o EVERY' [rtac conjI, rtac subset_UNIV],
   662         REPEAT_DETERM_N m o EVERY' [rtac conjI, rtac subset_UNIV],
   661         CONJ_WRAP' (fn (equiv_LSBIS, (set_map0, coalgT_set)) =>
   663         CONJ_WRAP' (fn (equiv_LSBIS, (set_map0, coalgT_set)) =>
   662           EVERY' [rtac (set_map0 RS ord_eq_le_trans),
   664           EVERY' [rtac (set_map0 RS ord_eq_le_trans),
   663             rtac @{thm image_subsetI}, rtac ssubst, rtac @{thm proj_in_iff},
   665             rtac @{thm image_subsetI}, rtac iffD2, rtac @{thm proj_in_iff},
   664             rtac equiv_LSBIS, etac set_rev_mp, etac coalgT_set])
   666             rtac equiv_LSBIS, etac set_rev_mp, etac coalgT_set])
   665         (equiv_LSBISs ~~ (drop m set_map0s ~~ coalgT_sets))])
   667         (equiv_LSBISs ~~ (drop m set_map0s ~~ coalgT_sets))])
   666     ((set_map0ss ~~ coalgT_setss) ~~ (equiv_LSBISs ~~ congruent_str_finals))] 1;
   668     ((set_map0ss ~~ coalgT_setss) ~~ (equiv_LSBISs ~~ congruent_str_finals))] 1;
   667 
   669 
   668 fun mk_mor_T_final_tac mor_def congruent_str_finals equiv_LSBISs =
   670 fun mk_mor_T_final_tac mor_def congruent_str_finals equiv_LSBISs =
   669   EVERY' [stac mor_def, rtac conjI,
   671   EVERY' [rtac (mor_def RS iffD2), rtac conjI,
   670     CONJ_WRAP' (fn equiv_LSBIS =>
   672     CONJ_WRAP' (fn equiv_LSBIS =>
   671       EVERY' [rtac ballI, rtac ssubst, rtac @{thm proj_in_iff}, rtac equiv_LSBIS, atac])
   673       EVERY' [rtac ballI, rtac iffD2, rtac @{thm proj_in_iff}, rtac equiv_LSBIS, atac])
   672     equiv_LSBISs,
   674     equiv_LSBISs,
   673     CONJ_WRAP' (fn (equiv_LSBIS, congruent_str_final) =>
   675     CONJ_WRAP' (fn (equiv_LSBIS, congruent_str_final) =>
   674       EVERY' [rtac ballI, rtac sym, rtac trans, rtac @{thm univ_commute}, rtac equiv_LSBIS,
   676       EVERY' [rtac ballI, rtac sym, rtac trans, rtac @{thm univ_commute}, rtac equiv_LSBIS,
   675         rtac congruent_str_final, atac, rtac o_apply])
   677         rtac congruent_str_final, atac, rtac o_apply])
   676     (equiv_LSBISs ~~ congruent_str_finals)] 1;
   678     (equiv_LSBISs ~~ congruent_str_finals)] 1;
   752   unfold_thms_tac ctxt
   754   unfold_thms_tac ctxt
   753     (corec_defs @ map (fn thm => thm RS @{thm case_sum_expand_Inr'}) corec_Inls) THEN
   755     (corec_defs @ map (fn thm => thm RS @{thm case_sum_expand_Inr'}) corec_Inls) THEN
   754   etac unfold_unique_mor 1;
   756   etac unfold_unique_mor 1;
   755 
   757 
   756 fun mk_dtor_coinduct_tac m raw_coind bis_rel rel_congs =
   758 fun mk_dtor_coinduct_tac m raw_coind bis_rel rel_congs =
   757   EVERY' [rtac rev_mp, rtac raw_coind, rtac ssubst, rtac bis_rel, rtac conjI,
   759   EVERY' [rtac rev_mp, rtac raw_coind, rtac iffD2, rtac bis_rel, rtac conjI,
   758     CONJ_WRAP' (K (rtac @{thm ord_le_eq_trans[OF subset_UNIV UNIV_Times_UNIV[THEN sym]]}))
   760     CONJ_WRAP' (K (rtac @{thm ord_le_eq_trans[OF subset_UNIV UNIV_Times_UNIV[THEN sym]]}))
   759     rel_congs,
   761     rel_congs,
   760     CONJ_WRAP' (fn rel_cong => EVERY' [rtac allI, rtac allI, rtac impI,
   762     CONJ_WRAP' (fn rel_cong => EVERY' [rtac allI, rtac allI, rtac impI,
   761       REPEAT_DETERM o etac allE, rtac (rel_cong RS @{thm eq_refl} RS @{thm predicate2D}),
   763       REPEAT_DETERM o etac allE, rtac (rel_cong RS @{thm eq_refl} RS @{thm predicate2D}),
   762       REPEAT_DETERM_N m o rtac refl,
   764       REPEAT_DETERM_N m o rtac refl,