author | wenzelm |
Sat, 30 Nov 2024 13:40:57 +0100 | |
changeset 81511 | 8cbc8bc6f382 |
parent 75624 | 22d1c5f2b9f4 |
permissions | -rw-r--r-- |
55061 | 1 |
(* Title: HOL/Tools/BNF/bnf_lfp_tactics.ML |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
2 |
Author: Dmitriy Traytel, TU Muenchen |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
3 |
Author: Andrei Popescu, TU Muenchen |
75624 | 4 |
Author: Jan van Brügge, TU Muenchen |
5 |
Copyright 2012, 2022 |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
6 |
|
58315 | 7 |
Tactics for the datatype construction. |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
8 |
*) |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
9 |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
10 |
signature BNF_LFP_TACTICS = |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
11 |
sig |
60728 | 12 |
val mk_alg_min_alg_tac: Proof.context -> int -> thm -> thm list -> thm -> thm -> thm list list -> |
13 |
thm list -> thm list -> tactic |
|
51798 | 14 |
val mk_alg_not_empty_tac: Proof.context -> thm -> thm list -> thm list -> tactic |
55197 | 15 |
val mk_alg_select_tac: Proof.context -> thm -> tactic |
60728 | 16 |
val mk_alg_set_tac: Proof.context -> thm -> tactic |
17 |
val mk_bd_card_order_tac: Proof.context -> thm list -> tactic |
|
18 |
val mk_bd_limit_tac: Proof.context -> int -> thm -> tactic |
|
19 |
val mk_card_of_min_alg_tac: Proof.context -> thm -> thm -> thm -> thm -> thm -> tactic |
|
20 |
val mk_copy_tac: Proof.context -> int -> thm -> thm -> thm list -> thm list list -> tactic |
|
51798 | 21 |
val mk_ctor_induct_tac: Proof.context -> int -> thm list list -> thm -> thm list -> thm -> |
22 |
thm list -> thm list -> thm list -> tactic |
|
55197 | 23 |
val mk_ctor_induct2_tac: Proof.context -> ctyp option list -> cterm option list -> thm -> |
24 |
thm list -> tactic |
|
60728 | 25 |
val mk_ctor_set_tac: Proof.context -> thm -> thm -> thm list -> tactic |
58444 | 26 |
val mk_ctor_rec_transfer_tac: Proof.context -> int -> int -> thm list -> thm list -> thm list -> |
27 |
thm list -> tactic |
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51812
diff
changeset
|
28 |
val mk_ctor_rel_tac: Proof.context -> thm list -> int -> thm -> thm -> thm -> thm -> thm list -> |
51798 | 29 |
thm -> thm -> thm list -> thm list -> thm list list -> tactic |
60728 | 30 |
val mk_dtor_o_ctor_tac: Proof.context -> thm -> thm -> thm -> thm -> thm list -> tactic |
56237 | 31 |
val mk_init_ex_mor_tac: Proof.context -> thm -> thm -> thm list -> thm -> thm -> thm -> thm -> |
55197 | 32 |
tactic |
60728 | 33 |
val mk_init_induct_tac: Proof.context -> int -> thm -> thm -> thm list -> thm list -> tactic |
34 |
val mk_init_unique_mor_tac: Proof.context -> cterm list -> int -> thm -> thm -> thm list -> |
|
35 |
thm list -> thm list -> thm list -> thm list -> tactic |
|
36 |
val mk_fold_unique_mor_tac: Proof.context -> thm list -> thm list -> thm list -> thm -> thm -> |
|
37 |
thm -> tactic |
|
55197 | 38 |
val mk_fold_transfer_tac: Proof.context -> int -> thm -> thm list -> thm list -> tactic |
60728 | 39 |
val mk_least_min_alg_tac: Proof.context -> thm -> thm -> tactic |
55197 | 40 |
val mk_le_rel_OO_tac: Proof.context -> int -> thm -> thm list -> thm list -> thm list -> |
41 |
thm list -> tactic |
|
60728 | 42 |
val mk_map_comp0_tac: Proof.context -> thm list -> thm list -> thm -> int -> tactic |
43 |
val mk_map_id0_tac: Proof.context -> thm list -> thm -> tactic |
|
44 |
val mk_map_tac: Proof.context -> int -> int -> thm -> thm -> thm -> tactic |
|
55197 | 45 |
val mk_ctor_map_unique_tac: Proof.context -> thm -> thm list -> tactic |
46 |
val mk_mcong_tac: Proof.context -> (int -> tactic) -> thm list list list -> thm list -> |
|
47 |
thm list -> tactic |
|
60728 | 48 |
val mk_min_algs_card_of_tac: Proof.context -> ctyp -> cterm -> int -> thm -> thm list -> |
49 |
thm list -> thm -> thm -> thm -> thm -> thm -> thm -> thm -> tactic |
|
50 |
val mk_min_algs_least_tac: Proof.context -> ctyp -> cterm -> thm -> thm list -> thm list -> tactic |
|
51798 | 51 |
val mk_min_algs_mono_tac: Proof.context -> thm -> tactic |
60728 | 52 |
val mk_min_algs_tac: Proof.context -> thm -> thm list -> tactic |
56263 | 53 |
val mk_mor_Abs_tac: Proof.context -> cterm list -> thm list -> thm list -> thm list -> thm list -> |
54 |
tactic |
|
56237 | 55 |
val mk_mor_Rep_tac: Proof.context -> int -> thm list -> thm list -> thm list -> thm -> thm list -> |
56 |
thm list list -> tactic |
|
60728 | 57 |
val mk_mor_UNIV_tac: Proof.context -> int -> thm list -> thm -> tactic |
58 |
val mk_mor_comp_tac: Proof.context -> thm -> thm list list -> thm list -> tactic |
|
59 |
val mk_mor_elim_tac: Proof.context -> thm -> tactic |
|
59498
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents:
58634
diff
changeset
|
60 |
val mk_mor_incl_tac: Proof.context -> thm -> thm list -> tactic |
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents:
58634
diff
changeset
|
61 |
val mk_mor_fold_tac: Proof.context -> ctyp -> cterm -> thm list -> thm -> thm -> tactic |
60728 | 62 |
val mk_mor_select_tac: Proof.context -> thm -> thm -> thm -> thm -> thm -> thm -> thm list -> |
63 |
thm list list -> thm list -> tactic |
|
64 |
val mk_mor_str_tac: Proof.context -> 'a list -> thm -> tactic |
|
55197 | 65 |
val mk_rel_induct_tac: Proof.context -> thm list -> int -> thm -> int list -> thm list -> |
66 |
thm list -> tactic |
|
67 |
val mk_rec_tac: Proof.context -> thm list -> thm -> thm list -> tactic |
|
68 |
val mk_rec_unique_mor_tac: Proof.context -> thm list -> thm list -> thm -> tactic |
|
75624 | 69 |
val mk_set_bd_tac: Proof.context -> int -> (int -> tactic) -> thm -> thm -> thm list list -> |
70 |
thm list -> int -> tactic |
|
55197 | 71 |
val mk_set_nat_tac: Proof.context -> int -> (int -> tactic) -> thm list list -> thm list -> |
72 |
cterm list -> thm list -> int -> tactic |
|
60728 | 73 |
val mk_set_map0_tac: Proof.context -> thm -> tactic |
74 |
val mk_set_tac: Proof.context -> thm -> tactic |
|
51798 | 75 |
val mk_wit_tac: Proof.context -> int -> thm list -> thm list -> tactic |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
76 |
end; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
77 |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
78 |
structure BNF_LFP_Tactics : BNF_LFP_TACTICS = |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
79 |
struct |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
80 |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
81 |
open BNF_Tactics |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
82 |
open BNF_LFP_Util |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
83 |
open BNF_Util |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
84 |
|
49306 | 85 |
val fst_snd_convs = @{thms fst_conv snd_conv}; |
86 |
val ord_eq_le_trans = @{thm ord_eq_le_trans}; |
|
87 |
val subset_trans = @{thm subset_trans}; |
|
88 |
val trans_fun_cong_image_id_id_apply = @{thm trans[OF fun_cong[OF image_id] id_apply]}; |
|
52659
58b87aa4dc3b
eliminate duplicated theorems (thanks to "Auto solve_direct" in jEdit)
traytel
parents:
52635
diff
changeset
|
89 |
val rev_bspec = Drule.rotate_prems 1 bspec; |
67399 | 90 |
val Un_cong = @{thm arg_cong2[of _ _ _ _ "(\<union>)"]}; |
56114 | 91 |
val relChainD = @{thm iffD2[OF meta_eq_to_obj_eq[OF relChain_def]]}; |
49306 | 92 |
|
60728 | 93 |
fun mk_alg_set_tac ctxt alg_def = |
94 |
EVERY' [dtac ctxt (alg_def RS iffD1), REPEAT_DETERM o etac ctxt conjE, etac ctxt bspec, rtac ctxt CollectI, |
|
60752 | 95 |
REPEAT_DETERM o (rtac ctxt (subset_UNIV RS conjI) ORELSE' etac ctxt conjI), assume_tac ctxt] 1; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
96 |
|
51798 | 97 |
fun mk_alg_not_empty_tac ctxt alg_set alg_sets wits = |
60728 | 98 |
(EVERY' [rtac ctxt notI, hyp_subst_tac ctxt, forward_tac ctxt [alg_set]] THEN' |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
99 |
REPEAT_DETERM o FIRST' |
60728 | 100 |
[EVERY' [rtac ctxt @{thm subset_emptyI}, eresolve_tac ctxt wits], |
101 |
EVERY' [rtac ctxt subsetI, rtac ctxt FalseE, eresolve_tac ctxt wits], |
|
102 |
EVERY' [rtac ctxt subsetI, dresolve_tac ctxt wits, hyp_subst_tac ctxt, |
|
60752 | 103 |
FIRST' (map (fn thm => rtac ctxt thm THEN' assume_tac ctxt) alg_sets)]] THEN' |
60728 | 104 |
etac ctxt @{thm emptyE}) 1; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
105 |
|
60728 | 106 |
fun mk_mor_elim_tac ctxt mor_def = |
107 |
(dtac ctxt (mor_def RS iffD1) THEN' |
|
108 |
REPEAT o etac ctxt conjE THEN' |
|
109 |
TRY o rtac ctxt @{thm image_subsetI} THEN' |
|
110 |
etac ctxt bspec THEN' |
|
60752 | 111 |
assume_tac ctxt) 1; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
112 |
|
59498
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents:
58634
diff
changeset
|
113 |
fun mk_mor_incl_tac ctxt mor_def map_ids = |
60728 | 114 |
(rtac ctxt (mor_def RS iffD2) THEN' |
115 |
rtac ctxt conjI THEN' |
|
116 |
CONJ_WRAP' (K (EVERY' [rtac ctxt ballI, etac ctxt set_mp, etac ctxt (id_apply RS @{thm ssubst_mem})])) |
|
56114 | 117 |
map_ids THEN' |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
118 |
CONJ_WRAP' (fn thm => |
60728 | 119 |
(EVERY' [rtac ctxt ballI, rtac ctxt trans, rtac ctxt id_apply, stac ctxt thm, rtac ctxt refl])) map_ids) 1; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
120 |
|
60728 | 121 |
fun mk_mor_comp_tac ctxt mor_def set_maps map_comp_ids = |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
122 |
let |
56114 | 123 |
val fbetw_tac = |
60752 | 124 |
EVERY' [rtac ctxt ballI, rtac ctxt (o_apply RS @{thm ssubst_mem}), |
125 |
etac ctxt bspec, etac ctxt bspec, assume_tac ctxt]; |
|
53290 | 126 |
fun mor_tac (set_map, map_comp_id) = |
60728 | 127 |
EVERY' [rtac ctxt ballI, rtac ctxt (o_apply RS trans), rtac ctxt trans, |
60752 | 128 |
rtac ctxt trans, dtac ctxt rev_bspec, assume_tac ctxt, etac ctxt arg_cong, |
60757 | 129 |
REPEAT o eresolve_tac ctxt [CollectE, conjE], etac ctxt bspec, rtac ctxt CollectI] THEN' |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
130 |
CONJ_WRAP' (fn thm => |
60728 | 131 |
FIRST' [rtac ctxt subset_UNIV, |
132 |
(EVERY' [rtac ctxt ord_eq_le_trans, rtac ctxt thm, rtac ctxt @{thm image_subsetI}, |
|
60752 | 133 |
etac ctxt bspec, etac ctxt set_mp, assume_tac ctxt])]) set_map THEN' |
60728 | 134 |
rtac ctxt (map_comp_id RS arg_cong); |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
135 |
in |
60728 | 136 |
(dtac ctxt (mor_def RS iffD1) THEN' dtac ctxt (mor_def RS iffD1) THEN' rtac ctxt (mor_def RS iffD2) THEN' |
137 |
REPEAT o etac ctxt conjE THEN' |
|
138 |
rtac ctxt conjI THEN' |
|
53290 | 139 |
CONJ_WRAP' (K fbetw_tac) set_maps THEN' |
140 |
CONJ_WRAP' mor_tac (set_maps ~~ map_comp_ids)) 1 |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
141 |
end; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
142 |
|
60728 | 143 |
fun mk_mor_str_tac ctxt ks mor_def = |
144 |
(rtac ctxt (mor_def RS iffD2) THEN' rtac ctxt conjI THEN' |
|
145 |
CONJ_WRAP' (K (EVERY' [rtac ctxt ballI, rtac ctxt UNIV_I])) ks THEN' |
|
146 |
CONJ_WRAP' (K (EVERY' [rtac ctxt ballI, rtac ctxt refl])) ks) 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
147 |
|
60728 | 148 |
fun mk_mor_UNIV_tac ctxt m morEs mor_def = |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
149 |
let |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
150 |
val n = length morEs; |
60728 | 151 |
fun mor_tac morE = EVERY' [rtac ctxt @{thm ext}, rtac ctxt trans, rtac ctxt o_apply, rtac ctxt trans, etac ctxt morE, |
152 |
rtac ctxt CollectI, CONJ_WRAP' (K (rtac ctxt subset_UNIV)) (1 upto m + n), |
|
153 |
rtac ctxt sym, rtac ctxt o_apply]; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
154 |
in |
60728 | 155 |
EVERY' [rtac ctxt iffI, CONJ_WRAP' mor_tac morEs, |
156 |
rtac ctxt (mor_def RS iffD2), rtac ctxt conjI, CONJ_WRAP' (K (rtac ctxt ballI THEN' rtac ctxt UNIV_I)) morEs, |
|
157 |
REPEAT_DETERM o etac ctxt conjE, REPEAT_DETERM_N n o dtac ctxt (@{thm fun_eq_iff} RS iffD1), |
|
158 |
CONJ_WRAP' (K (EVERY' [rtac ctxt ballI, REPEAT_DETERM o etac ctxt allE, rtac ctxt trans, |
|
159 |
etac ctxt (o_apply RS sym RS trans), rtac ctxt o_apply])) morEs] 1 |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
160 |
end; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
161 |
|
60728 | 162 |
fun mk_copy_tac ctxt m alg_def mor_def alg_sets set_mapss = |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
163 |
let |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
164 |
val n = length alg_sets; |
56237 | 165 |
fun set_tac thm = |
60728 | 166 |
EVERY' [rtac ctxt ord_eq_le_trans, rtac ctxt thm, rtac ctxt subset_trans, etac ctxt @{thm image_mono}, |
62906 | 167 |
rtac ctxt equalityD1, etac ctxt @{thm bij_betw_imp_surj_on}]; |
56237 | 168 |
val alg_tac = |
169 |
CONJ_WRAP' (fn (set_maps, alg_set) => |
|
60757 | 170 |
EVERY' [rtac ctxt ballI, REPEAT_DETERM o eresolve_tac ctxt [CollectE, conjE], rtac ctxt set_mp, |
62906 | 171 |
rtac ctxt equalityD1, etac ctxt @{thm bij_betw_imp_surj_on[OF bij_betw_the_inv_into]}, |
60728 | 172 |
rtac ctxt imageI, etac ctxt alg_set, EVERY' (map set_tac (drop m set_maps))]) |
56237 | 173 |
(set_mapss ~~ alg_sets); |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
174 |
|
60728 | 175 |
val mor_tac = rtac ctxt conjI THEN' CONJ_WRAP' (K (etac ctxt @{thm bij_betwE})) alg_sets THEN' |
56237 | 176 |
CONJ_WRAP' (fn (set_maps, alg_set) => |
60757 | 177 |
EVERY' [rtac ctxt ballI, REPEAT_DETERM o eresolve_tac ctxt [CollectE, conjE], |
60728 | 178 |
etac ctxt @{thm f_the_inv_into_f_bij_betw}, etac ctxt alg_set, |
56237 | 179 |
EVERY' (map set_tac (drop m set_maps))]) |
180 |
(set_mapss ~~ alg_sets); |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
181 |
in |
60728 | 182 |
(REPEAT_DETERM_N n o rtac ctxt exI THEN' rtac ctxt conjI THEN' |
183 |
rtac ctxt (alg_def RS iffD2) THEN' alg_tac THEN' rtac ctxt (mor_def RS iffD2) THEN' mor_tac) 1 |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
184 |
end; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
185 |
|
60728 | 186 |
fun mk_bd_limit_tac ctxt n bd_Cinfinite = |
187 |
EVERY' [REPEAT_DETERM o etac ctxt conjE, rtac ctxt rev_mp, rtac ctxt @{thm Cinfinite_limit_finite}, |
|
188 |
REPEAT_DETERM_N n o rtac ctxt @{thm finite.insertI}, rtac ctxt @{thm finite.emptyI}, |
|
189 |
REPEAT_DETERM_N n o etac ctxt @{thm insert_subsetI}, rtac ctxt @{thm empty_subsetI}, |
|
190 |
rtac ctxt bd_Cinfinite, rtac ctxt impI, etac ctxt bexE, rtac ctxt bexI, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
191 |
CONJ_WRAP' (fn i => |
60728 | 192 |
EVERY' [etac ctxt bspec, REPEAT_DETERM_N i o rtac ctxt @{thm insertI2}, rtac ctxt @{thm insertI1}]) |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
193 |
(0 upto n - 1), |
60752 | 194 |
assume_tac ctxt] 1; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
195 |
|
60728 | 196 |
fun mk_min_algs_tac ctxt worel in_congs = |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
197 |
let |
60752 | 198 |
val minG_tac = EVERY' [rtac ctxt @{thm SUP_cong}, rtac ctxt refl, dtac ctxt bspec, |
199 |
assume_tac ctxt, etac ctxt arg_cong]; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
200 |
fun minH_tac thm = |
60728 | 201 |
EVERY' [rtac ctxt Un_cong, minG_tac, rtac ctxt @{thm image_cong}, rtac ctxt thm, |
202 |
REPEAT_DETERM_N (length in_congs) o minG_tac, rtac ctxt refl]; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
203 |
in |
60728 | 204 |
(rtac ctxt (worel RS (@{thm wo_rel.worec_fixpoint} RS fun_cong)) THEN' rtac ctxt iffD2 THEN' |
205 |
rtac ctxt meta_eq_to_obj_eq THEN' rtac ctxt (worel RS @{thm wo_rel.adm_wo_def}) THEN' |
|
206 |
REPEAT_DETERM_N 3 o rtac ctxt allI THEN' rtac ctxt impI THEN' |
|
207 |
CONJ_WRAP_GEN' (EVERY' [rtac ctxt prod_injectI, rtac ctxt conjI]) minH_tac in_congs) 1 |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
208 |
end; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
209 |
|
60728 | 210 |
fun mk_min_algs_mono_tac ctxt min_algs = EVERY' [rtac ctxt relChainD, rtac ctxt allI, rtac ctxt allI, rtac ctxt impI, |
211 |
rtac ctxt @{thm case_split}, rtac ctxt @{thm xt1(3)}, rtac ctxt min_algs, etac ctxt @{thm FieldI2}, rtac ctxt subsetI, |
|
60752 | 212 |
rtac ctxt UnI1, rtac ctxt @{thm UN_I}, etac ctxt @{thm underS_I}, assume_tac ctxt, |
213 |
assume_tac ctxt, rtac ctxt equalityD1, dtac ctxt @{thm notnotD}, |
|
214 |
hyp_subst_tac ctxt, rtac ctxt refl] 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
215 |
|
60728 | 216 |
fun mk_min_algs_card_of_tac ctxt cT ct m worel min_algs in_bds bd_Card_order bd_Cnotzero |
51812 | 217 |
suc_Card_order suc_Cinfinite suc_Cnotzero suc_Asuc Asuc_Cinfinite = |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
218 |
let |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
219 |
val induct = worel RS |
60801 | 220 |
Thm.instantiate' [SOME cT] [NONE, SOME ct] @{thm well_order_induct_imp}; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
221 |
val src = 1 upto m + 1; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
222 |
val dest = (m + 1) :: (1 upto m); |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
223 |
val absorbAs_tac = if m = 0 then K (all_tac) |
60728 | 224 |
else EVERY' [rtac ctxt @{thm ordIso_transitive}, rtac ctxt @{thm csum_cong1}, |
225 |
rtac ctxt @{thm ordIso_transitive}, |
|
226 |
BNF_Tactics.mk_rotate_eq_tac ctxt (rtac ctxt @{thm ordIso_refl} THEN' |
|
227 |
FIRST' [rtac ctxt @{thm card_of_Card_order}, rtac ctxt @{thm Card_order_csum}, |
|
228 |
rtac ctxt @{thm Card_order_cexp}]) |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
229 |
@{thm ordIso_transitive} @{thm csum_assoc} @{thm csum_com} @{thm csum_cong} |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
230 |
src dest, |
60728 | 231 |
rtac ctxt @{thm csum_absorb1}, rtac ctxt Asuc_Cinfinite, rtac ctxt ctrans, rtac ctxt @{thm ordLeq_csum1}, |
232 |
FIRST' [rtac ctxt @{thm Card_order_csum}, rtac ctxt @{thm card_of_Card_order}], |
|
233 |
rtac ctxt @{thm ordLeq_cexp1}, rtac ctxt suc_Cnotzero, rtac ctxt @{thm Card_order_csum}]; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
234 |
|
60728 | 235 |
val minG_tac = EVERY' [rtac ctxt @{thm UNION_Cinfinite_bound}, rtac ctxt @{thm ordLess_imp_ordLeq}, |
236 |
rtac ctxt @{thm ordLess_transitive}, rtac ctxt @{thm card_of_underS}, rtac ctxt suc_Card_order, |
|
60752 | 237 |
assume_tac ctxt, rtac ctxt suc_Asuc, rtac ctxt ballI, etac ctxt allE, |
238 |
dtac ctxt mp, etac ctxt @{thm underS_E}, |
|
239 |
dtac ctxt mp, etac ctxt @{thm underS_Field}, |
|
240 |
REPEAT o etac ctxt conjE, assume_tac ctxt, rtac ctxt Asuc_Cinfinite] |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
241 |
|
60728 | 242 |
fun mk_minH_tac (min_alg, in_bd) = EVERY' [rtac ctxt @{thm ordIso_ordLeq_trans}, |
243 |
rtac ctxt @{thm card_of_ordIso_subst}, etac ctxt min_alg, rtac ctxt @{thm Un_Cinfinite_bound}, |
|
244 |
minG_tac, rtac ctxt ctrans, rtac ctxt @{thm card_of_image}, rtac ctxt ctrans, rtac ctxt in_bd, rtac ctxt ctrans, |
|
245 |
rtac ctxt @{thm cexp_mono1}, rtac ctxt @{thm csum_mono1}, |
|
246 |
REPEAT_DETERM_N m o rtac ctxt @{thm csum_mono2}, |
|
247 |
CONJ_WRAP_GEN' (rtac ctxt @{thm csum_cinfinite_bound}) (K minG_tac) min_algs, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
248 |
REPEAT_DETERM o FIRST' |
60728 | 249 |
[rtac ctxt @{thm card_of_Card_order}, rtac ctxt @{thm Card_order_csum}, |
250 |
rtac ctxt Asuc_Cinfinite, rtac ctxt bd_Card_order], |
|
251 |
rtac ctxt @{thm ordIso_ordLeq_trans}, rtac ctxt @{thm cexp_cong1}, absorbAs_tac, |
|
252 |
rtac ctxt @{thm csum_absorb1}, rtac ctxt Asuc_Cinfinite, rtac ctxt @{thm ctwo_ordLeq_Cinfinite}, |
|
253 |
rtac ctxt Asuc_Cinfinite, rtac ctxt bd_Card_order, |
|
254 |
rtac ctxt @{thm ordIso_imp_ordLeq}, rtac ctxt @{thm cexp_cprod_ordLeq}, |
|
60757 | 255 |
resolve_tac ctxt @{thms Card_order_csum Card_order_ctwo}, rtac ctxt suc_Cinfinite, |
60728 | 256 |
rtac ctxt bd_Cnotzero, rtac ctxt @{thm cardSuc_ordLeq}, rtac ctxt bd_Card_order, rtac ctxt Asuc_Cinfinite]; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
257 |
in |
60728 | 258 |
(rtac ctxt induct THEN' |
259 |
rtac ctxt impI THEN' |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
260 |
CONJ_WRAP' mk_minH_tac (min_algs ~~ in_bds)) 1 |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
261 |
end; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
262 |
|
60728 | 263 |
fun mk_min_algs_least_tac ctxt cT ct worel min_algs alg_sets = |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
264 |
let |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
265 |
val induct = worel RS |
60801 | 266 |
Thm.instantiate' [SOME cT] [NONE, SOME ct] @{thm well_order_induct_imp}; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
267 |
|
60752 | 268 |
val minG_tac = |
269 |
EVERY' [rtac ctxt @{thm UN_least}, etac ctxt allE, dtac ctxt mp, etac ctxt @{thm underS_E}, |
|
270 |
dtac ctxt mp, etac ctxt @{thm underS_Field}, REPEAT_DETERM o etac ctxt conjE, assume_tac ctxt]; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
271 |
|
60728 | 272 |
fun mk_minH_tac (min_alg, alg_set) = EVERY' [rtac ctxt ord_eq_le_trans, etac ctxt min_alg, |
273 |
rtac ctxt @{thm Un_least}, minG_tac, rtac ctxt @{thm image_subsetI}, |
|
60757 | 274 |
REPEAT_DETERM o eresolve_tac ctxt [CollectE, conjE], etac ctxt alg_set, |
60728 | 275 |
REPEAT_DETERM o (etac ctxt subset_trans THEN' minG_tac)]; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
276 |
in |
60728 | 277 |
(rtac ctxt induct THEN' |
278 |
rtac ctxt impI THEN' |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
279 |
CONJ_WRAP' mk_minH_tac (min_algs ~~ alg_sets)) 1 |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
280 |
end; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
281 |
|
60728 | 282 |
fun mk_alg_min_alg_tac ctxt m alg_def min_alg_defs bd_limit bd_Cinfinite |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
283 |
set_bdss min_algs min_alg_monos = |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
284 |
let |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
285 |
val n = length min_algs; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
286 |
fun mk_cardSuc_UNION_tac set_bds (mono, def) = EVERY' |
60728 | 287 |
[rtac ctxt bexE, rtac ctxt @{thm cardSuc_UNION_Cinfinite}, rtac ctxt bd_Cinfinite, rtac ctxt mono, |
60757 | 288 |
etac ctxt (def RSN (2, @{thm subset_trans[OF _ equalityD1]})), resolve_tac ctxt set_bds]; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
289 |
fun mk_conjunct_tac (set_bds, (min_alg, min_alg_def)) = |
60757 | 290 |
EVERY' [rtac ctxt ballI, REPEAT_DETERM o eresolve_tac ctxt [CollectE, conjE], |
60728 | 291 |
EVERY' (map (mk_cardSuc_UNION_tac set_bds) (min_alg_monos ~~ min_alg_defs)), rtac ctxt bexE, |
60752 | 292 |
rtac ctxt bd_limit, REPEAT_DETERM_N (n - 1) o etac ctxt conjI, assume_tac ctxt, |
60728 | 293 |
rtac ctxt (min_alg_def RS @{thm set_mp[OF equalityD2]}), |
60752 | 294 |
rtac ctxt @{thm UN_I}, REPEAT_DETERM_N (m + 3 * n) o etac ctxt thin_rl, |
295 |
assume_tac ctxt, rtac ctxt set_mp, |
|
296 |
rtac ctxt equalityD2, rtac ctxt min_alg, assume_tac ctxt, rtac ctxt UnI2, |
|
297 |
rtac ctxt @{thm image_eqI}, rtac ctxt refl, |
|
60728 | 298 |
rtac ctxt CollectI, REPEAT_DETERM_N m o dtac ctxt asm_rl, REPEAT_DETERM_N n o etac ctxt thin_rl, |
299 |
REPEAT_DETERM o etac ctxt conjE, |
|
60752 | 300 |
CONJ_WRAP' (K (FIRST' [assume_tac ctxt, |
60728 | 301 |
EVERY' [etac ctxt subset_trans, rtac ctxt subsetI, rtac ctxt @{thm UN_I}, |
60752 | 302 |
etac ctxt @{thm underS_I}, assume_tac ctxt, assume_tac ctxt]])) |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
303 |
set_bds]; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
304 |
in |
60728 | 305 |
(rtac ctxt (alg_def RS iffD2) THEN' |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
306 |
CONJ_WRAP' mk_conjunct_tac (set_bdss ~~ (min_algs ~~ min_alg_defs))) 1 |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
307 |
end; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
308 |
|
60728 | 309 |
fun mk_card_of_min_alg_tac ctxt min_alg_def card_of suc_Card_order suc_Asuc Asuc_Cinfinite = |
310 |
EVERY' [rtac ctxt @{thm ordIso_ordLeq_trans}, rtac ctxt (min_alg_def RS @{thm card_of_ordIso_subst}), |
|
311 |
rtac ctxt @{thm UNION_Cinfinite_bound}, rtac ctxt @{thm ordIso_ordLeq_trans}, |
|
312 |
rtac ctxt @{thm card_of_Field_ordIso}, rtac ctxt suc_Card_order, rtac ctxt @{thm ordLess_imp_ordLeq}, |
|
60752 | 313 |
rtac ctxt suc_Asuc, rtac ctxt ballI, dtac ctxt rev_mp, rtac ctxt card_of, |
314 |
REPEAT_DETERM o etac ctxt conjE, assume_tac ctxt, rtac ctxt Asuc_Cinfinite] 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
315 |
|
60728 | 316 |
fun mk_least_min_alg_tac ctxt min_alg_def least = |
60752 | 317 |
EVERY' [rtac ctxt (min_alg_def RS ord_eq_le_trans), rtac ctxt @{thm UN_least}, |
318 |
dtac ctxt least, dtac ctxt mp, assume_tac ctxt, |
|
319 |
REPEAT_DETERM o etac ctxt conjE, assume_tac ctxt] 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
320 |
|
55197 | 321 |
fun mk_alg_select_tac ctxt Abs_inverse = |
60728 | 322 |
EVERY' [rtac ctxt ballI, |
59498
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents:
58634
diff
changeset
|
323 |
REPEAT_DETERM o eresolve_tac ctxt [CollectE, exE, conjE], hyp_subst_tac ctxt] 1 THEN |
60752 | 324 |
unfold_thms_tac ctxt (Abs_inverse :: fst_snd_convs) THEN assume_tac ctxt 1; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
325 |
|
60728 | 326 |
fun mk_mor_select_tac ctxt mor_def mor_cong mor_comp mor_incl_min_alg alg_def alg_select alg_sets |
53290 | 327 |
set_maps str_init_defs = |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
328 |
let |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
329 |
val n = length alg_sets; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
330 |
val fbetw_tac = |
60752 | 331 |
CONJ_WRAP' |
332 |
(K (EVERY' [rtac ctxt ballI, etac ctxt rev_bspec, |
|
333 |
etac ctxt CollectE, assume_tac ctxt])) alg_sets; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
334 |
val mor_tac = |
60728 | 335 |
CONJ_WRAP' (fn thm => EVERY' [rtac ctxt ballI, rtac ctxt thm]) str_init_defs; |
53290 | 336 |
fun alg_epi_tac ((alg_set, str_init_def), set_map) = |
60757 | 337 |
EVERY' [rtac ctxt ballI, REPEAT_DETERM o eresolve_tac ctxt [CollectE, conjE], rtac ctxt CollectI, |
60777 | 338 |
rtac ctxt ballI, forward_tac ctxt [alg_select RS bspec], |
339 |
rtac ctxt (str_init_def RS @{thm ssubst_mem}), |
|
60757 | 340 |
etac ctxt alg_set, REPEAT_DETERM o EVERY' [rtac ctxt ord_eq_le_trans, resolve_tac ctxt set_map, |
60728 | 341 |
rtac ctxt subset_trans, etac ctxt @{thm image_mono}, rtac ctxt @{thm image_Collect_subsetI}, etac ctxt bspec, |
60752 | 342 |
assume_tac ctxt]]; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
343 |
in |
60728 | 344 |
EVERY' [rtac ctxt mor_cong, REPEAT_DETERM_N n o (rtac ctxt sym THEN' rtac ctxt @{thm comp_id}), |
345 |
rtac ctxt (Thm.permute_prems 0 1 mor_comp), etac ctxt (Thm.permute_prems 0 1 mor_comp), |
|
346 |
rtac ctxt (mor_def RS iffD2), rtac ctxt conjI, fbetw_tac, mor_tac, rtac ctxt mor_incl_min_alg, |
|
347 |
rtac ctxt (alg_def RS iffD2), CONJ_WRAP' alg_epi_tac ((alg_sets ~~ str_init_defs) ~~ set_maps)] 1 |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
348 |
end; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
349 |
|
56237 | 350 |
fun mk_init_ex_mor_tac ctxt Abs_inverse copy card_of_min_algs mor_Rep mor_comp mor_select mor_incl = |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
351 |
let |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
352 |
val n = length card_of_min_algs; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
353 |
in |
61841
4d3527b94f2a
more general types Proof.method / context_tactic;
wenzelm
parents:
61424
diff
changeset
|
354 |
EVERY' [Method.insert_tac ctxt (map (fn thm => thm RS @{thm ex_bij_betw}) card_of_min_algs), |
61334
8d40ddaa427f
collect the names from goals in favor of fragile exports
traytel
parents:
60801
diff
changeset
|
355 |
REPEAT_DETERM o dtac ctxt meta_spec, REPEAT_DETERM o etac ctxt exE, rtac ctxt rev_mp, |
8d40ddaa427f
collect the names from goals in favor of fragile exports
traytel
parents:
60801
diff
changeset
|
356 |
rtac ctxt copy, REPEAT_DETERM_N n o assume_tac ctxt, |
60757 | 357 |
rtac ctxt impI, REPEAT_DETERM o eresolve_tac ctxt [exE, conjE], REPEAT_DETERM_N n o rtac ctxt exI, |
60728 | 358 |
rtac ctxt mor_comp, rtac ctxt mor_Rep, rtac ctxt mor_select, rtac ctxt CollectI, REPEAT_DETERM o rtac ctxt exI, |
60752 | 359 |
rtac ctxt conjI, rtac ctxt refl, assume_tac ctxt, |
56237 | 360 |
SELECT_GOAL (unfold_thms_tac ctxt (Abs_inverse :: fst_snd_convs)), |
60728 | 361 |
etac ctxt mor_comp, rtac ctxt mor_incl, REPEAT_DETERM_N n o rtac ctxt subset_UNIV] 1 |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
362 |
end; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
363 |
|
60728 | 364 |
fun mk_init_unique_mor_tac ctxt cts m |
51761
4c9f08836d87
renamed "map_cong" axiom to "map_cong0" in preparation for real "map_cong"
blanchet
parents:
51739
diff
changeset
|
365 |
alg_def alg_min_alg least_min_algs in_monos alg_sets morEs map_cong0s = |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
366 |
let |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
367 |
val n = length least_min_algs; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
368 |
val ks = (1 upto n); |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
369 |
|
60728 | 370 |
fun mor_tac morE in_mono = EVERY' [etac ctxt morE, rtac ctxt set_mp, rtac ctxt in_mono, |
371 |
REPEAT_DETERM_N n o rtac ctxt @{thm Collect_restrict}, rtac ctxt CollectI, |
|
60752 | 372 |
REPEAT_DETERM_N (m + n) o (TRY o rtac ctxt conjI THEN' assume_tac ctxt)]; |
56263 | 373 |
fun cong_tac ct map_cong0 = EVERY' |
60784 | 374 |
[rtac ctxt (map_cong0 RS infer_instantiate' ctxt [NONE, NONE, SOME ct] arg_cong), |
60728 | 375 |
REPEAT_DETERM_N m o rtac ctxt refl, |
60752 | 376 |
REPEAT_DETERM_N n o (etac ctxt @{thm prop_restrict} THEN' assume_tac ctxt)]; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
377 |
|
56263 | 378 |
fun mk_alg_tac (ct, (alg_set, (in_mono, (morE, map_cong0)))) = |
60728 | 379 |
EVERY' [rtac ctxt ballI, rtac ctxt CollectI, |
60757 | 380 |
REPEAT_DETERM o eresolve_tac ctxt [CollectE, conjE], rtac ctxt conjI, rtac ctxt (alg_min_alg RS alg_set), |
60728 | 381 |
REPEAT_DETERM_N n o (etac ctxt subset_trans THEN' rtac ctxt @{thm Collect_restrict}), |
382 |
rtac ctxt trans, mor_tac morE in_mono, |
|
383 |
rtac ctxt trans, cong_tac ct map_cong0, |
|
384 |
rtac ctxt sym, mor_tac morE in_mono]; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
385 |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
386 |
fun mk_unique_tac (k, least_min_alg) = |
60728 | 387 |
select_prem_tac ctxt n (etac ctxt @{thm prop_restrict}) k THEN' rtac ctxt least_min_alg THEN' |
388 |
rtac ctxt (alg_def RS iffD2) THEN' |
|
56263 | 389 |
CONJ_WRAP' mk_alg_tac (cts ~~ (alg_sets ~~ (in_monos ~~ (morEs ~~ map_cong0s)))); |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
390 |
in |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
391 |
CONJ_WRAP' mk_unique_tac (ks ~~ least_min_algs) 1 |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
392 |
end; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
393 |
|
60728 | 394 |
fun mk_init_induct_tac ctxt m alg_def alg_min_alg least_min_algs alg_sets = |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
395 |
let |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
396 |
val n = length least_min_algs; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
397 |
|
60728 | 398 |
fun mk_alg_tac alg_set = EVERY' [rtac ctxt ballI, rtac ctxt CollectI, |
60757 | 399 |
REPEAT_DETERM o eresolve_tac ctxt [CollectE, conjE], rtac ctxt conjI, rtac ctxt (alg_min_alg RS alg_set), |
60728 | 400 |
REPEAT_DETERM_N n o (etac ctxt subset_trans THEN' rtac ctxt @{thm Collect_restrict}), |
401 |
rtac ctxt mp, etac ctxt bspec, rtac ctxt CollectI, |
|
60752 | 402 |
REPEAT_DETERM_N m o (rtac ctxt conjI THEN' assume_tac ctxt), |
60728 | 403 |
CONJ_WRAP' (K (etac ctxt subset_trans THEN' rtac ctxt @{thm Collect_restrict})) alg_sets, |
60752 | 404 |
CONJ_WRAP' (K (rtac ctxt ballI THEN' etac ctxt @{thm prop_restrict} THEN' assume_tac ctxt)) |
405 |
alg_sets]; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
406 |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
407 |
fun mk_induct_tac least_min_alg = |
60728 | 408 |
rtac ctxt ballI THEN' etac ctxt @{thm prop_restrict} THEN' rtac ctxt least_min_alg THEN' |
409 |
rtac ctxt (alg_def RS iffD2) THEN' |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
410 |
CONJ_WRAP' mk_alg_tac alg_sets; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
411 |
in |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
412 |
CONJ_WRAP' mk_induct_tac least_min_algs 1 |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
413 |
end; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
414 |
|
56237 | 415 |
fun mk_mor_Rep_tac ctxt m defs Reps Abs_inverses alg_min_alg alg_sets set_mapss = |
416 |
unfold_thms_tac ctxt (@{thm o_apply} :: defs) THEN |
|
60728 | 417 |
EVERY' [rtac ctxt conjI, |
418 |
CONJ_WRAP' (fn thm => rtac ctxt ballI THEN' rtac ctxt thm) Reps, |
|
56237 | 419 |
CONJ_WRAP' (fn (Abs_inverse, (set_maps, alg_set)) => |
60728 | 420 |
EVERY' [rtac ctxt ballI, rtac ctxt Abs_inverse, rtac ctxt (alg_min_alg RS alg_set), |
56237 | 421 |
EVERY' (map2 (fn Rep => fn set_map => |
60728 | 422 |
EVERY' [rtac ctxt (set_map RS ord_eq_le_trans), rtac ctxt @{thm image_subsetI}, rtac ctxt Rep]) |
56237 | 423 |
Reps (drop m set_maps))]) |
424 |
(Abs_inverses ~~ (set_mapss ~~ alg_sets))] 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
425 |
|
56237 | 426 |
fun mk_mor_Abs_tac ctxt cts defs Abs_inverses map_comp_ids map_congLs = |
427 |
unfold_thms_tac ctxt (@{thm o_apply} :: defs) THEN |
|
60728 | 428 |
EVERY' [rtac ctxt conjI, |
429 |
CONJ_WRAP' (K (rtac ctxt ballI THEN' rtac ctxt UNIV_I)) Abs_inverses, |
|
56237 | 430 |
CONJ_WRAP' (fn (ct, thm) => |
60728 | 431 |
EVERY' [rtac ctxt ballI, REPEAT_DETERM o eresolve_tac ctxt [CollectE, conjE], |
60784 | 432 |
rtac ctxt (thm RS (infer_instantiate' ctxt [NONE, NONE, SOME ct] arg_cong) RS sym), |
56237 | 433 |
EVERY' (map (fn Abs_inverse => |
60752 | 434 |
EVERY' [rtac ctxt (o_apply RS trans RS ballI), etac ctxt (set_mp RS Abs_inverse), |
435 |
assume_tac ctxt]) |
|
56237 | 436 |
Abs_inverses)]) |
63568 | 437 |
(cts ~~ map2 mk_trans map_comp_ids map_congLs)] 1; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
438 |
|
59498
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents:
58634
diff
changeset
|
439 |
fun mk_mor_fold_tac ctxt cT ct fold_defs ex_mor mor = |
60728 | 440 |
(EVERY' (map (stac ctxt) fold_defs) THEN' EVERY' [rtac ctxt rev_mp, rtac ctxt ex_mor, rtac ctxt impI] THEN' |
441 |
REPEAT_DETERM_N (length fold_defs) o etac ctxt exE THEN' |
|
60801 | 442 |
rtac ctxt (Thm.instantiate' [SOME cT] [SOME ct] @{thm someI}) THEN' etac ctxt mor) 1; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
443 |
|
60728 | 444 |
fun mk_fold_unique_mor_tac ctxt type_defs init_unique_mors Reps mor_comp mor_Abs mor_fold = |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
445 |
let |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
446 |
fun mk_unique type_def = |
60728 | 447 |
EVERY' [rtac ctxt @{thm surj_fun_eq}, rtac ctxt (type_def RS @{thm type_definition.Abs_image}), |
60757 | 448 |
rtac ctxt ballI, resolve_tac ctxt init_unique_mors, |
60752 | 449 |
EVERY' (map (fn thm => assume_tac ctxt ORELSE' rtac ctxt thm) Reps), |
450 |
rtac ctxt mor_comp, rtac ctxt mor_Abs, assume_tac ctxt, |
|
60728 | 451 |
rtac ctxt mor_comp, rtac ctxt mor_Abs, rtac ctxt mor_fold]; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
452 |
in |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
453 |
CONJ_WRAP' mk_unique type_defs 1 |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
454 |
end; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
455 |
|
60728 | 456 |
fun mk_dtor_o_ctor_tac ctxt dtor_def foldx map_comp_id map_cong0L ctor_o_folds = |
457 |
EVERY' [rtac ctxt @{thm ext}, rtac ctxt trans, rtac ctxt o_apply, rtac ctxt (dtor_def RS fun_cong RS trans), |
|
458 |
rtac ctxt trans, rtac ctxt foldx, rtac ctxt trans, rtac ctxt map_comp_id, rtac ctxt trans, rtac ctxt map_cong0L, |
|
459 |
EVERY' (map (fn thm => rtac ctxt ballI THEN' rtac ctxt (trans OF [thm RS fun_cong, id_apply])) |
|
49504
df9b897fb254
renamed "iter"/"coiter" to "fold"/"unfold" (cf. Wadler)
blanchet
parents:
49502
diff
changeset
|
460 |
ctor_o_folds), |
60728 | 461 |
rtac ctxt sym, rtac ctxt id_apply] 1; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
462 |
|
55197 | 463 |
fun mk_rec_tac ctxt rec_defs foldx fst_recs = |
49504
df9b897fb254
renamed "iter"/"coiter" to "fold"/"unfold" (cf. Wadler)
blanchet
parents:
49502
diff
changeset
|
464 |
unfold_thms_tac ctxt |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
465 |
(rec_defs @ map (fn thm => thm RS @{thm convol_expand_snd}) fst_recs) THEN |
60728 | 466 |
EVERY' [rtac ctxt trans, rtac ctxt o_apply, rtac ctxt trans, rtac ctxt (foldx RS @{thm arg_cong[of _ _ snd]}), |
467 |
rtac ctxt @{thm snd_convol'}] 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
468 |
|
55197 | 469 |
fun mk_rec_unique_mor_tac ctxt rec_defs fst_recs fold_unique_mor = |
51739
3514b90d0a8b
(co)rec is (just as the (un)fold) the unique morphism;
traytel
parents:
49585
diff
changeset
|
470 |
unfold_thms_tac ctxt |
3514b90d0a8b
(co)rec is (just as the (un)fold) the unique morphism;
traytel
parents:
49585
diff
changeset
|
471 |
(rec_defs @ map (fn thm => thm RS @{thm convol_expand_snd'}) fst_recs) THEN |
60728 | 472 |
etac ctxt fold_unique_mor 1; |
51739
3514b90d0a8b
(co)rec is (just as the (un)fold) the unique morphism;
traytel
parents:
49585
diff
changeset
|
473 |
|
53290 | 474 |
fun mk_ctor_induct_tac ctxt m set_mapss init_induct morEs mor_Abs Rep_invs Abs_invs Reps = |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
475 |
let |
53290 | 476 |
val n = length set_mapss; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
477 |
val ks = 1 upto n; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
478 |
|
53290 | 479 |
fun mk_IH_tac Rep_inv Abs_inv set_map = |
60728 | 480 |
DETERM o EVERY' [dtac ctxt meta_mp, rtac ctxt (Rep_inv RS arg_cong RS iffD1), etac ctxt bspec, |
481 |
dtac ctxt set_rev_mp, rtac ctxt equalityD1, rtac ctxt set_map, etac ctxt imageE, |
|
60752 | 482 |
hyp_subst_tac ctxt, rtac ctxt (Abs_inv RS @{thm ssubst_mem}), etac ctxt set_mp, |
483 |
assume_tac ctxt, assume_tac ctxt]; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
484 |
|
53290 | 485 |
fun mk_closed_tac (k, (morE, set_maps)) = |
60728 | 486 |
EVERY' [select_prem_tac ctxt n (dtac ctxt asm_rl) k, rtac ctxt ballI, rtac ctxt impI, |
60752 | 487 |
rtac ctxt (mor_Abs RS morE RS arg_cong RS iffD2), assume_tac ctxt, |
60728 | 488 |
REPEAT_DETERM o eresolve_tac ctxt [CollectE, conjE], dtac ctxt @{thm meta_spec}, |
60752 | 489 |
EVERY' (@{map 3} mk_IH_tac Rep_invs Abs_invs (drop m set_maps)), assume_tac ctxt]; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
490 |
|
49227 | 491 |
fun mk_induct_tac (Rep, Rep_inv) = |
60728 | 492 |
EVERY' [rtac ctxt (Rep_inv RS arg_cong RS iffD1), etac ctxt (Rep RSN (2, bspec))]; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
493 |
in |
60728 | 494 |
(rtac ctxt mp THEN' rtac ctxt impI THEN' |
495 |
DETERM o CONJ_WRAP_GEN' (etac ctxt conjE THEN' rtac ctxt conjI) mk_induct_tac (Reps ~~ Rep_invs) THEN' |
|
496 |
rtac ctxt init_induct THEN' |
|
53290 | 497 |
DETERM o CONJ_WRAP' mk_closed_tac (ks ~~ (morEs ~~ set_mapss))) 1 |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
498 |
end; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
499 |
|
55197 | 500 |
fun mk_ctor_induct2_tac ctxt cTs cts ctor_induct weak_ctor_inducts = |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
501 |
let |
49501 | 502 |
val n = length weak_ctor_inducts; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
503 |
val ks = 1 upto n; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
504 |
fun mk_inner_induct_tac induct i = |
60728 | 505 |
EVERY' [rtac ctxt allI, fo_rtac ctxt induct, |
506 |
select_prem_tac ctxt n (dtac ctxt @{thm meta_spec2}) i, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
507 |
REPEAT_DETERM_N n o |
60728 | 508 |
EVERY' [dtac ctxt meta_mp THEN_ALL_NEW Goal.norm_hhf_tac ctxt, |
60752 | 509 |
REPEAT_DETERM o dtac ctxt @{thm meta_spec}, etac ctxt (spec RS meta_mp), |
510 |
assume_tac ctxt], |
|
511 |
assume_tac ctxt]; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
512 |
in |
60801 | 513 |
EVERY' [rtac ctxt rev_mp, rtac ctxt (Thm.instantiate' cTs cts ctor_induct), |
60728 | 514 |
EVERY' (map2 mk_inner_induct_tac weak_ctor_inducts ks), rtac ctxt impI, |
59498
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents:
58634
diff
changeset
|
515 |
REPEAT_DETERM o eresolve_tac ctxt [conjE, allE], |
60752 | 516 |
CONJ_WRAP' (K (assume_tac ctxt)) ks] 1 |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
517 |
end; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
518 |
|
60728 | 519 |
fun mk_map_tac ctxt m n foldx map_comp_id map_cong0 = |
520 |
EVERY' [rtac ctxt @{thm ext}, rtac ctxt trans, rtac ctxt o_apply, rtac ctxt trans, rtac ctxt foldx, rtac ctxt trans, |
|
521 |
rtac ctxt o_apply, |
|
522 |
rtac ctxt trans, rtac ctxt (map_comp_id RS arg_cong), rtac ctxt trans, rtac ctxt (map_cong0 RS arg_cong), |
|
523 |
REPEAT_DETERM_N m o rtac ctxt refl, |
|
524 |
REPEAT_DETERM_N n o (EVERY' (map (rtac ctxt) [trans, o_apply, id_apply])), |
|
525 |
rtac ctxt sym, rtac ctxt o_apply] 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
526 |
|
55197 | 527 |
fun mk_ctor_map_unique_tac ctxt fold_unique sym_map_comps = |
60728 | 528 |
rtac ctxt fold_unique 1 THEN |
55067 | 529 |
unfold_thms_tac ctxt (sym_map_comps @ @{thms comp_assoc id_comp comp_id}) THEN |
60752 | 530 |
ALLGOALS (assume_tac ctxt); |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
531 |
|
60728 | 532 |
fun mk_set_tac ctxt foldx = EVERY' [rtac ctxt @{thm ext}, rtac ctxt trans, rtac ctxt o_apply, |
533 |
rtac ctxt trans, rtac ctxt foldx, rtac ctxt sym, rtac ctxt o_apply] 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
534 |
|
60728 | 535 |
fun mk_ctor_set_tac ctxt set set_map set_maps = |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
536 |
let |
53290 | 537 |
val n = length set_maps; |
62343
24106dc44def
prefer abbreviations for compound operators INFIMUM and SUPREMUM
haftmann
parents:
61841
diff
changeset
|
538 |
fun mk_UN thm = rtac ctxt (thm RS @{thm arg_cong[of _ _ Union]} RS trans) |
24106dc44def
prefer abbreviations for compound operators INFIMUM and SUPREMUM
haftmann
parents:
61841
diff
changeset
|
539 |
THEN' rtac ctxt @{thm refl}; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
540 |
in |
60728 | 541 |
EVERY' [rtac ctxt (set RS @{thm comp_eq_dest} RS trans), rtac ctxt Un_cong, |
542 |
rtac ctxt (trans OF [set_map, trans_fun_cong_image_id_id_apply]), |
|
543 |
REPEAT_DETERM_N (n - 1) o rtac ctxt Un_cong, |
|
53290 | 544 |
EVERY' (map mk_UN set_maps)] 1 |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
545 |
end; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
546 |
|
55197 | 547 |
fun mk_set_nat_tac ctxt m induct_tac set_mapss ctor_maps csets ctor_sets i = |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
548 |
let |
49541 | 549 |
val n = length ctor_maps; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
550 |
|
60728 | 551 |
fun useIH set_nat = EVERY' [rtac ctxt trans, rtac ctxt @{thm image_UN}, rtac ctxt trans, rtac ctxt @{thm SUP_cong}, |
552 |
rtac ctxt refl, Goal.assume_rule_tac ctxt, rtac ctxt sym, rtac ctxt trans, rtac ctxt @{thm SUP_cong}, |
|
553 |
rtac ctxt set_nat, rtac ctxt refl, rtac ctxt @{thm UN_simps(10)}]; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
554 |
|
49585
5c4a12550491
generate high-level "maps", "sets", and "rels" properties
blanchet
parents:
49544
diff
changeset
|
555 |
fun mk_set_nat cset ctor_map ctor_set set_nats = |
60728 | 556 |
EVERY' [rtac ctxt trans, rtac ctxt @{thm image_cong}, rtac ctxt ctor_set, rtac ctxt refl, rtac ctxt sym, |
60784 | 557 |
rtac ctxt (trans OF [ctor_map RS infer_instantiate' ctxt [NONE, NONE, SOME cset] arg_cong, |
56262 | 558 |
ctor_set RS trans]), |
60728 | 559 |
rtac ctxt sym, EVERY' (map (rtac ctxt) [trans, @{thm image_Un}, Un_cong]), |
560 |
rtac ctxt sym, rtac ctxt (nth set_nats (i - 1)), |
|
561 |
REPEAT_DETERM_N (n - 1) o EVERY' (map (rtac ctxt) [trans, @{thm image_Un}, Un_cong]), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
562 |
EVERY' (map useIH (drop m set_nats))]; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
563 |
in |
58634
9f10d82e8188
added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents:
58446
diff
changeset
|
564 |
(induct_tac THEN' EVERY' (@{map 4} mk_set_nat csets ctor_maps ctor_sets set_mapss)) 1 |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
565 |
end; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
566 |
|
75624 | 567 |
fun mk_set_bd_tac ctxt m induct_tac bd_Cinfinite bd_regularCard set_bdss ctor_sets i = |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
568 |
let |
49542
b39354db8629
renamed low-level "set_simps" and "set_induct" to have "ctor" or "dtor" in the name
blanchet
parents:
49541
diff
changeset
|
569 |
val n = length ctor_sets; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
570 |
|
75624 | 571 |
fun useIH set_bd = EVERY' [ |
572 |
rtac ctxt (@{thm card_of_UNION_ordLess_infinite_Field_regularCard} OF [ |
|
573 |
bd_regularCard, bd_Cinfinite, set_bd |
|
574 |
]), |
|
575 |
rtac ctxt ballI, |
|
576 |
Goal.assume_rule_tac ctxt |
|
577 |
]; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
578 |
|
49585
5c4a12550491
generate high-level "maps", "sets", and "rels" properties
blanchet
parents:
49544
diff
changeset
|
579 |
fun mk_set_nat ctor_set set_bds = |
75624 | 580 |
EVERY' [rtac ctxt @{thm ordIso_ordLess_trans}, rtac ctxt @{thm card_of_ordIso_subst}, rtac ctxt ctor_set, |
581 |
rtac ctxt (bd_Cinfinite RSN (3, @{thm Un_Cinfinite_bound_strict})), rtac ctxt (nth set_bds (i - 1)), |
|
582 |
REPEAT_DETERM_N (n - 1) o rtac ctxt (bd_Cinfinite RSN (3, @{thm Un_Cinfinite_bound_strict})), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
583 |
EVERY' (map useIH (drop m set_bds))]; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
584 |
in |
49542
b39354db8629
renamed low-level "set_simps" and "set_induct" to have "ctor" or "dtor" in the name
blanchet
parents:
49541
diff
changeset
|
585 |
(induct_tac THEN' EVERY' (map2 mk_set_nat ctor_sets set_bdss)) 1 |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
586 |
end; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
587 |
|
55197 | 588 |
fun mk_mcong_tac ctxt induct_tac set_setsss map_cong0s ctor_maps = |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
589 |
let |
60728 | 590 |
fun use_asm thm = EVERY' [etac ctxt bspec, etac ctxt set_rev_mp, rtac ctxt thm]; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
591 |
|
60728 | 592 |
fun useIH set_sets = EVERY' [rtac ctxt mp, Goal.assume_rule_tac ctxt, |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
593 |
CONJ_WRAP' (fn thm => |
60728 | 594 |
EVERY' [rtac ctxt ballI, etac ctxt bspec, etac ctxt set_rev_mp, etac ctxt thm]) set_sets]; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
595 |
|
51761
4c9f08836d87
renamed "map_cong" axiom to "map_cong0" in preparation for real "map_cong"
blanchet
parents:
51739
diff
changeset
|
596 |
fun mk_map_cong0 ctor_map map_cong0 set_setss = |
60728 | 597 |
EVERY' [rtac ctxt impI, REPEAT_DETERM o etac ctxt conjE, |
598 |
rtac ctxt trans, rtac ctxt ctor_map, rtac ctxt trans, rtac ctxt (map_cong0 RS arg_cong), |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
599 |
EVERY' (map use_asm (map hd set_setss)), |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
600 |
EVERY' (map useIH (transpose (map tl set_setss))), |
60728 | 601 |
rtac ctxt sym, rtac ctxt ctor_map]; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
602 |
in |
58634
9f10d82e8188
added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents:
58446
diff
changeset
|
603 |
(induct_tac THEN' EVERY' (@{map 3} mk_map_cong0 ctor_maps map_cong0s set_setsss)) 1 |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
604 |
end; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
605 |
|
57967 | 606 |
fun mk_le_rel_OO_tac ctxt m induct ctor_nchotomys ctor_Irels rel_mono_strong0s le_rel_OOs = |
60728 | 607 |
EVERY' (rtac ctxt induct :: |
58634
9f10d82e8188
added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents:
58446
diff
changeset
|
608 |
@{map 4} (fn nchotomy => fn Irel => fn rel_mono => fn le_rel_OO => |
60728 | 609 |
EVERY' [rtac ctxt impI, etac ctxt (nchotomy RS @{thm nchotomy_relcomppE}), |
610 |
REPEAT_DETERM_N 2 o dtac ctxt (Irel RS iffD1), rtac ctxt (Irel RS iffD2), |
|
611 |
rtac ctxt rel_mono, rtac ctxt (le_rel_OO RS @{thm predicate2D}), |
|
60752 | 612 |
rtac ctxt @{thm relcomppI}, assume_tac ctxt, assume_tac ctxt, |
613 |
REPEAT_DETERM_N m o EVERY' [rtac ctxt ballI, rtac ctxt ballI, rtac ctxt impI, assume_tac ctxt], |
|
57726 | 614 |
REPEAT_DETERM_N (length le_rel_OOs) o |
60728 | 615 |
EVERY' [rtac ctxt ballI, rtac ctxt ballI, Goal.assume_rule_tac ctxt]]) |
57967 | 616 |
ctor_nchotomys ctor_Irels rel_mono_strong0s le_rel_OOs) 1; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
617 |
|
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
618 |
(* BNF tactics *) |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
619 |
|
60728 | 620 |
fun mk_map_id0_tac ctxt map_id0s unique = |
621 |
(rtac ctxt sym THEN' rtac ctxt unique THEN' |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
622 |
EVERY' (map (fn thm => |
60728 | 623 |
EVERY' [rtac ctxt trans, rtac ctxt @{thm id_comp}, rtac ctxt trans, rtac ctxt sym, rtac ctxt @{thm comp_id}, |
624 |
rtac ctxt (thm RS sym RS arg_cong)]) map_id0s)) 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
625 |
|
60728 | 626 |
fun mk_map_comp0_tac ctxt map_comp0s ctor_maps unique iplus1 = |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
627 |
let |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
628 |
val i = iplus1 - 1; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
629 |
val unique' = Thm.permute_prems 0 i unique; |
53288 | 630 |
val map_comp0s' = drop i map_comp0s @ take i map_comp0s; |
49541 | 631 |
val ctor_maps' = drop i ctor_maps @ take i ctor_maps; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
632 |
fun mk_comp comp simp = |
60728 | 633 |
EVERY' [rtac ctxt @{thm ext}, rtac ctxt trans, rtac ctxt o_apply, rtac ctxt trans, rtac ctxt o_apply, |
634 |
rtac ctxt trans, rtac ctxt (simp RS arg_cong), rtac ctxt trans, rtac ctxt simp, |
|
635 |
rtac ctxt trans, rtac ctxt (comp RS arg_cong), rtac ctxt sym, rtac ctxt o_apply]; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
636 |
in |
60728 | 637 |
(rtac ctxt sym THEN' rtac ctxt unique' THEN' EVERY' (map2 mk_comp map_comp0s' ctor_maps')) 1 |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
638 |
end; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
639 |
|
60728 | 640 |
fun mk_set_map0_tac ctxt set_nat = |
641 |
EVERY' (map (rtac ctxt) [@{thm ext}, trans, o_apply, sym, trans, o_apply, set_nat]) 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
642 |
|
60728 | 643 |
fun mk_bd_card_order_tac ctxt bd_card_orders = |
644 |
CONJ_WRAP_GEN' (rtac ctxt @{thm card_order_csum}) (rtac ctxt) bd_card_orders 1; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
645 |
|
51798 | 646 |
fun mk_wit_tac ctxt n ctor_set wit = |
60752 | 647 |
REPEAT_DETERM (assume_tac ctxt 1 ORELSE |
60728 | 648 |
EVERY' [dtac ctxt set_rev_mp, rtac ctxt equalityD1, resolve_tac ctxt ctor_set, |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
649 |
REPEAT_DETERM o |
60728 | 650 |
(TRY o REPEAT_DETERM o etac ctxt UnE THEN' TRY o etac ctxt @{thm UN_E} THEN' |
59498
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents:
58634
diff
changeset
|
651 |
(eresolve_tac ctxt wit ORELSE' |
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents:
58634
diff
changeset
|
652 |
(dresolve_tac ctxt wit THEN' |
60728 | 653 |
(etac ctxt FalseE ORELSE' |
654 |
EVERY' [hyp_subst_tac ctxt, dtac ctxt set_rev_mp, rtac ctxt equalityD1, resolve_tac ctxt ctor_set, |
|
655 |
REPEAT_DETERM_N n o etac ctxt UnE]))))] 1); |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
656 |
|
53287 | 657 |
fun mk_ctor_rel_tac ctxt in_Irels i in_rel map_comp0 map_cong0 ctor_map ctor_sets ctor_inject |
53289 | 658 |
ctor_dtor set_map0s ctor_set_incls ctor_set_set_inclss = |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
659 |
let |
49544
24094fa47e0d
renamed "set_incl" etc. to have "ctor" or "dtor" in the name
blanchet
parents:
49543
diff
changeset
|
660 |
val m = length ctor_set_incls; |
24094fa47e0d
renamed "set_incl" etc. to have "ctor" or "dtor" in the name
blanchet
parents:
49543
diff
changeset
|
661 |
val n = length ctor_set_set_inclss; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
662 |
|
53289 | 663 |
val (passive_set_map0s, active_set_map0s) = chop m set_map0s; |
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51812
diff
changeset
|
664 |
val in_Irel = nth in_Irels (i - 1); |
49501 | 665 |
val le_arg_cong_ctor_dtor = ctor_dtor RS arg_cong RS ord_eq_le_trans; |
666 |
val eq_arg_cong_ctor_dtor = ctor_dtor RS arg_cong RS trans; |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
667 |
val if_tac = |
60728 | 668 |
EVERY' [dtac ctxt (in_Irel RS iffD1), REPEAT_DETERM o eresolve_tac ctxt [exE, conjE, CollectE], |
669 |
rtac ctxt (in_rel RS iffD2), rtac ctxt exI, rtac ctxt conjI, rtac ctxt CollectI, |
|
53289 | 670 |
EVERY' (map2 (fn set_map0 => fn ctor_set_incl => |
60728 | 671 |
EVERY' [rtac ctxt conjI, rtac ctxt ord_eq_le_trans, rtac ctxt set_map0, |
672 |
rtac ctxt ord_eq_le_trans, rtac ctxt trans_fun_cong_image_id_id_apply, |
|
673 |
rtac ctxt (ctor_set_incl RS subset_trans), etac ctxt le_arg_cong_ctor_dtor]) |
|
53289 | 674 |
passive_set_map0s ctor_set_incls), |
675 |
CONJ_WRAP' (fn (in_Irel, (set_map0, ctor_set_set_incls)) => |
|
60728 | 676 |
EVERY' [rtac ctxt ord_eq_le_trans, rtac ctxt set_map0, rtac ctxt @{thm image_subsetI}, rtac ctxt CollectI, |
677 |
rtac ctxt @{thm case_prodI}, rtac ctxt (in_Irel RS iffD2), rtac ctxt exI, rtac ctxt conjI, rtac ctxt CollectI, |
|
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
678 |
CONJ_WRAP' (fn thm => |
60728 | 679 |
EVERY' (map (etac ctxt) [thm RS subset_trans, le_arg_cong_ctor_dtor])) |
49544
24094fa47e0d
renamed "set_incl" etc. to have "ctor" or "dtor" in the name
blanchet
parents:
49543
diff
changeset
|
680 |
ctor_set_set_incls, |
60728 | 681 |
rtac ctxt conjI, rtac ctxt refl, rtac ctxt refl]) |
53289 | 682 |
(in_Irels ~~ (active_set_map0s ~~ ctor_set_set_inclss)), |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
683 |
CONJ_WRAP' (fn conv => |
60728 | 684 |
EVERY' [rtac ctxt trans, rtac ctxt map_comp0, rtac ctxt trans, rtac ctxt map_cong0, |
685 |
REPEAT_DETERM_N m o rtac ctxt @{thm fun_cong[OF comp_id]}, |
|
686 |
REPEAT_DETERM_N n o EVERY' (map (rtac ctxt) [trans, o_apply, conv]), |
|
687 |
rtac ctxt (ctor_inject RS iffD1), rtac ctxt trans, rtac ctxt sym, rtac ctxt ctor_map, |
|
688 |
etac ctxt eq_arg_cong_ctor_dtor]) |
|
49306 | 689 |
fst_snd_convs]; |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
690 |
val only_if_tac = |
60728 | 691 |
EVERY' [dtac ctxt (in_rel RS iffD1), REPEAT_DETERM o eresolve_tac ctxt [exE, conjE, CollectE], |
692 |
rtac ctxt (in_Irel RS iffD2), rtac ctxt exI, rtac ctxt conjI, rtac ctxt CollectI, |
|
53289 | 693 |
CONJ_WRAP' (fn (ctor_set, passive_set_map0) => |
60728 | 694 |
EVERY' [rtac ctxt ord_eq_le_trans, rtac ctxt ctor_set, rtac ctxt @{thm Un_least}, |
695 |
rtac ctxt ord_eq_le_trans, rtac ctxt @{thm box_equals[OF _ refl]}, |
|
60752 | 696 |
rtac ctxt passive_set_map0, rtac ctxt trans_fun_cong_image_id_id_apply, assume_tac ctxt, |
60728 | 697 |
CONJ_WRAP_GEN' (rtac ctxt (Thm.permute_prems 0 1 @{thm Un_least})) |
698 |
(fn (active_set_map0, in_Irel) => EVERY' [rtac ctxt ord_eq_le_trans, |
|
699 |
rtac ctxt @{thm SUP_cong[OF _ refl]}, rtac ctxt active_set_map0, rtac ctxt @{thm UN_least}, |
|
700 |
dtac ctxt set_rev_mp, etac ctxt @{thm image_mono}, etac ctxt imageE, |
|
61424
c3658c18b7bc
prod_case as canonical name for product type eliminator
haftmann
parents:
61334
diff
changeset
|
701 |
dtac ctxt @{thm ssubst_mem[OF prod.collapse]}, |
59498
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents:
58634
diff
changeset
|
702 |
REPEAT_DETERM o eresolve_tac ctxt (CollectE :: conjE :: |
56765 | 703 |
@{thms case_prodE iffD1[OF prod.inject, elim_format]}), |
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51812
diff
changeset
|
704 |
hyp_subst_tac ctxt, |
60728 | 705 |
dtac ctxt (in_Irel RS iffD1), dtac ctxt @{thm someI_ex}, REPEAT_DETERM o etac ctxt conjE, |
60752 | 706 |
REPEAT_DETERM o eresolve_tac ctxt [CollectE, conjE], assume_tac ctxt]) |
53289 | 707 |
(rev (active_set_map0s ~~ in_Irels))]) |
708 |
(ctor_sets ~~ passive_set_map0s), |
|
60728 | 709 |
rtac ctxt conjI, |
710 |
REPEAT_DETERM_N 2 o EVERY' [rtac ctxt trans, rtac ctxt ctor_map, rtac ctxt (ctor_inject RS iffD2), |
|
711 |
rtac ctxt trans, rtac ctxt map_comp0, rtac ctxt trans, rtac ctxt map_cong0, |
|
712 |
REPEAT_DETERM_N m o rtac ctxt @{thm fun_cong[OF comp_id]}, |
|
60752 | 713 |
EVERY' (map (fn in_Irel => EVERY' [rtac ctxt trans, rtac ctxt o_apply, |
714 |
dtac ctxt set_rev_mp, assume_tac ctxt, |
|
61424
c3658c18b7bc
prod_case as canonical name for product type eliminator
haftmann
parents:
61334
diff
changeset
|
715 |
dtac ctxt @{thm ssubst_mem[OF prod.collapse]}, |
59498
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents:
58634
diff
changeset
|
716 |
REPEAT_DETERM o eresolve_tac ctxt (CollectE :: conjE :: |
56765 | 717 |
@{thms case_prodE iffD1[OF prod.inject, elim_format]}), |
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51812
diff
changeset
|
718 |
hyp_subst_tac ctxt, |
60752 | 719 |
dtac ctxt (in_Irel RS iffD1), dtac ctxt @{thm someI_ex}, |
720 |
REPEAT_DETERM o etac ctxt conjE, assume_tac ctxt]) |
|
51893
596baae88a88
got rid of the set based relator---use (binary) predicate based relator instead
traytel
parents:
51812
diff
changeset
|
721 |
in_Irels), |
60752 | 722 |
assume_tac ctxt]] |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
723 |
in |
60728 | 724 |
EVERY' [rtac ctxt iffI, if_tac, only_if_tac] 1 |
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
725 |
end; |
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
726 |
|
58444 | 727 |
fun mk_ctor_rec_transfer_tac ctxt n m ctor_rec_defs ctor_fold_transfers pre_T_map_transfers |
728 |
ctor_rels = |
|
58446 | 729 |
CONJ_WRAP (fn (ctor_rec_def, ctor_fold_transfer) => |
60728 | 730 |
REPEAT_DETERM (HEADGOAL (rtac ctxt rel_funI)) THEN |
58446 | 731 |
unfold_thms_tac ctxt [ctor_rec_def, o_apply] THEN |
60728 | 732 |
HEADGOAL (rtac ctxt @{thm rel_funD[OF snd_transfer]} THEN' |
733 |
etac ctxt (mk_rel_funDN_rotated (n + 1) ctor_fold_transfer) THEN' |
|
58446 | 734 |
EVERY' (map2 (fn pre_T_map_transfer => fn ctor_rel => |
60728 | 735 |
etac ctxt (mk_rel_funDN_rotated 2 @{thm convol_transfer}) THEN' |
736 |
rtac ctxt (mk_rel_funDN_rotated 2 @{thm comp_transfer}) THEN' |
|
737 |
rtac ctxt (mk_rel_funDN (m + n) pre_T_map_transfer) THEN' |
|
738 |
REPEAT_DETERM_N m o rtac ctxt @{thm id_transfer} THEN' |
|
739 |
REPEAT_DETERM o rtac ctxt @{thm fst_transfer} THEN' |
|
740 |
rtac ctxt rel_funI THEN' |
|
741 |
etac ctxt (ctor_rel RS iffD2)) pre_T_map_transfers ctor_rels))) |
|
58446 | 742 |
(ctor_rec_defs ~~ ctor_fold_transfers); |
58444 | 743 |
|
57967 | 744 |
fun mk_rel_induct_tac ctxt IHs m ctor_induct2 ks ctor_rels rel_mono_strong0s = |
51918 | 745 |
let val n = length ks; |
746 |
in |
|
54998 | 747 |
unfold_tac ctxt @{thms le_fun_def le_bool_def all_simps(1,2)[symmetric]} THEN |
60728 | 748 |
EVERY' [REPEAT_DETERM o rtac ctxt allI, rtac ctxt ctor_induct2, |
58634
9f10d82e8188
added parameterized ML antiquotations @{map N}, @{fold N}, @{fold_map N}, @{split_list N};
wenzelm
parents:
58446
diff
changeset
|
749 |
EVERY' (@{map 3} (fn IH => fn ctor_rel => fn rel_mono_strong0 => |
60728 | 750 |
EVERY' [rtac ctxt impI, dtac ctxt (ctor_rel RS iffD1), rtac ctxt (IH RS @{thm spec2} RS mp), |
751 |
etac ctxt rel_mono_strong0, |
|
752 |
REPEAT_DETERM_N m o rtac ctxt @{thm ballI[OF ballI[OF imp_refl]]}, |
|
51918 | 753 |
EVERY' (map (fn j => |
60728 | 754 |
EVERY' [select_prem_tac ctxt n (dtac ctxt asm_rl) j, rtac ctxt @{thm ballI[OF ballI]}, |
51918 | 755 |
Goal.assume_rule_tac ctxt]) ks)]) |
57967 | 756 |
IHs ctor_rels rel_mono_strong0s)] 1 |
51918 | 757 |
end; |
758 |
||
55901
8c6d49dd8ae1
renamed a pair of low-level theorems to have c/dtor in their names (like the others)
blanchet
parents:
55756
diff
changeset
|
759 |
fun mk_fold_transfer_tac ctxt m ctor_rel_induct map_transfers folds = |
52731 | 760 |
let |
761 |
val n = length map_transfers; |
|
762 |
in |
|
763 |
unfold_thms_tac ctxt |
|
55945 | 764 |
@{thms rel_fun_def_butlast all_conj_distrib[symmetric] imp_conjR[symmetric]} THEN |
765 |
unfold_thms_tac ctxt @{thms rel_fun_iff_leq_vimage2p} THEN |
|
52731 | 766 |
HEADGOAL (EVERY' |
60728 | 767 |
[REPEAT_DETERM o resolve_tac ctxt [allI, impI], rtac ctxt ctor_rel_induct, |
52731 | 768 |
EVERY' (map (fn map_transfer => EVERY' |
59498
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents:
58634
diff
changeset
|
769 |
[REPEAT_DETERM o resolve_tac ctxt [allI, impI, @{thm vimage2pI}], |
52731 | 770 |
SELECT_GOAL (unfold_thms_tac ctxt folds), |
60728 | 771 |
etac ctxt @{thm predicate2D_vimage2p}, |
772 |
rtac ctxt (funpow (m + n + 1) (fn thm => thm RS rel_funD) map_transfer), |
|
773 |
REPEAT_DETERM_N m o rtac ctxt @{thm id_transfer}, |
|
774 |
REPEAT_DETERM_N n o rtac ctxt @{thm vimage2p_rel_fun}, |
|
60752 | 775 |
assume_tac ctxt]) |
52731 | 776 |
map_transfers)]) |
777 |
end; |
|
778 |
||
48975
7f79f94a432c
added new (co)datatype package + theories of ordinals and cardinals (with Dmitriy and Andrei)
blanchet
parents:
diff
changeset
|
779 |
end; |