| author | wenzelm | 
| Thu, 08 Aug 2002 23:51:24 +0200 | |
| changeset 13486 | 54464ea94d6f | 
| parent 186 | 320f6bdb593a | 
| permissions | -rw-r--r-- | 
| 0 | 1  | 
(* Title: ZF/ordinal.thy  | 
2  | 
ID: $Id$  | 
|
3  | 
Author: Lawrence C Paulson, Cambridge University Computer Laboratory  | 
|
4  | 
Copyright 1993 University of Cambridge  | 
|
5  | 
||
6  | 
For ordinal.thy. Ordinals in Zermelo-Fraenkel Set Theory  | 
|
7  | 
*)  | 
|
8  | 
||
9  | 
open Ord;  | 
|
10  | 
||
11  | 
(*** Rules for Transset ***)  | 
|
12  | 
||
13  | 
(** Two neat characterisations of Transset **)  | 
|
14  | 
||
15  | 
goalw Ord.thy [Transset_def] "Transset(A) <-> A<=Pow(A)";  | 
|
16  | 
by (fast_tac ZF_cs 1);  | 
|
17  | 
val Transset_iff_Pow = result();  | 
|
18  | 
||
19  | 
goalw Ord.thy [Transset_def] "Transset(A) <-> Union(succ(A)) = A";  | 
|
20  | 
by (fast_tac (eq_cs addSEs [equalityE]) 1);  | 
|
21  | 
val Transset_iff_Union_succ = result();  | 
|
22  | 
||
23  | 
(** Consequences of downwards closure **)  | 
|
24  | 
||
25  | 
goalw Ord.thy [Transset_def]  | 
|
26  | 
    "!!C a b. [| Transset(C); {a,b}: C |] ==> a:C & b: C";
 | 
|
27  | 
by (fast_tac ZF_cs 1);  | 
|
28  | 
val Transset_doubleton_D = result();  | 
|
29  | 
||
30  | 
val [prem1,prem2] = goalw Ord.thy [Pair_def]  | 
|
31  | 
"[| Transset(C); <a,b>: C |] ==> a:C & b: C";  | 
|
32  | 
by (cut_facts_tac [prem2] 1);  | 
|
33  | 
by (fast_tac (ZF_cs addSDs [prem1 RS Transset_doubleton_D]) 1);  | 
|
34  | 
val Transset_Pair_D = result();  | 
|
35  | 
||
36  | 
val prem1::prems = goal Ord.thy  | 
|
37  | 
"[| Transset(C); A*B <= C; b: B |] ==> A <= C";  | 
|
38  | 
by (cut_facts_tac prems 1);  | 
|
39  | 
by (fast_tac (ZF_cs addSDs [prem1 RS Transset_Pair_D]) 1);  | 
|
40  | 
val Transset_includes_domain = result();  | 
|
41  | 
||
42  | 
val prem1::prems = goal Ord.thy  | 
|
43  | 
"[| Transset(C); A*B <= C; a: A |] ==> B <= C";  | 
|
44  | 
by (cut_facts_tac prems 1);  | 
|
45  | 
by (fast_tac (ZF_cs addSDs [prem1 RS Transset_Pair_D]) 1);  | 
|
46  | 
val Transset_includes_range = result();  | 
|
47  | 
||
48  | 
val [prem1,prem2] = goalw (merge_theories(Ord.thy,Sum.thy)) [sum_def]  | 
|
49  | 
"[| Transset(C); A+B <= C |] ==> A <= C & B <= C";  | 
|
| 
15
 
6c6d2f6e3185
ex/{bin.ML,comb.ML,prop.ML}: replaced NewSext by Syntax.simple_sext
 
lcp 
parents: 
6 
diff
changeset
 | 
50  | 
by (rtac (prem2 RS (Un_subset_iff RS iffD1) RS conjE) 1);  | 
| 0 | 51  | 
by (REPEAT (etac (prem1 RS Transset_includes_range) 1  | 
52  | 
ORELSE resolve_tac [conjI, singletonI] 1));  | 
|
53  | 
val Transset_includes_summands = result();  | 
|
54  | 
||
55  | 
val [prem] = goalw (merge_theories(Ord.thy,Sum.thy)) [sum_def]  | 
|
56  | 
"Transset(C) ==> (A+B) Int C <= (A Int C) + (B Int C)";  | 
|
| 
15
 
6c6d2f6e3185
ex/{bin.ML,comb.ML,prop.ML}: replaced NewSext by Syntax.simple_sext
 
lcp 
parents: 
6 
diff
changeset
 | 
