87 val trans_fun_cong_image_id_id_apply = @{thm trans[OF fun_cong[OF image_id] id_apply]}; |
87 val trans_fun_cong_image_id_id_apply = @{thm trans[OF fun_cong[OF image_id] id_apply]}; |
88 val rev_bspec = Drule.rotate_prems 1 bspec; |
88 val rev_bspec = Drule.rotate_prems 1 bspec; |
89 val Un_cong = @{thm arg_cong2[of _ _ _ _ "op \<union>"]} |
89 val Un_cong = @{thm arg_cong2[of _ _ _ _ "op \<union>"]} |
90 |
90 |
91 fun mk_alg_set_tac alg_def = |
91 fun mk_alg_set_tac alg_def = |
92 dtac (alg_def RS iffD1) 1 THEN |
92 EVERY' [dtac (alg_def RS iffD1), REPEAT_DETERM o etac conjE, etac bspec, rtac CollectI, |
93 REPEAT_DETERM (etac conjE 1) THEN |
93 REPEAT_DETERM o (rtac (subset_UNIV RS conjI) ORELSE' etac conjI), atac] 1; |
94 EVERY' [etac bspec, rtac CollectI] 1 THEN |
|
95 REPEAT_DETERM (etac conjI 1) THEN atac 1; |
|
96 |
94 |
97 fun mk_alg_not_empty_tac ctxt alg_set alg_sets wits = |
95 fun mk_alg_not_empty_tac ctxt alg_set alg_sets wits = |
98 (EVERY' [rtac notI, hyp_subst_tac ctxt, ftac alg_set] THEN' |
96 (EVERY' [rtac notI, hyp_subst_tac ctxt, ftac alg_set] THEN' |
99 REPEAT_DETERM o FIRST' |
97 REPEAT_DETERM o FIRST' |
100 [rtac subset_UNIV, |
98 [EVERY' [rtac @{thm subset_emptyI}, eresolve_tac wits], |
101 EVERY' [rtac @{thm subset_emptyI}, eresolve_tac wits], |
|
102 EVERY' [rtac subsetI, rtac FalseE, eresolve_tac wits], |
99 EVERY' [rtac subsetI, rtac FalseE, eresolve_tac wits], |
103 EVERY' [rtac subsetI, dresolve_tac wits, hyp_subst_tac ctxt, |
100 EVERY' [rtac subsetI, dresolve_tac wits, hyp_subst_tac ctxt, |
104 FIRST' (map (fn thm => rtac thm THEN' atac) alg_sets)]] THEN' |
101 FIRST' (map (fn thm => rtac thm THEN' atac) alg_sets)]] THEN' |
105 etac @{thm emptyE}) 1; |
102 etac @{thm emptyE}) 1; |
106 |
103 |
218 etac @{thm image_mono}, rtac equalityD1, etac @{thm bij_betw_imageE}]; |
215 etac @{thm image_mono}, rtac equalityD1, etac @{thm bij_betw_imageE}]; |
219 val copy_str_tac = |
216 val copy_str_tac = |
220 CONJ_WRAP' (fn (thms, thm) => |
217 CONJ_WRAP' (fn (thms, thm) => |
221 EVERY' [rtac ballI, REPEAT_DETERM o eresolve_tac [CollectE, conjE], rtac set_mp, |
218 EVERY' [rtac ballI, REPEAT_DETERM o eresolve_tac [CollectE, conjE], rtac set_mp, |
222 rtac equalityD1, etac @{thm bij_betw_imageE}, rtac imageI, etac thm, |
219 rtac equalityD1, etac @{thm bij_betw_imageE}, rtac imageI, etac thm, |
223 REPEAT_DETERM o rtac subset_UNIV, REPEAT_DETERM_N n o (set_tac thms)]) |
220 REPEAT_DETERM_N n o set_tac thms]) |
224 (set_maps ~~ alg_sets); |
221 (set_maps ~~ alg_sets); |
225 in |
222 in |
226 (rtac rev_mp THEN' DETERM o bij_betw_inv_tac THEN' rtac impI THEN' |
223 (rtac rev_mp THEN' DETERM o bij_betw_inv_tac THEN' rtac impI THEN' |
227 stac alg_def THEN' copy_str_tac) 1 |
224 stac alg_def THEN' copy_str_tac) 1 |
228 end; |
225 end; |
236 REPEAT_DETERM o etac conjE, etac @{thm image_mono}, |
233 REPEAT_DETERM o etac conjE, etac @{thm image_mono}, |
237 rtac equalityD1, etac @{thm bij_betw_imageE}]; |
234 rtac equalityD1, etac @{thm bij_betw_imageE}]; |
238 val mor_tac = |
235 val mor_tac = |
239 CONJ_WRAP' (fn (thms, thm) => |
236 CONJ_WRAP' (fn (thms, thm) => |
240 EVERY' [rtac ballI, etac CollectE, etac @{thm inverE}, etac thm, |
237 EVERY' [rtac ballI, etac CollectE, etac @{thm inverE}, etac thm, |
241 REPEAT_DETERM o rtac subset_UNIV, REPEAT_DETERM_N n o (set_tac thms)]) |
238 REPEAT_DETERM_N n o set_tac thms]) |
242 (set_maps ~~ alg_sets); |
239 (set_maps ~~ alg_sets); |
243 in |
240 in |
244 (rtac (iso_alt RS iffD2) THEN' |
241 (rtac (iso_alt RS iffD2) THEN' |
245 etac copy_str THEN' REPEAT_DETERM o atac THEN' |
242 etac copy_str THEN' REPEAT_DETERM o atac THEN' |
246 rtac conjI THEN' stac mor_def THEN' rtac conjI THEN' fbetw_tac THEN' mor_tac THEN' |
243 rtac conjI THEN' stac mor_def THEN' rtac conjI THEN' fbetw_tac THEN' mor_tac THEN' |
338 dtac mp, etac @{thm underS_Field}, REPEAT_DETERM o etac conjE, atac]; |
335 dtac mp, etac @{thm underS_Field}, REPEAT_DETERM o etac conjE, atac]; |
339 |
336 |
340 fun mk_minH_tac (min_alg, alg_set) = EVERY' [rtac ord_eq_le_trans, etac min_alg, |
337 fun mk_minH_tac (min_alg, alg_set) = EVERY' [rtac ord_eq_le_trans, etac min_alg, |
341 rtac @{thm Un_least}, minG_tac, rtac @{thm image_subsetI}, |
338 rtac @{thm Un_least}, minG_tac, rtac @{thm image_subsetI}, |
342 REPEAT_DETERM o eresolve_tac [CollectE, conjE], etac alg_set, |
339 REPEAT_DETERM o eresolve_tac [CollectE, conjE], etac alg_set, |
343 REPEAT_DETERM o FIRST' [atac, etac subset_trans THEN' minG_tac]]; |
340 REPEAT_DETERM o (etac subset_trans THEN' minG_tac)]; |
344 in |
341 in |
345 (rtac induct THEN' |
342 (rtac induct THEN' |
346 rtac impI THEN' |
343 rtac impI THEN' |
347 CONJ_WRAP' mk_minH_tac (min_algs ~~ alg_sets)) 1 |
344 CONJ_WRAP' mk_minH_tac (min_algs ~~ alg_sets)) 1 |
348 end; |
345 end; |
395 val mor_tac = |
392 val mor_tac = |
396 CONJ_WRAP' (fn thm => EVERY' [rtac ballI, rtac thm]) str_init_defs; |
393 CONJ_WRAP' (fn thm => EVERY' [rtac ballI, rtac thm]) str_init_defs; |
397 fun alg_epi_tac ((alg_set, str_init_def), set_map) = |
394 fun alg_epi_tac ((alg_set, str_init_def), set_map) = |
398 EVERY' [rtac ballI, REPEAT_DETERM o eresolve_tac [CollectE, conjE], rtac CollectI, |
395 EVERY' [rtac ballI, REPEAT_DETERM o eresolve_tac [CollectE, conjE], rtac CollectI, |
399 rtac ballI, ftac (alg_select RS bspec), stac str_init_def, etac alg_set, |
396 rtac ballI, ftac (alg_select RS bspec), stac str_init_def, etac alg_set, |
400 REPEAT_DETERM o FIRST' [rtac subset_UNIV, |
397 REPEAT_DETERM o EVERY' [rtac ord_eq_le_trans, resolve_tac set_map, rtac subset_trans, |
401 EVERY' [rtac ord_eq_le_trans, resolve_tac set_map, rtac subset_trans, |
398 etac @{thm image_mono}, rtac @{thm image_Collect_subsetI}, etac bspec, atac]]; |
402 etac @{thm image_mono}, rtac @{thm image_Collect_subsetI}, etac bspec, atac]]]; |
|
403 in |
399 in |
404 (rtac mor_cong THEN' REPEAT_DETERM_N n o (rtac sym THEN' rtac @{thm comp_id}) THEN' |
400 (rtac mor_cong THEN' REPEAT_DETERM_N n o (rtac sym THEN' rtac @{thm comp_id}) THEN' |
405 rtac (Thm.permute_prems 0 1 mor_comp) THEN' etac (Thm.permute_prems 0 1 mor_comp) THEN' |
401 rtac (Thm.permute_prems 0 1 mor_comp) THEN' etac (Thm.permute_prems 0 1 mor_comp) THEN' |
406 stac mor_def THEN' rtac conjI THEN' fbetw_tac THEN' mor_tac THEN' rtac mor_incl_min_alg THEN' |
402 stac mor_def THEN' rtac conjI THEN' fbetw_tac THEN' mor_tac THEN' rtac mor_incl_min_alg THEN' |
407 stac alg_def THEN' CONJ_WRAP' alg_epi_tac ((alg_sets ~~ str_init_defs) ~~ set_maps)) 1 |
403 stac alg_def THEN' CONJ_WRAP' alg_epi_tac ((alg_sets ~~ str_init_defs) ~~ set_maps)) 1 |
446 REPEAT_DETERM_N m o rtac refl, |
442 REPEAT_DETERM_N m o rtac refl, |
447 REPEAT_DETERM_N n o (etac @{thm prop_restrict} THEN' atac)]; |
443 REPEAT_DETERM_N n o (etac @{thm prop_restrict} THEN' atac)]; |
448 |
444 |
449 fun mk_alg_tac (alg_set, (in_mono, (morE, map_cong0))) = EVERY' [rtac ballI, rtac CollectI, |
445 fun mk_alg_tac (alg_set, (in_mono, (morE, map_cong0))) = EVERY' [rtac ballI, rtac CollectI, |
450 REPEAT_DETERM o eresolve_tac [CollectE, conjE], rtac conjI, rtac (alg_min_alg RS alg_set), |
446 REPEAT_DETERM o eresolve_tac [CollectE, conjE], rtac conjI, rtac (alg_min_alg RS alg_set), |
451 REPEAT_DETERM_N m o rtac subset_UNIV, |
|
452 REPEAT_DETERM_N n o (etac subset_trans THEN' rtac @{thm Collect_restrict}), |
447 REPEAT_DETERM_N n o (etac subset_trans THEN' rtac @{thm Collect_restrict}), |
453 rtac trans, mor_tac morE in_mono, |
448 rtac trans, mor_tac morE in_mono, |
454 rtac trans, cong_tac map_cong0, |
449 rtac trans, cong_tac map_cong0, |
455 rtac sym, mor_tac morE in_mono]; |
450 rtac sym, mor_tac morE in_mono]; |
456 |
451 |
466 let |
461 let |
467 val n = length least_min_algs; |
462 val n = length least_min_algs; |
468 |
463 |
469 fun mk_alg_tac alg_set = EVERY' [rtac ballI, rtac CollectI, |
464 fun mk_alg_tac alg_set = EVERY' [rtac ballI, rtac CollectI, |
470 REPEAT_DETERM o eresolve_tac [CollectE, conjE], rtac conjI, rtac (alg_min_alg RS alg_set), |
465 REPEAT_DETERM o eresolve_tac [CollectE, conjE], rtac conjI, rtac (alg_min_alg RS alg_set), |
471 REPEAT_DETERM_N m o rtac subset_UNIV, |
|
472 REPEAT_DETERM_N n o (etac subset_trans THEN' rtac @{thm Collect_restrict}), |
466 REPEAT_DETERM_N n o (etac subset_trans THEN' rtac @{thm Collect_restrict}), |
473 rtac mp, etac bspec, rtac CollectI, |
467 rtac mp, etac bspec, rtac CollectI, |
474 REPEAT_DETERM_N m o (rtac conjI THEN' atac), |
468 REPEAT_DETERM_N m o (rtac conjI THEN' atac), |
475 CONJ_WRAP' (K (etac subset_trans THEN' rtac @{thm Collect_restrict})) alg_sets, |
469 CONJ_WRAP' (K (etac subset_trans THEN' rtac @{thm Collect_restrict})) alg_sets, |
476 CONJ_WRAP' (K (rtac ballI THEN' etac @{thm prop_restrict} THEN' atac)) alg_sets]; |
470 CONJ_WRAP' (K (rtac ballI THEN' etac @{thm prop_restrict} THEN' atac)) alg_sets]; |