85 by (rtac (CollectI RS subsetI) 2); |
85 by (rtac (CollectI RS subsetI) 2); |
86 by (etac (arg_subset_eclose RS subsetD) 2); |
86 by (etac (arg_subset_eclose RS subsetD) 2); |
87 by (etac base 2); |
87 by (etac base 2); |
88 by (rewtac Transset_def); |
88 by (rewtac Transset_def); |
89 by (fast_tac (ZF_cs addEs [step,ecloseD]) 1); |
89 by (fast_tac (ZF_cs addEs [step,ecloseD]) 1); |
90 val eclose_induct_down = result(); |
90 qed "eclose_induct_down"; |
91 |
91 |
92 goal Epsilon.thy "!!X. Transset(X) ==> eclose(X) = X"; |
92 goal Epsilon.thy "!!X. Transset(X) ==> eclose(X) = X"; |
93 by (etac ([eclose_least, arg_subset_eclose] MRS equalityI) 1); |
93 by (etac ([eclose_least, arg_subset_eclose] MRS equalityI) 1); |
94 by (rtac subset_refl 1); |
94 by (rtac subset_refl 1); |
95 val Transset_eclose_eq_arg = result(); |
95 qed "Transset_eclose_eq_arg"; |
96 |
96 |
97 |
97 |
98 (*** Epsilon recursion ***) |
98 (*** Epsilon recursion ***) |
99 |
99 |
100 (*Unused...*) |
100 (*Unused...*) |
101 goal Epsilon.thy "!!A B C. [| A: eclose(B); B: eclose(C) |] ==> A: eclose(C)"; |
101 goal Epsilon.thy "!!A B C. [| A: eclose(B); B: eclose(C) |] ==> A: eclose(C)"; |
102 by (rtac ([Transset_eclose, eclose_subset] MRS eclose_least RS subsetD) 1); |
102 by (rtac ([Transset_eclose, eclose_subset] MRS eclose_least RS subsetD) 1); |
103 by (REPEAT (assume_tac 1)); |
103 by (REPEAT (assume_tac 1)); |
104 val mem_eclose_trans = result(); |
104 qed "mem_eclose_trans"; |
105 |
105 |
106 (*Variant of the previous lemma in a useable form for the sequel*) |
106 (*Variant of the previous lemma in a useable form for the sequel*) |
107 goal Epsilon.thy |
107 goal Epsilon.thy |
108 "!!A B C. [| A: eclose({B}); B: eclose({C}) |] ==> A: eclose({C})"; |
108 "!!A B C. [| A: eclose({B}); B: eclose({C}) |] ==> A: eclose({C})"; |
109 by (rtac ([Transset_eclose, singleton_subsetI] MRS eclose_least RS subsetD) 1); |
109 by (rtac ([Transset_eclose, singleton_subsetI] MRS eclose_least RS subsetD) 1); |
110 by (REPEAT (assume_tac 1)); |
110 by (REPEAT (assume_tac 1)); |
111 val mem_eclose_sing_trans = result(); |
111 qed "mem_eclose_sing_trans"; |
112 |
112 |
113 goalw Epsilon.thy [Transset_def] |
113 goalw Epsilon.thy [Transset_def] |
114 "!!i j. [| Transset(i); j:i |] ==> Memrel(i)-``{j} = j"; |
114 "!!i j. [| Transset(i); j:i |] ==> Memrel(i)-``{j} = j"; |
115 by (fast_tac (eq_cs addSIs [MemrelI] addSEs [MemrelE]) 1); |
115 by (fast_tac (eq_cs addSIs [MemrelI] addSEs [MemrelE]) 1); |
116 val under_Memrel = result(); |
116 qed "under_Memrel"; |
117 |
117 |
118 (* j : eclose(A) ==> Memrel(eclose(A)) -`` j = j *) |
118 (* j : eclose(A) ==> Memrel(eclose(A)) -`` j = j *) |
119 val under_Memrel_eclose = Transset_eclose RS under_Memrel; |
119 val under_Memrel_eclose = Transset_eclose RS under_Memrel; |
120 |
120 |
121 val wfrec_ssubst = standard (wf_Memrel RS wfrec RS ssubst); |
121 val wfrec_ssubst = standard (wf_Memrel RS wfrec RS ssubst); |
126 by (rtac (kmemj RS eclose_induct) 1); |
126 by (rtac (kmemj RS eclose_induct) 1); |
127 by (rtac wfrec_ssubst 1); |
127 by (rtac wfrec_ssubst 1); |
128 by (rtac wfrec_ssubst 1); |
128 by (rtac wfrec_ssubst 1); |
129 by (asm_simp_tac (ZF_ss addsimps [under_Memrel_eclose, |
129 by (asm_simp_tac (ZF_ss addsimps [under_Memrel_eclose, |
130 jmemi RSN (2,mem_eclose_sing_trans)]) 1); |
130 jmemi RSN (2,mem_eclose_sing_trans)]) 1); |
131 val wfrec_eclose_eq = result(); |
131 qed "wfrec_eclose_eq"; |
132 |
132 |
133 val [prem] = goal Epsilon.thy |
133 val [prem] = goal Epsilon.thy |
134 "k: i ==> wfrec(Memrel(eclose({i})),k,H) = wfrec(Memrel(eclose({k})),k,H)"; |
134 "k: i ==> wfrec(Memrel(eclose({i})),k,H) = wfrec(Memrel(eclose({k})),k,H)"; |
135 by (rtac (arg_in_eclose_sing RS wfrec_eclose_eq) 1); |
135 by (rtac (arg_in_eclose_sing RS wfrec_eclose_eq) 1); |
136 by (rtac (prem RS arg_into_eclose_sing) 1); |
136 by (rtac (prem RS arg_into_eclose_sing) 1); |
137 val wfrec_eclose_eq2 = result(); |
137 qed "wfrec_eclose_eq2"; |
138 |
138 |
139 goalw Epsilon.thy [transrec_def] |
139 goalw Epsilon.thy [transrec_def] |
140 "transrec(a,H) = H(a, lam x:a. transrec(x,H))"; |
140 "transrec(a,H) = H(a, lam x:a. transrec(x,H))"; |
141 by (rtac wfrec_ssubst 1); |
141 by (rtac wfrec_ssubst 1); |
142 by (simp_tac (ZF_ss addsimps [wfrec_eclose_eq2, arg_in_eclose_sing, |
142 by (simp_tac (ZF_ss addsimps [wfrec_eclose_eq2, arg_in_eclose_sing, |
143 under_Memrel_eclose]) 1); |
143 under_Memrel_eclose]) 1); |
144 val transrec = result(); |
144 qed "transrec"; |
145 |
145 |
146 (*Avoids explosions in proofs; resolve it with a meta-level definition.*) |
146 (*Avoids explosions in proofs; resolve it with a meta-level definition.*) |
147 val rew::prems = goal Epsilon.thy |
147 val rew::prems = goal Epsilon.thy |
148 "[| !!x. f(x)==transrec(x,H) |] ==> f(a) = H(a, lam x:a. f(x))"; |
148 "[| !!x. f(x)==transrec(x,H) |] ==> f(a) = H(a, lam x:a. f(x))"; |
149 by (rewtac rew); |
149 by (rewtac rew); |
150 by (REPEAT (resolve_tac (prems@[transrec]) 1)); |
150 by (REPEAT (resolve_tac (prems@[transrec]) 1)); |
151 val def_transrec = result(); |
151 qed "def_transrec"; |
152 |
152 |
153 val prems = goal Epsilon.thy |
153 val prems = goal Epsilon.thy |
154 "[| !!x u. [| x:eclose({a}); u: Pi(x,B) |] ==> H(x,u) : B(x) \ |
154 "[| !!x u. [| x:eclose({a}); u: Pi(x,B) |] ==> H(x,u) : B(x) \ |
155 \ |] ==> transrec(a,H) : B(a)"; |
155 \ |] ==> transrec(a,H) : B(a)"; |
156 by (res_inst_tac [("i", "a")] (arg_in_eclose_sing RS eclose_induct) 1); |
156 by (res_inst_tac [("i", "a")] (arg_in_eclose_sing RS eclose_induct) 1); |
157 by (rtac (transrec RS ssubst) 1); |
157 by (rtac (transrec RS ssubst) 1); |
158 by (REPEAT (ares_tac (prems @ [lam_type]) 1 ORELSE etac bspec 1)); |
158 by (REPEAT (ares_tac (prems @ [lam_type]) 1 ORELSE etac bspec 1)); |
159 val transrec_type = result(); |
159 qed "transrec_type"; |
160 |
160 |
161 goal Epsilon.thy "!!i. Ord(i) ==> eclose({i}) <= succ(i)"; |
161 goal Epsilon.thy "!!i. Ord(i) ==> eclose({i}) <= succ(i)"; |
162 by (etac (Ord_is_Transset RS Transset_succ RS eclose_least) 1); |
162 by (etac (Ord_is_Transset RS Transset_succ RS eclose_least) 1); |
163 by (rtac (succI1 RS singleton_subsetI) 1); |
163 by (rtac (succI1 RS singleton_subsetI) 1); |
164 val eclose_sing_Ord = result(); |
164 qed "eclose_sing_Ord"; |
165 |
165 |
166 val prems = goal Epsilon.thy |
166 val prems = goal Epsilon.thy |
167 "[| j: i; Ord(i); \ |
167 "[| j: i; Ord(i); \ |
168 \ !!x u. [| x: i; u: Pi(x,B) |] ==> H(x,u) : B(x) \ |
168 \ !!x u. [| x: i; u: Pi(x,B) |] ==> H(x,u) : B(x) \ |
169 \ |] ==> transrec(j,H) : B(j)"; |
169 \ |] ==> transrec(j,H) : B(j)"; |
170 by (rtac transrec_type 1); |
170 by (rtac transrec_type 1); |
171 by (resolve_tac prems 1); |
171 by (resolve_tac prems 1); |
172 by (rtac (Ord_in_Ord RS eclose_sing_Ord RS subsetD RS succE) 1); |
172 by (rtac (Ord_in_Ord RS eclose_sing_Ord RS subsetD RS succE) 1); |
173 by (DEPTH_SOLVE (ares_tac prems 1 ORELSE eresolve_tac [ssubst,Ord_trans] 1)); |
173 by (DEPTH_SOLVE (ares_tac prems 1 ORELSE eresolve_tac [ssubst,Ord_trans] 1)); |
174 val Ord_transrec_type = result(); |
174 qed "Ord_transrec_type"; |
175 |
175 |
176 (*** Rank ***) |
176 (*** Rank ***) |
177 |
177 |
178 (*NOT SUITABLE FOR REWRITING -- RECURSIVE!*) |
178 (*NOT SUITABLE FOR REWRITING -- RECURSIVE!*) |
179 goal Epsilon.thy "rank(a) = (UN y:a. succ(rank(y)))"; |
179 goal Epsilon.thy "rank(a) = (UN y:a. succ(rank(y)))"; |
180 by (rtac (rank_def RS def_transrec RS ssubst) 1); |
180 by (rtac (rank_def RS def_transrec RS ssubst) 1); |
181 by (simp_tac ZF_ss 1); |
181 by (simp_tac ZF_ss 1); |
182 val rank = result(); |
182 qed "rank"; |
183 |
183 |
184 goal Epsilon.thy "Ord(rank(a))"; |
184 goal Epsilon.thy "Ord(rank(a))"; |
185 by (eps_ind_tac "a" 1); |
185 by (eps_ind_tac "a" 1); |
186 by (rtac (rank RS ssubst) 1); |
186 by (rtac (rank RS ssubst) 1); |
187 by (rtac (Ord_succ RS Ord_UN) 1); |
187 by (rtac (Ord_succ RS Ord_UN) 1); |
188 by (etac bspec 1); |
188 by (etac bspec 1); |
189 by (assume_tac 1); |
189 by (assume_tac 1); |
190 val Ord_rank = result(); |
190 qed "Ord_rank"; |
191 |
191 |
192 val [major] = goal Epsilon.thy "Ord(i) ==> rank(i) = i"; |
192 val [major] = goal Epsilon.thy "Ord(i) ==> rank(i) = i"; |
193 by (rtac (major RS trans_induct) 1); |
193 by (rtac (major RS trans_induct) 1); |
194 by (rtac (rank RS ssubst) 1); |
194 by (rtac (rank RS ssubst) 1); |
195 by (asm_simp_tac (ZF_ss addsimps [Ord_equality]) 1); |
195 by (asm_simp_tac (ZF_ss addsimps [Ord_equality]) 1); |
196 val rank_of_Ord = result(); |
196 qed "rank_of_Ord"; |
197 |
197 |
198 goal Epsilon.thy "!!a b. a:b ==> rank(a) < rank(b)"; |
198 goal Epsilon.thy "!!a b. a:b ==> rank(a) < rank(b)"; |
199 by (res_inst_tac [("a1","b")] (rank RS ssubst) 1); |
199 by (res_inst_tac [("a1","b")] (rank RS ssubst) 1); |
200 by (etac (UN_I RS ltI) 1); |
200 by (etac (UN_I RS ltI) 1); |
201 by (rtac succI1 1); |
201 by (rtac succI1 1); |
202 by (REPEAT (ares_tac [Ord_UN, Ord_succ, Ord_rank] 1)); |
202 by (REPEAT (ares_tac [Ord_UN, Ord_succ, Ord_rank] 1)); |
203 val rank_lt = result(); |
203 qed "rank_lt"; |
204 |
204 |
205 val [major] = goal Epsilon.thy "a: eclose(b) ==> rank(a) < rank(b)"; |
205 val [major] = goal Epsilon.thy "a: eclose(b) ==> rank(a) < rank(b)"; |
206 by (rtac (major RS eclose_induct_down) 1); |
206 by (rtac (major RS eclose_induct_down) 1); |
207 by (etac rank_lt 1); |
207 by (etac rank_lt 1); |
208 by (etac (rank_lt RS lt_trans) 1); |
208 by (etac (rank_lt RS lt_trans) 1); |
209 by (assume_tac 1); |
209 by (assume_tac 1); |
210 val eclose_rank_lt = result(); |
210 qed "eclose_rank_lt"; |
211 |
211 |
212 goal Epsilon.thy "!!a b. a<=b ==> rank(a) le rank(b)"; |
212 goal Epsilon.thy "!!a b. a<=b ==> rank(a) le rank(b)"; |
213 by (rtac subset_imp_le 1); |
213 by (rtac subset_imp_le 1); |
214 by (rtac (rank RS ssubst) 1); |
214 by (rtac (rank RS ssubst) 1); |
215 by (rtac (rank RS ssubst) 1); |
215 by (rtac (rank RS ssubst) 1); |
216 by (etac UN_mono 1); |
216 by (etac UN_mono 1); |
217 by (REPEAT (resolve_tac [subset_refl, Ord_rank] 1)); |
217 by (REPEAT (resolve_tac [subset_refl, Ord_rank] 1)); |
218 val rank_mono = result(); |
218 qed "rank_mono"; |
219 |
219 |
220 goal Epsilon.thy "rank(Pow(a)) = succ(rank(a))"; |
220 goal Epsilon.thy "rank(Pow(a)) = succ(rank(a))"; |
221 by (rtac (rank RS trans) 1); |
221 by (rtac (rank RS trans) 1); |
222 by (rtac le_anti_sym 1); |
222 by (rtac le_anti_sym 1); |
223 by (DO_GOAL [rtac (Ord_rank RS Ord_succ RS UN_least_le), |
223 by (DO_GOAL [rtac (Ord_rank RS Ord_succ RS UN_least_le), |
224 etac (PowD RS rank_mono RS succ_leI)] 1); |
224 etac (PowD RS rank_mono RS succ_leI)] 1); |
225 by (DO_GOAL [rtac ([Pow_top, le_refl] MRS UN_upper_le), |
225 by (DO_GOAL [rtac ([Pow_top, le_refl] MRS UN_upper_le), |
226 REPEAT o rtac (Ord_rank RS Ord_succ)] 1); |
226 REPEAT o rtac (Ord_rank RS Ord_succ)] 1); |
227 val rank_Pow = result(); |
227 qed "rank_Pow"; |
228 |
228 |
229 goal Epsilon.thy "rank(0) = 0"; |
229 goal Epsilon.thy "rank(0) = 0"; |
230 by (rtac (rank RS trans) 1); |
230 by (rtac (rank RS trans) 1); |
231 by (fast_tac (ZF_cs addSIs [equalityI]) 1); |
231 by (fast_tac (ZF_cs addSIs [equalityI]) 1); |
232 val rank_0 = result(); |
232 qed "rank_0"; |
233 |
233 |
234 goal Epsilon.thy "rank(succ(x)) = succ(rank(x))"; |
234 goal Epsilon.thy "rank(succ(x)) = succ(rank(x))"; |
235 by (rtac (rank RS trans) 1); |
235 by (rtac (rank RS trans) 1); |
236 by (rtac ([UN_least, succI1 RS UN_upper] MRS equalityI) 1); |
236 by (rtac ([UN_least, succI1 RS UN_upper] MRS equalityI) 1); |
237 by (etac succE 1); |
237 by (etac succE 1); |
238 by (fast_tac ZF_cs 1); |
238 by (fast_tac ZF_cs 1); |
239 by (etac (rank_lt RS leI RS succ_leI RS le_imp_subset) 1); |
239 by (etac (rank_lt RS leI RS succ_leI RS le_imp_subset) 1); |
240 val rank_succ = result(); |
240 qed "rank_succ"; |
241 |
241 |
242 goal Epsilon.thy "rank(Union(A)) = (UN x:A. rank(x))"; |
242 goal Epsilon.thy "rank(Union(A)) = (UN x:A. rank(x))"; |
243 by (rtac equalityI 1); |
243 by (rtac equalityI 1); |
244 by (rtac (rank_mono RS le_imp_subset RS UN_least) 2); |
244 by (rtac (rank_mono RS le_imp_subset RS UN_least) 2); |
245 by (etac Union_upper 2); |
245 by (etac Union_upper 2); |
247 by (rtac UN_least 1); |
247 by (rtac UN_least 1); |
248 by (etac UnionE 1); |
248 by (etac UnionE 1); |
249 by (rtac subset_trans 1); |
249 by (rtac subset_trans 1); |
250 by (etac (RepFunI RS Union_upper) 2); |
250 by (etac (RepFunI RS Union_upper) 2); |
251 by (etac (rank_lt RS succ_leI RS le_imp_subset) 1); |
251 by (etac (rank_lt RS succ_leI RS le_imp_subset) 1); |
252 val rank_Union = result(); |
252 qed "rank_Union"; |
253 |
253 |
254 goal Epsilon.thy "rank(eclose(a)) = rank(a)"; |
254 goal Epsilon.thy "rank(eclose(a)) = rank(a)"; |
255 by (rtac le_anti_sym 1); |
255 by (rtac le_anti_sym 1); |
256 by (rtac (arg_subset_eclose RS rank_mono) 2); |
256 by (rtac (arg_subset_eclose RS rank_mono) 2); |
257 by (res_inst_tac [("a1","eclose(a)")] (rank RS ssubst) 1); |
257 by (res_inst_tac [("a1","eclose(a)")] (rank RS ssubst) 1); |
258 by (rtac (Ord_rank RS UN_least_le) 1); |
258 by (rtac (Ord_rank RS UN_least_le) 1); |
259 by (etac (eclose_rank_lt RS succ_leI) 1); |
259 by (etac (eclose_rank_lt RS succ_leI) 1); |
260 val rank_eclose = result(); |
260 qed "rank_eclose"; |
261 |
261 |
262 goalw Epsilon.thy [Pair_def] "rank(a) < rank(<a,b>)"; |
262 goalw Epsilon.thy [Pair_def] "rank(a) < rank(<a,b>)"; |
263 by (rtac (consI1 RS rank_lt RS lt_trans) 1); |
263 by (rtac (consI1 RS rank_lt RS lt_trans) 1); |
264 by (rtac (consI1 RS consI2 RS rank_lt) 1); |
264 by (rtac (consI1 RS consI2 RS rank_lt) 1); |
265 val rank_pair1 = result(); |
265 qed "rank_pair1"; |
266 |
266 |
267 goalw Epsilon.thy [Pair_def] "rank(b) < rank(<a,b>)"; |
267 goalw Epsilon.thy [Pair_def] "rank(b) < rank(<a,b>)"; |
268 by (rtac (consI1 RS consI2 RS rank_lt RS lt_trans) 1); |
268 by (rtac (consI1 RS consI2 RS rank_lt RS lt_trans) 1); |
269 by (rtac (consI1 RS consI2 RS rank_lt) 1); |
269 by (rtac (consI1 RS consI2 RS rank_lt) 1); |
270 val rank_pair2 = result(); |
270 qed "rank_pair2"; |
271 |
271 |
272 goalw (merge_theories(Epsilon.thy,Sum.thy)) [Inl_def] "rank(a) < rank(Inl(a))"; |
272 goalw (merge_theories(Epsilon.thy,Sum.thy)) [Inl_def] "rank(a) < rank(Inl(a))"; |
273 by (rtac rank_pair2 1); |
273 by (rtac rank_pair2 1); |
274 val rank_Inl = result(); |
274 val rank_Inl = result(); |
275 |
275 |