57  | 
by (rtac (Int_Un_distrib RS ssubst) 1);  | 
| 0 | 58  | 
by (fast_tac (ZF_cs addSDs [prem RS Transset_Pair_D]) 1);  | 
59  | 
val Transset_sum_Int_subset = result();  | 
|
60  | 
||
61  | 
(** Closure properties **)  | 
|
62  | 
||
63  | 
goalw Ord.thy [Transset_def] "Transset(0)";  | 
|
64  | 
by (fast_tac ZF_cs 1);  | 
|
65  | 
val Transset_0 = result();  | 
|
66  | 
||
67  | 
goalw Ord.thy [Transset_def]  | 
|
68  | 
"!!i j. [| Transset(i); Transset(j) |] ==> Transset(i Un j)";  | 
|
69  | 
by (fast_tac ZF_cs 1);  | 
|
70  | 
val Transset_Un = result();  | 
|
71  | 
||
72  | 
goalw Ord.thy [Transset_def]  | 
|
73  | 
"!!i j. [| Transset(i); Transset(j) |] ==> Transset(i Int j)";  | 
|
74  | 
by (fast_tac ZF_cs 1);  | 
|
75  | 
val Transset_Int = result();  | 
|
76  | 
||
77  | 
goalw Ord.thy [Transset_def] "!!i. Transset(i) ==> Transset(succ(i))";  | 
|
78  | 
by (fast_tac ZF_cs 1);  | 
|
79  | 
val Transset_succ = result();  | 
|
80  | 
||
81  | 
goalw Ord.thy [Transset_def] "!!i. Transset(i) ==> Transset(Pow(i))";  | 
|
82  | 
by (fast_tac ZF_cs 1);  | 
|
83  | 
val Transset_Pow = result();  | 
|
84  | 
||
85  | 
goalw Ord.thy [Transset_def] "!!A. Transset(A) ==> Transset(Union(A))";  | 
|
86  | 
by (fast_tac ZF_cs 1);  | 
|
87  | 
val Transset_Union = result();  | 
|
88  | 
||
89  | 
val [Transprem] = goalw Ord.thy [Transset_def]  | 
|
90  | 
"[| !!i. i:A ==> Transset(i) |] ==> Transset(Union(A))";  | 
|
91  | 
by (fast_tac (ZF_cs addEs [Transprem RS bspec RS subsetD]) 1);  | 
|
92  | 
val Transset_Union_family = result();  | 
|
93  | 
||
94  | 
val [prem,Transprem] = goalw Ord.thy [Transset_def]  | 
|
95  | 
"[| j:A; !!i. i:A ==> Transset(i) |] ==> Transset(Inter(A))";  | 
|
96  | 
by (cut_facts_tac [prem] 1);  | 
|
97  | 
by (fast_tac (ZF_cs addEs [Transprem RS bspec RS subsetD]) 1);  | 
|
98  | 
val Transset_Inter_family = result();  | 
|
99  | 
||
100  | 
(*** Natural Deduction rules for Ord ***)  | 
|
101  | 
||
102  | 
val prems = goalw Ord.thy [Ord_def]  | 
|
103  | 
"[| Transset(i); !!x. x:i ==> Transset(x) |] ==> Ord(i) ";  | 
|
104  | 
by (REPEAT (ares_tac (prems@[ballI,conjI]) 1));  | 
|
105  | 
val OrdI = result();  | 
|
106  | 
||
107  | 
val [major] = goalw Ord.thy [Ord_def]  | 
|
108  | 
"Ord(i) ==> Transset(i)";  | 
|
109  | 
by (rtac (major RS conjunct1) 1);  | 
|
110  | 
val Ord_is_Transset = result();  | 
|
111  | 
||
112  | 
val [major,minor] = goalw Ord.thy [Ord_def]  | 
|
113  | 
"[| Ord(i); j:i |] ==> Transset(j) ";  | 
|
114  | 
by (rtac (minor RS (major RS conjunct2 RS bspec)) 1);  | 
|
115  | 
val Ord_contains_Transset = result();  | 
|
116  | 
||
117  | 
(*** Lemmas for ordinals ***)  | 
|
118  | 
||
119  | 
goalw Ord.thy [Ord_def,Transset_def] "!!i j. [| Ord(i); j:i |] ==> Ord(j) ";  | 
|
120  | 
by (fast_tac ZF_cs 1);  | 
|
121  | 
val Ord_in_Ord = result();  | 
|
122  | 
||
| 30 | 123  | 
(* Ord(succ(j)) ==> Ord(j) *)  | 
124  | 
val Ord_succD = succI1 RSN (2, Ord_in_Ord);  | 
|
125  | 
||
| 0 | 126  | 
goal Ord.thy "!!i j. [| Ord(i); Transset(j); j<=i |] ==> Ord(j)";  | 
127  | 
by (REPEAT (ares_tac [OrdI] 1  | 
|
128  | 
ORELSE eresolve_tac [Ord_contains_Transset, subsetD] 1));  | 
|
129  | 
val Ord_subset_Ord = result();  | 
|
130  | 
||
131  | 
goalw Ord.thy [Ord_def,Transset_def] "!!i j. [| j:i; Ord(i) |] ==> j<=i";  | 
|
132  | 
by (fast_tac ZF_cs 1);  | 
|
133  | 
val OrdmemD = result();  | 
|
134  | 
||
135  | 
goal Ord.thy "!!i j k. [| i:j; j:k; Ord(k) |] ==> i:k";  | 
|
136  | 
by (REPEAT (ares_tac [OrdmemD RS subsetD] 1));  | 
|
137  | 
val Ord_trans = result();  | 
|
138  | 
||
139  | 
goal Ord.thy "!!i j. [| i:j; Ord(j) |] ==> succ(i) <= j";  | 
|
140  | 
by (REPEAT (ares_tac [OrdmemD RSN (2,succ_subsetI)] 1));  | 
|
141  | 
val Ord_succ_subsetI = result();  | 
|
142  | 
||
143  | 
||
144  | 
(*** The construction of ordinals: 0, succ, Union ***)  | 
|
145  | 
||
146  | 
goal Ord.thy "Ord(0)";  | 
|
147  | 
by (REPEAT (ares_tac [OrdI,Transset_0] 1 ORELSE etac emptyE 1));  | 
|
148  | 
val Ord_0 = result();  | 
|
149  | 
||
150  | 
goal Ord.thy "!!i. Ord(i) ==> Ord(succ(i))";  | 
|
151  | 
by (REPEAT (ares_tac [OrdI,Transset_succ] 1  | 
|
152  | 
ORELSE eresolve_tac [succE,ssubst,Ord_is_Transset,  | 
|
153  | 
Ord_contains_Transset] 1));  | 
|
154  | 
val Ord_succ = result();  | 
|
155  | 
||
| 30 | 156  | 
goal Ord.thy "Ord(succ(i)) <-> Ord(i)";  | 
157  | 
by (fast_tac (ZF_cs addIs [Ord_succ] addDs [Ord_succD]) 1);  | 
|
158  | 
val Ord_succ_iff = result();  | 
|
159  | 
||
| 186 | 160  | 
goalw Ord.thy [Ord_def] "!!i j. [| Ord(i); Ord(j) |] ==> Ord(i Un j)";  | 
161  | 
by (fast_tac (ZF_cs addSIs [Transset_Un]) 1);  | 
|
162  | 
val Ord_Un = result();  | 
|
163  | 
||
164  | 
goalw Ord.thy [Ord_def] "!!i j. [| Ord(i); Ord(j) |] ==> Ord(i Int j)";  | 
|
165  | 
by (fast_tac (ZF_cs addSIs [Transset_Int]) 1);  | 
|
166  | 
val Ord_Int = result();  | 
|
167  | 
||
| 0 | 168  | 
val nonempty::prems = goal Ord.thy  | 
169  | 
"[| j:A; !!i. i:A ==> Ord(i) |] ==> Ord(Inter(A))";  | 
|
170  | 
by (rtac (nonempty RS Transset_Inter_family RS OrdI) 1);  | 
|
171  | 
by (rtac Ord_is_Transset 1);  | 
|
172  | 
by (REPEAT (ares_tac ([Ord_contains_Transset,nonempty]@prems) 1  | 
|
173  | 
ORELSE etac InterD 1));  | 
|
174  | 
val Ord_Inter = result();  | 
|
175  | 
||
176  | 
val jmemA::prems = goal Ord.thy  | 
|
177  | 
"[| j:A; !!x. x:A ==> Ord(B(x)) |] ==> Ord(INT x:A. B(x))";  | 
|
178  | 
by (rtac (jmemA RS RepFunI RS Ord_Inter) 1);  | 
|
179  | 
by (etac RepFunE 1);  | 
|
180  | 
by (etac ssubst 1);  | 
|
181  | 
by (eresolve_tac prems 1);  | 
|
182  | 
val Ord_INT = result();  | 
|
183  | 
||
184  | 
||
| 30 | 185  | 
(*** < is 'less than' for ordinals ***)  | 
186  | 
||
187  | 
goalw Ord.thy [lt_def] "!!i j. [| i:j; Ord(j) |] ==> i<j";  | 
|
188  | 
by (REPEAT (ares_tac [conjI] 1));  | 
|
189  | 
val ltI = result();  | 
|
190  | 
||
191  | 
val major::prems = goalw Ord.thy [lt_def]  | 
|
192  | 
"[| i<j; [| i:j; Ord(i); Ord(j) |] ==> P |] ==> P";  | 
|
193  | 
by (rtac (major RS conjE) 1);  | 
|
194  | 
by (REPEAT (ares_tac (prems@[Ord_in_Ord]) 1));  | 
|
195  | 
val ltE = result();  | 
|
196  | 
||
197  | 
goal Ord.thy "!!i j. i<j ==> i:j";  | 
|
198  | 
by (etac ltE 1);  | 
|
199  | 
by (assume_tac 1);  | 
|
200  | 
val ltD = result();  | 
|
201  | 
||
202  | 
goalw Ord.thy [lt_def] "~ i<0";  | 
|
203  | 
by (fast_tac ZF_cs 1);  | 
|
204  | 
val not_lt0 = result();  | 
|
205  | 
||
206  | 
(* i<0 ==> R *)  | 
|
207  | 
val lt0E = standard (not_lt0 RS notE);  | 
|
208  | 
||
209  | 
goal Ord.thy "!!i j k. [| i<j; j<k |] ==> i<k";  | 
|
210  | 
by (fast_tac (ZF_cs addSIs [ltI] addSEs [ltE, Ord_trans]) 1);  | 
|
211  | 
val lt_trans = result();  | 
|
212  | 
||
213  | 
goalw Ord.thy [lt_def] "!!i j. [| i<j; j<i |] ==> P";  | 
|
214  | 
by (REPEAT (eresolve_tac [asm_rl, conjE, mem_anti_sym] 1));  | 
|
215  | 
val lt_anti_sym = result();  | 
|
216  | 
||
217  | 
val lt_anti_refl = prove_goal Ord.thy "i<i ==> P"  | 
|
218  | 
(fn [major]=> [ (rtac (major RS (major RS lt_anti_sym)) 1) ]);  | 
|
219  | 
||
220  | 
val lt_not_refl = prove_goal Ord.thy "~ i<i"  | 
|
221  | 
(fn _=> [ (rtac notI 1), (etac lt_anti_refl 1) ]);  | 
|
222  | 
||
223  | 
(** le is less than or equals; recall i le j abbrevs i<succ(j) !! **)  | 
|
224  | 
||
225  | 
goalw Ord.thy [lt_def] "i le j <-> i<j | (i=j & Ord(j))";  | 
|
226  | 
by (fast_tac (ZF_cs addSIs [Ord_succ] addSDs [Ord_succD]) 1);  | 
|
227  | 
val le_iff = result();  | 
|
228  | 
||
229  | 
goal Ord.thy "!!i j. i<j ==> i le j";  | 
|
230  | 
by (asm_simp_tac (ZF_ss addsimps [le_iff]) 1);  | 
|
231  | 
val leI = result();  | 
|
232  | 
||
233  | 
goal Ord.thy "!!i. [| i=j; Ord(j) |] ==> i le j";  | 
|
234  | 
by (asm_simp_tac (ZF_ss addsimps [le_iff]) 1);  | 
|
235  | 
val le_eqI = result();  | 
|
236  | 
||
237  | 
val le_refl = refl RS le_eqI;  | 
|
238  | 
||
239  | 
val [prem] = goal Ord.thy "(~ (i=j & Ord(j)) ==> i<j) ==> i le j";  | 
|
240  | 
by (rtac (disjCI RS (le_iff RS iffD2)) 1);  | 
|
241  | 
by (etac prem 1);  | 
|
242  | 
val leCI = result();  | 
|
243  | 
||
244  | 
val major::prems = goal Ord.thy  | 
|
245  | 
"[| i le j; i<j ==> P; [| i=j; Ord(j) |] ==> P |] ==> P";  | 
|
246  | 
by (rtac (major RS (le_iff RS iffD1 RS disjE)) 1);  | 
|
247  | 
by (DEPTH_SOLVE (ares_tac prems 1 ORELSE etac conjE 1));  | 
|
248  | 
val leE = result();  | 
|
249  | 
||
250  | 
goal Ord.thy "!!i j. [| i le j; j le i |] ==> i=j";  | 
|
251  | 
by (asm_full_simp_tac (ZF_ss addsimps [le_iff]) 1);  | 
|
252  | 
by (fast_tac (ZF_cs addEs [lt_anti_sym]) 1);  | 
|
253  | 
val le_asym = result();  | 
|
254  | 
||
255  | 
goal Ord.thy "i le 0 <-> i=0";  | 
|
256  | 
by (fast_tac (ZF_cs addSIs [Ord_0 RS le_refl] addSEs [leE, lt0E]) 1);  | 
|
257  | 
val le0_iff = result();  | 
|
258  | 
||
259  | 
val le0D = standard (le0_iff RS iffD1);  | 
|
260  | 
||
261  | 
val lt_cs =  | 
|
262  | 
ZF_cs addSIs [le_refl, leCI]  | 
|
263  | 
addSDs [le0D]  | 
|
264  | 
addSEs [lt_anti_refl, lt0E, leE];  | 
|
265  | 
||
266  | 
||
| 0 | 267  | 
(*** Natural Deduction rules for Memrel ***)  | 
268  | 
||
269  | 
goalw Ord.thy [Memrel_def] "<a,b> : Memrel(A) <-> a:b & a:A & b:A";  | 
|
270  | 
by (fast_tac ZF_cs 1);  | 
|
271  | 
val Memrel_iff = result();  | 
|
272  | 
||
273  | 
val prems = goal Ord.thy "[| a: b; a: A; b: A |] ==> <a,b> : Memrel(A)";  | 
|
274  | 
by (REPEAT (resolve_tac (prems@[conjI, Memrel_iff RS iffD2]) 1));  | 
|
275  | 
val MemrelI = result();  | 
|
276  | 
||
277  | 
val [major,minor] = goal Ord.thy  | 
|
278  | 
"[| <a,b> : Memrel(A); \  | 
|
279  | 
\ [| a: A; b: A; a:b |] ==> P \  | 
|
280  | 
\ |] ==> P";  | 
|
281  | 
by (rtac (major RS (Memrel_iff RS iffD1) RS conjE) 1);  | 
|
282  | 
by (etac conjE 1);  | 
|
283  | 
by (rtac minor 1);  | 
|
284  | 
by (REPEAT (assume_tac 1));  | 
|
285  | 
val MemrelE = result();  | 
|
286  | 
||
287  | 
(*The membership relation (as a set) is well-founded.  | 
|
288  | 
Proof idea: show A<=B by applying the foundation axiom to A-B *)  | 
|
289  | 
goalw Ord.thy [wf_def] "wf(Memrel(A))";  | 
|
290  | 
by (EVERY1 [rtac (foundation RS disjE RS allI),  | 
|
291  | 
etac disjI1,  | 
|
292  | 
etac bexE,  | 
|
293  | 
rtac (impI RS allI RS bexI RS disjI2),  | 
|
294  | 
etac MemrelE,  | 
|
295  | 
etac bspec,  | 
|
296  | 
REPEAT o assume_tac]);  | 
|
297  | 
val wf_Memrel = result();  | 
|
298  | 
||
299  | 
(*** Transfinite induction ***)  | 
|
300  | 
||
301  | 
(*Epsilon induction over a transitive set*)  | 
|
302  | 
val major::prems = goalw Ord.thy [Transset_def]  | 
|
303  | 
"[| i: k; Transset(k); \  | 
|
304  | 
\ !!x.[| x: k; ALL y:x. P(y) |] ==> P(x) \  | 
|
305  | 
\ |] ==> P(i)";  | 
|
306  | 
by (rtac (major RS (wf_Memrel RS wf_induct2)) 1);  | 
|
307  | 
by (fast_tac (ZF_cs addEs [MemrelE]) 1);  | 
|
308  | 
by (resolve_tac prems 1);  | 
|
309  | 
by (assume_tac 1);  | 
|
310  | 
by (cut_facts_tac prems 1);  | 
|
311  | 
by (fast_tac (ZF_cs addIs [MemrelI]) 1);  | 
|
312  | 
val Transset_induct = result();  | 
|
313  | 
||
314  | 
(*Induction over an ordinal*)  | 
|
315  | 
val Ord_induct = Ord_is_Transset RSN (2, Transset_induct);  | 
|
316  | 
||
317  | 
(*Induction over the class of ordinals -- a useful corollary of Ord_induct*)  | 
|
318  | 
val [major,indhyp] = goal Ord.thy  | 
|
319  | 
"[| Ord(i); \  | 
|
320  | 
\ !!x.[| Ord(x); ALL y:x. P(y) |] ==> P(x) \  | 
|
321  | 
\ |] ==> P(i)";  | 
|
322  | 
by (rtac (major RS Ord_succ RS (succI1 RS Ord_induct)) 1);  | 
|
323  | 
by (rtac indhyp 1);  | 
|
324  | 
by (rtac (major RS Ord_succ RS Ord_in_Ord) 1);  | 
|
325  | 
by (REPEAT (assume_tac 1));  | 
|
326  | 
val trans_induct = result();  | 
|
327  | 
||
328  | 
(*Perform induction on i, then prove the Ord(i) subgoal using prems. *)  | 
|
329  | 
fun trans_ind_tac a prems i =  | 
|
330  | 
    EVERY [res_inst_tac [("i",a)] trans_induct i,
 | 
|
331  | 
rename_last_tac a ["1"] (i+1),  | 
|
332  | 
ares_tac prems i];  | 
|
333  | 
||
334  | 
||
335  | 
(*** Fundamental properties of the epsilon ordering (< on ordinals) ***)  | 
|
336  | 
||
337  | 
(*Finds contradictions for the following proof*)  | 
|
338  | 
val Ord_trans_tac = EVERY' [etac notE, etac Ord_trans, REPEAT o atac];  | 
|
339  | 
||
| 30 | 340  | 
(** Proving that < is a linear ordering on the ordinals **)  | 
| 0 | 341  | 
|
342  | 
val prems = goal Ord.thy  | 
|
343  | 
"Ord(i) ==> (ALL j. Ord(j) --> i:j | i=j | j:i)";  | 
|
344  | 
by (trans_ind_tac "i" prems 1);  | 
|
345  | 
by (rtac (impI RS allI) 1);  | 
|
346  | 
by (trans_ind_tac "j" [] 1);  | 
|
347  | 
by (DEPTH_SOLVE (swap_res_tac [disjCI,equalityI,subsetI] 1  | 
|
348  | 
ORELSE ball_tac 1  | 
|
349  | 
ORELSE eresolve_tac [impE,disjE,allE] 1  | 
|
350  | 
ORELSE hyp_subst_tac 1  | 
|
351  | 
ORELSE Ord_trans_tac 1));  | 
|
352  | 
val Ord_linear_lemma = result();  | 
|
353  | 
||
| 30 | 354  | 
(*The trichotomy law for ordinals!*)  | 
355  | 
val ordi::ordj::prems = goalw Ord.thy [lt_def]  | 
|
356  | 
"[| Ord(i); Ord(j); i<j ==> P; i=j ==> P; j<i ==> P |] ==> P";  | 
|
357  | 
by (rtac ([ordi,ordj] MRS (Ord_linear_lemma RS spec RS impE)) 1);  | 
|
358  | 
by (REPEAT (FIRSTGOAL (etac disjE)));  | 
|
359  | 
by (DEPTH_SOLVE (ares_tac ([ordi,ordj,conjI] @ prems) 1));  | 
|
360  | 
val Ord_linear_lt = result();  | 
|
| 0 | 361  | 
|
362  | 
val prems = goal Ord.thy  | 
|
| 30 | 363  | 
"[| Ord(i); Ord(j); i le j ==> P; j le i ==> P |] ==> P";  | 
364  | 
by (res_inst_tac [("i","i"),("j","j")] Ord_linear_lt 1);
 | 
