197 (*So that rule_format will get rid of ALL x<A...*) |
197 (*So that rule_format will get rid of ALL x<A...*) |
198 lemma atomize_oall [symmetric, rulify]: |
198 lemma atomize_oall [symmetric, rulify]: |
199 "(!!x. x<A ==> P(x)) == Trueprop (ALL x<A. P(x))" |
199 "(!!x. x<A ==> P(x)) == Trueprop (ALL x<A. P(x))" |
200 by (simp add: oall_def atomize_all atomize_imp) |
200 by (simp add: oall_def atomize_all atomize_imp) |
201 |
201 |
|
202 (*** universal quantifier for ordinals ***) |
|
203 |
|
204 lemma oallI [intro!]: |
|
205 "[| !!x. x<A ==> P(x) |] ==> ALL x<A. P(x)" |
|
206 by (simp add: oall_def); |
|
207 |
|
208 lemma ospec: "[| ALL x<A. P(x); x<A |] ==> P(x)" |
|
209 by (simp add: oall_def); |
|
210 |
|
211 lemma oallE: |
|
212 "[| ALL x<A. P(x); P(x) ==> Q; ~x<A ==> Q |] ==> Q" |
|
213 apply (simp add: oall_def); |
|
214 apply (blast intro: elim:); |
|
215 done |
|
216 |
|
217 lemma rev_oallE [elim]: |
|
218 "[| ALL x<A. P(x); ~x<A ==> Q; P(x) ==> Q |] ==> Q" |
|
219 apply (simp add: oall_def); |
|
220 apply (blast intro: elim:); |
|
221 done |
|
222 |
|
223 |
|
224 (*Trival rewrite rule; (ALL x<a.P)<->P holds only if a is not 0!*) |
|
225 lemma oall_simp [simp]: "(ALL x<a. True) <-> True" |
|
226 apply (blast intro: elim:); |
|
227 done |
|
228 |
|
229 (*Congruence rule for rewriting*) |
|
230 lemma oall_cong [cong]: |
|
231 "[| a=a'; !!x. x<a' ==> P(x) <-> P'(x) |] ==> oall(a,P) <-> oall(a',P')" |
|
232 by (simp add: oall_def) |
|
233 |
|
234 |
|
235 (*** existential quantifier for ordinals ***) |
|
236 |
|
237 lemma oexI [intro]: |
|
238 "[| P(x); x<A |] ==> EX x<A. P(x)" |
|
239 apply (simp add: oex_def); |
|
240 apply (blast intro: elim:); |
|
241 done |
|
242 |
|
243 (*Not of the general form for such rules; ~EX has become ALL~ *) |
|
244 lemma oexCI: |
|
245 "[| ALL x<A. ~P(x) ==> P(a); a<A |] ==> EX x<A. P(x)" |
|
246 apply (simp add: oex_def); |
|
247 apply (blast intro: elim:); |
|
248 done |
|
249 |
|
250 lemma oexE [elim!]: |
|
251 "[| EX x<A. P(x); !!x. [| x<A; P(x) |] ==> Q |] ==> Q" |
|
252 apply (simp add: oex_def); |
|
253 apply (blast intro: elim:); |
|
254 done |
|
255 |
|
256 lemma oex_cong [cong]: |
|
257 "[| a=a'; !!x. x<a' ==> P(x) <-> P'(x) |] ==> oex(a,P) <-> oex(a',P')" |
|
258 apply (simp add: oex_def cong add: conj_cong) |
|
259 done |
|
260 |
|
261 |
|
262 (*** Rules for Ordinal-Indexed Unions ***) |
|
263 |
|
264 lemma OUN_I [intro]: "[| a<i; b: B(a) |] ==> b: (UN z<i. B(z))" |
|
265 apply (unfold OUnion_def lt_def) |
|
266 apply (blast) |
|
267 done |
|
268 |
|
269 lemma OUN_E [elim!]: |
|
270 "[| b : (UN z<i. B(z)); !!a.[| b: B(a); a<i |] ==> R |] ==> R" |
|
271 apply (unfold OUnion_def lt_def) |
|
272 apply (blast) |
|
273 done |
|
274 |
|
275 lemma OUN_iff: "b : (UN x<i. B(x)) <-> (EX x<i. b : B(x))" |
|
276 apply (unfold OUnion_def oex_def lt_def) |
|
277 apply (blast intro: elim:); |
|
278 done |
|
279 |
|
280 lemma OUN_cong [cong]: |
|
281 "[| i=j; !!x. x<j ==> C(x)=D(x) |] ==> (UN x<i. C(x)) = (UN x<j. D(x))" |
|
282 by (simp add: OUnion_def lt_def OUN_iff) |
|
283 |
|
284 declare ltD [THEN beta, simp] |
|
285 |
|
286 |
|
287 lemma lt_induct: |
|
288 "[| i<k; !!x.[| x<k; ALL y<x. P(y) |] ==> P(x) |] ==> P(i)" |
|
289 apply (simp add: lt_def oall_def) |
|
290 apply (erule conjE) |
|
291 apply (erule Ord_induct, assumption) |
|
292 apply (blast intro: elim:); |
|
293 done |
|
294 |
|
295 ML |
|
296 {* |
|
297 val oall_def = thm "oall_def" |
|
298 val oex_def = thm "oex_def" |
|
299 val OUnion_def = thm "OUnion_def" |
|
300 |
|
301 val oallI = thm "oallI"; |
|
302 val ospec = thm "ospec"; |
|
303 val oallE = thm "oallE"; |
|
304 val rev_oallE = thm "rev_oallE"; |
|
305 val oall_simp = thm "oall_simp"; |
|
306 val oall_cong = thm "oall_cong"; |
|
307 val oexI = thm "oexI"; |
|
308 val oexCI = thm "oexCI"; |
|
309 val oexE = thm "oexE"; |
|
310 val oex_cong = thm "oex_cong"; |
|
311 val OUN_I = thm "OUN_I"; |
|
312 val OUN_E = thm "OUN_E"; |
|
313 val OUN_iff = thm "OUN_iff"; |
|
314 val OUN_cong = thm "OUN_cong"; |
|
315 val lt_induct = thm "lt_induct"; |
|
316 |
|
317 val Ord_atomize = |
|
318 atomize (("OrdQuant.oall", [ospec])::ZF_conn_pairs, ZF_mem_pairs); |
|
319 simpset_ref() := simpset() setmksimps (map mk_eq o Ord_atomize o gen_all); |
|
320 *} |
|
321 |
202 end |
322 end |