241 fun last_tac iffD = |
241 fun last_tac iffD = |
242 HEADGOAL (etac rel_mono_strong) THEN |
242 HEADGOAL (etac rel_mono_strong) THEN |
243 REPEAT_DETERM (HEADGOAL (etac (@{thm predicate2_transferD} RS iffD) THEN' |
243 REPEAT_DETERM (HEADGOAL (etac (@{thm predicate2_transferD} RS iffD) THEN' |
244 REPEAT_DETERM o atac)); |
244 REPEAT_DETERM o atac)); |
245 in |
245 in |
246 REPEAT_DETERM (HEADGOAL (rtac @{thm rel_funI})) THEN |
246 REPEAT_DETERM (HEADGOAL (rtac rel_funI)) THEN |
247 (HEADGOAL (hyp_subst_tac ctxt THEN' rtac refl) ORELSE |
247 (HEADGOAL (hyp_subst_tac ctxt THEN' rtac refl) ORELSE |
248 REPEAT_DETERM (HEADGOAL (eresolve_tac (Tactic.make_elim (in_rel RS iffD1) :: |
248 REPEAT_DETERM (HEADGOAL (eresolve_tac (Tactic.make_elim (in_rel RS iffD1) :: |
249 @{thms exE conjE CollectE}))) THEN |
249 @{thms exE conjE CollectE}))) THEN |
250 HEADGOAL (hyp_subst_tac ctxt) THEN unfold_thms_tac ctxt rel_map THEN HEADGOAL (rtac iffI) THEN |
250 HEADGOAL (hyp_subst_tac ctxt) THEN unfold_thms_tac ctxt rel_map THEN HEADGOAL (rtac iffI) THEN |
251 last_tac iffD1 THEN last_tac iffD2) |
251 last_tac iffD1 THEN last_tac iffD2) |
258 rtac CollectI THEN' CONJ_WRAP' (fn thm => |
258 rtac CollectI THEN' CONJ_WRAP' (fn thm => |
259 etac (thm RS |
259 etac (thm RS |
260 @{thm ord_eq_le_trans[OF _ subset_trans[OF image_mono convol_image_vimage2p]]})) |
260 @{thm ord_eq_le_trans[OF _ subset_trans[OF image_mono convol_image_vimage2p]]})) |
261 set_maps; |
261 set_maps; |
262 in |
262 in |
263 REPEAT_DETERM_N n (HEADGOAL (rtac @{thm rel_funI})) THEN |
263 REPEAT_DETERM_N n (HEADGOAL (rtac rel_funI)) THEN |
264 unfold_thms_tac ctxt @{thms rel_fun_iff_leq_vimage2p} THEN |
264 unfold_thms_tac ctxt @{thms rel_fun_iff_leq_vimage2p} THEN |
265 HEADGOAL (EVERY' [rtac @{thm order_trans}, rtac rel_mono, REPEAT_DETERM_N n o atac, |
265 HEADGOAL (EVERY' [rtac @{thm order_trans}, rtac rel_mono, REPEAT_DETERM_N n o atac, |
266 rtac @{thm predicate2I}, dtac (in_rel RS iffD1), |
266 rtac @{thm predicate2I}, dtac (in_rel RS iffD1), |
267 REPEAT_DETERM o eresolve_tac [exE, CollectE, conjE], hyp_subst_tac ctxt, |
267 REPEAT_DETERM o eresolve_tac [exE, CollectE, conjE], hyp_subst_tac ctxt, |
268 rtac @{thm vimage2pI}, rtac (in_rel RS iffD2), rtac exI, rtac conjI, in_tac, |
268 rtac @{thm vimage2pI}, rtac (in_rel RS iffD2), rtac exI, rtac conjI, in_tac, |
338 unfold_thms_tac ctxt wit_defs THEN HEADGOAL (EVERY' (map (fn thm => |
338 unfold_thms_tac ctxt wit_defs THEN HEADGOAL (EVERY' (map (fn thm => |
339 dtac (thm RS equalityD1 RS set_mp) THEN' etac imageE THEN' atac) set_maps)) THEN ALLGOALS atac; |
339 dtac (thm RS equalityD1 RS set_mp) THEN' etac imageE THEN' atac) set_maps)) THEN ALLGOALS atac; |
340 |
340 |
341 fun mk_set_transfer_tac ctxt in_rel set_maps = |
341 fun mk_set_transfer_tac ctxt in_rel set_maps = |
342 Goal.conjunction_tac 1 THEN |
342 Goal.conjunction_tac 1 THEN |
343 EVERY (map (fn set_map => HEADGOAL (rtac @{thm rel_funI}) THEN |
343 EVERY (map (fn set_map => HEADGOAL (rtac rel_funI) THEN |
344 REPEAT_DETERM (HEADGOAL (eresolve_tac (Tactic.make_elim (in_rel RS iffD1) :: |
344 REPEAT_DETERM (HEADGOAL (eresolve_tac (Tactic.make_elim (in_rel RS iffD1) :: |
345 @{thms exE conjE CollectE}))) THEN |
345 @{thms exE conjE CollectE}))) THEN |
346 HEADGOAL (hyp_subst_tac ctxt THEN' rtac (@{thm iffD2[OF arg_cong2]} OF [set_map, set_map]) THEN' |
346 HEADGOAL (hyp_subst_tac ctxt THEN' rtac (@{thm iffD2[OF arg_cong2]} OF [set_map, set_map]) THEN' |
347 rtac @{thm rel_setI}) THEN |
347 rtac @{thm rel_setI}) THEN |
348 REPEAT (HEADGOAL (etac imageE THEN' dtac @{thm set_mp} THEN' atac THEN' |
348 REPEAT (HEADGOAL (etac imageE THEN' dtac @{thm set_mp} THEN' atac THEN' |