|
365  | 
by (DEPTH_SOLVE (ares_tac ([leI,le_eqI] @ prems) 1));  | 
|
366  | 
val Ord_linear_le = result();  | 
|
367  | 
||
368  | 
goal Ord.thy "!!i j. j le i ==> ~ i<j";  | 
|
369  | 
by (fast_tac (lt_cs addEs [lt_anti_sym]) 1);  | 
|
370  | 
val le_imp_not_lt = result();  | 
|
| 0 | 371  | 
|
| 30 | 372  | 
goal Ord.thy "!!i j. [| ~ i<j; Ord(i); Ord(j) |] ==> j le i";  | 
373  | 
by (res_inst_tac [("i","i"),("j","j")] Ord_linear_le 1);
 | 
|
374  | 
by (REPEAT (SOMEGOAL assume_tac));  | 
|
375  | 
by (fast_tac (lt_cs addEs [lt_anti_sym]) 1);  | 
|
376  | 
val not_lt_imp_le = result();  | 
|
| 0 | 377  | 
|
| 30 | 378  | 
goal Ord.thy "!!i j. [| Ord(i); Ord(j) |] ==> ~ i<j <-> j le i";  | 
379  | 
by (REPEAT (ares_tac [iffI, le_imp_not_lt, not_lt_imp_le] 1));  | 
|
380  | 
val not_lt_iff_le = result();  | 
|
| 0 | 381  | 
|
| 30 | 382  | 
goal Ord.thy "!!i j. [| Ord(i); Ord(j) |] ==> ~ i le j <-> j<i";  | 
383  | 
by (asm_simp_tac (ZF_ss addsimps [not_lt_iff_le RS iff_sym]) 1);  | 
|
384  | 
val not_le_iff_lt = result();  | 
|
385  | 
||
386  | 
goal Ord.thy "!!i. Ord(i) ==> 0 le i";  | 
|
387  | 
by (etac (not_lt_iff_le RS iffD1) 1);  | 
|
388  | 
by (REPEAT (resolve_tac [Ord_0, not_lt0] 1));  | 
|
389  | 
val Ord_0_le = result();  | 
|
| 0 | 390  | 
|
| 37 | 391  | 
goal Ord.thy "!!i. [| Ord(i); i~=0 |] ==> 0<i";  | 
| 30 | 392  | 
by (etac (not_le_iff_lt RS iffD1) 1);  | 
393  | 
by (rtac Ord_0 1);  | 
|
394  | 
by (fast_tac lt_cs 1);  | 
|
395  | 
val Ord_0_lt = result();  | 
|
| 0 | 396  | 
|
| 30 | 397  | 
(*** Results about less-than or equals ***)  | 
398  | 
||
399  | 
(** For ordinals, j<=i (subset) implies j le i (less-than or equals) **)  | 
|
| 0 | 400  | 
|
| 30 | 401  | 
goal Ord.thy "!!i j. [| j<=i; Ord(i); Ord(j) |] ==> j le i";  | 
402  | 
by (rtac (not_lt_iff_le RS iffD1) 1);  | 
|
403  | 
by (assume_tac 1);  | 
|
404  | 
by (assume_tac 1);  | 
|
405  | 
by (fast_tac (ZF_cs addEs [ltE, mem_anti_refl]) 1);  | 
|
406  | 
val subset_imp_le = result();  | 
|
| 0 | 407  | 
|
| 30 | 408  | 
goal Ord.thy "!!i j. i le j ==> i<=j";  | 
409  | 
by (etac leE 1);  | 
|
410  | 
by (fast_tac ZF_cs 2);  | 
|
411  | 
by (fast_tac (subset_cs addIs [OrdmemD] addEs [ltE]) 1);  | 
|
412  | 
val le_imp_subset = result();  | 
|
| 0 | 413  | 
|
| 30 | 414  | 
goal Ord.thy "j le i <-> j<=i & Ord(i) & Ord(j)";  | 
415  | 
by (fast_tac (ZF_cs addSEs [subset_imp_le, le_imp_subset]  | 
|
416  | 
addEs [ltE, make_elim Ord_succD]) 1);  | 
|
417  | 
val le_subset_iff = result();  | 
|
418  | 
||
419  | 
goal Ord.thy "i le succ(j) <-> i le j | i=succ(j) & Ord(i)";  | 
|
420  | 
by (simp_tac (ZF_ss addsimps [le_iff]) 1);  | 
|
421  | 
by (fast_tac (ZF_cs addIs [Ord_succ] addDs [Ord_succD]) 1);  | 
|
422  | 
val le_succ_iff = result();  | 
|
| 0 | 423  | 
|
| 30 | 424  | 
goal Ord.thy "!!i j. [| i le j; j<k |] ==> i<k";  | 
425  | 
by (fast_tac (ZF_cs addEs [leE, lt_trans]) 1);  | 
|
426  | 
val lt_trans1 = result();  | 
|
| 0 | 427  | 
|
| 30 | 428  | 
goal Ord.thy "!!i j. [| i<j; j le k |] ==> i<k";  | 
429  | 
by (fast_tac (ZF_cs addEs [leE, lt_trans]) 1);  | 
|
430  | 
val lt_trans2 = result();  | 
|
431  | 
||
432  | 
goal Ord.thy "!!i j. [| i le j; j le k |] ==> i le k";  | 
|
433  | 
by (REPEAT (ares_tac [lt_trans1] 1));  | 
|
434  | 
val le_trans = result();  | 
|
| 0 | 435  | 
|
| 30 | 436  | 
goal Ord.thy "!!i j. i<j ==> succ(i) le j";  | 
437  | 
by (rtac (not_lt_iff_le RS iffD1) 1);  | 
|
438  | 
by (fast_tac (lt_cs addEs [lt_anti_sym]) 3);  | 
|
439  | 
by (ALLGOALS (fast_tac (ZF_cs addEs [ltE] addIs [Ord_succ])));  | 
|
440  | 
val succ_leI = result();  | 
|
| 0 | 441  | 
|
| 30 | 442  | 
goal Ord.thy "!!i j. succ(i) le j ==> i<j";  | 
443  | 
by (rtac (not_le_iff_lt RS iffD1) 1);  | 
|
444  | 
by (fast_tac (lt_cs addEs [lt_anti_sym]) 3);  | 
|
445  | 
by (ALLGOALS (fast_tac (ZF_cs addEs [ltE, make_elim Ord_succD])));  | 
|
446  | 
val succ_leE = result();  | 
|
| 0 | 447  | 
|
| 30 | 448  | 
goal Ord.thy "succ(i) le j <-> i<j";  | 
449  | 
by (REPEAT (ares_tac [iffI,succ_leI,succ_leE] 1));  | 
|
450  | 
val succ_le_iff = result();  | 
|
| 0 | 451  | 
|
| 
15
 
6c6d2f6e3185
ex/{bin.ML,comb.ML,prop.ML}: replaced NewSext by Syntax.simple_sext
 
lcp 
parents: 
6 
diff
changeset
 | 
452  | 
(** Union and Intersection **)  | 
| 
 
6c6d2f6e3185
ex/{bin.ML,comb.ML,prop.ML}: replaced NewSext by Syntax.simple_sext
 
lcp 
parents: 
6 
diff
changeset
 | 
453  | 
|
| 186 | 454  | 
goal Ord.thy "!!i j. [| Ord(i); Ord(j) |] ==> i le i Un j";  | 
455  | 
by (rtac (Un_upper1 RS subset_imp_le) 1);  | 
|
456  | 
by (REPEAT (ares_tac [Ord_Un] 1));  | 
|
457  | 
val Un_upper1_le = result();  | 
|
458  | 
||
459  | 
goal Ord.thy "!!i j. [| Ord(i); Ord(j) |] ==> j le i Un j";  | 
|
460  | 
by (rtac (Un_upper2 RS subset_imp_le) 1);  | 
|
461  | 
by (REPEAT (ares_tac [Ord_Un] 1));  | 
|
462  | 
val Un_upper2_le = result();  | 
|
463  | 
||
| 30 | 464  | 
(*Replacing k by succ(k') yields the similar rule for le!*)  | 
465  | 
goal Ord.thy "!!i j k. [| i<k; j<k |] ==> i Un j < k";  | 
|
466  | 
by (res_inst_tac [("i","i"),("j","j")] Ord_linear_le 1);
 | 
|
467  | 
by (rtac (Un_commute RS ssubst) 4);  | 
|
468  | 
by (asm_full_simp_tac (ZF_ss addsimps [le_subset_iff, subset_Un_iff]) 4);  | 
|
469  | 
by (asm_full_simp_tac (ZF_ss addsimps [le_subset_iff, subset_Un_iff]) 3);  | 
|
470  | 
by (REPEAT (eresolve_tac [asm_rl, ltE] 1));  | 
|
471  | 
val Un_least_lt = result();  | 
|
| 0 | 472  | 
|
| 30 | 473  | 
(*Replacing k by succ(k') yields the similar rule for le!*)  | 
474  | 
goal Ord.thy "!!i j k. [| i<k; j<k |] ==> i Int j < k";  | 
|
475  | 
by (res_inst_tac [("i","i"),("j","j")] Ord_linear_le 1);
 | 
|
476  | 
by (rtac (Int_commute RS ssubst) 4);  | 
|
477  | 
by (asm_full_simp_tac (ZF_ss addsimps [le_subset_iff, subset_Int_iff]) 4);  | 
|
478  | 
by (asm_full_simp_tac (ZF_ss addsimps [le_subset_iff, subset_Int_iff]) 3);  | 
|
479  | 
by (REPEAT (eresolve_tac [asm_rl, ltE] 1));  | 
|
480  | 
val Int_greatest_lt = result();  | 
|
| 0 | 481  | 
|
482  | 
(*** Results about limits ***)  | 
|
483  | 
||
484  | 
val prems = goal Ord.thy "[| !!i. i:A ==> Ord(i) |] ==> Ord(Union(A))";  | 
|
485  | 
by (rtac (Ord_is_Transset RS Transset_Union_family RS OrdI) 1);  | 
|
486  | 
by (REPEAT (etac UnionE 1 ORELSE ares_tac ([Ord_contains_Transset]@prems) 1));  | 
|
487  | 
val Ord_Union = result();  | 
|
488  | 
||
489  | 
val prems = goal Ord.thy "[| !!x. x:A ==> Ord(B(x)) |] ==> Ord(UN x:A. B(x))";  | 
|
490  | 
by (rtac Ord_Union 1);  | 
|
491  | 
by (etac RepFunE 1);  | 
|
492  | 
by (etac ssubst 1);  | 
|
493  | 
by (eresolve_tac prems 1);  | 
|
494  | 
val Ord_UN = result();  | 
|
495  | 
||
| 30 | 496  | 
(* No < version; consider (UN i:nat.i)=nat *)  | 
| 0 | 497  | 
val [ordi,limit] = goal Ord.thy  | 
| 30 | 498  | 
"[| Ord(i); !!x. x:A ==> b(x) le i |] ==> (UN x:A. b(x)) le i";  | 
499  | 
by (rtac (le_imp_subset RS UN_least RS subset_imp_le) 1);  | 
|
500  | 
by (REPEAT (ares_tac [ordi, Ord_UN, limit] 1 ORELSE etac (limit RS ltE) 1));  | 
|
501  | 
val UN_least_le = result();  | 
|
| 0 | 502  | 
|
| 30 | 503  | 
val [jlti,limit] = goal Ord.thy  | 
504  | 
"[| j<i; !!x. x:A ==> b(x)<j |] ==> (UN x:A. succ(b(x))) < i";  | 
|
505  | 
by (rtac (jlti RS ltE) 1);  | 
|
506  | 
by (rtac (UN_least_le RS lt_trans2) 1);  | 
|
507  | 
by (REPEAT (ares_tac [jlti, succ_leI, limit] 1));  | 
|
508  | 
val UN_succ_least_lt = result();  | 
|
509  | 
||
510  | 
val prems = goal Ord.thy  | 
|
511  | 
"[| a: A; i le b(a); !!x. x:A ==> Ord(b(x)) |] ==> i le (UN x:A. b(x))";  | 
|
512  | 
by (resolve_tac (prems RL [ltE]) 1);  | 
|
513  | 
by (rtac (le_imp_subset RS subset_trans RS subset_imp_le) 1);  | 
|
514  | 
by (REPEAT (ares_tac (prems @ [UN_upper, Ord_UN]) 1));  | 
|
515  | 
val UN_upper_le = result();  | 
|
| 0 | 516  | 
|
517  | 
goal Ord.thy "!!i. Ord(i) ==> (UN y:i. succ(y)) = i";  | 
|
| 30 | 518  | 
by (fast_tac (eq_cs addEs [Ord_trans]) 1);  | 
| 0 | 519  | 
val Ord_equality = result();  | 
520  | 
||
521  | 
(*Holds for all transitive sets, not just ordinals*)  | 
|
522  | 
goal Ord.thy "!!i. Ord(i) ==> Union(i) <= i";  | 
|
523  | 
by (fast_tac (ZF_cs addSEs [Ord_trans]) 1);  | 
|
524  | 
val Ord_Union_subset = result();  |