71 |
71 |
72 Goalw [Transset_def] "Transset(A) ==> Transset(Union(A))"; |
72 Goalw [Transset_def] "Transset(A) ==> Transset(Union(A))"; |
73 by (Blast_tac 1); |
73 by (Blast_tac 1); |
74 qed "Transset_Union"; |
74 qed "Transset_Union"; |
75 |
75 |
76 val [Transprem] = goalw Ordinal.thy [Transset_def] |
76 val [Transprem] = Goalw [Transset_def] |
77 "[| !!i. i:A ==> Transset(i) |] ==> Transset(Union(A))"; |
77 "[| !!i. i:A ==> Transset(i) |] ==> Transset(Union(A))"; |
78 by (blast_tac (claset() addDs [Transprem RS bspec RS subsetD]) 1); |
78 by (blast_tac (claset() addDs [Transprem RS bspec RS subsetD]) 1); |
79 qed "Transset_Union_family"; |
79 qed "Transset_Union_family"; |
80 |
80 |
81 val [prem,Transprem] = goalw Ordinal.thy [Transset_def] |
81 val [prem,Transprem] = Goalw [Transset_def] |
82 "[| j:A; !!i. i:A ==> Transset(i) |] ==> Transset(Inter(A))"; |
82 "[| j:A; !!i. i:A ==> Transset(i) |] ==> Transset(Inter(A))"; |
83 by (cut_facts_tac [prem] 1); |
83 by (cut_facts_tac [prem] 1); |
84 by (blast_tac (claset() addDs [Transprem RS bspec RS subsetD]) 1); |
84 by (blast_tac (claset() addDs [Transprem RS bspec RS subsetD]) 1); |
85 qed "Transset_Inter_family"; |
85 qed "Transset_Inter_family"; |
86 |
86 |
87 (*** Natural Deduction rules for Ord ***) |
87 (*** Natural Deduction rules for Ord ***) |
88 |
88 |
89 val prems = goalw Ordinal.thy [Ord_def] |
89 val prems = Goalw [Ord_def] |
90 "[| Transset(i); !!x. x:i ==> Transset(x) |] ==> Ord(i)"; |
90 "[| Transset(i); !!x. x:i ==> Transset(x) |] ==> Ord(i)"; |
91 by (REPEAT (ares_tac (prems@[ballI,conjI]) 1)); |
91 by (REPEAT (ares_tac (prems@[ballI,conjI]) 1)); |
92 qed "OrdI"; |
92 qed "OrdI"; |
93 |
93 |
94 val [major] = goalw Ordinal.thy [Ord_def] |
94 Goalw [Ord_def] "Ord(i) ==> Transset(i)"; |
95 "Ord(i) ==> Transset(i)"; |
95 by (Blast_tac 1); |
96 by (rtac (major RS conjunct1) 1); |
|
97 qed "Ord_is_Transset"; |
96 qed "Ord_is_Transset"; |
98 |
97 |
99 val [major,minor] = goalw Ordinal.thy [Ord_def] |
98 Goalw [Ord_def] |
100 "[| Ord(i); j:i |] ==> Transset(j) "; |
99 "[| Ord(i); j:i |] ==> Transset(j) "; |
101 by (rtac (minor RS (major RS conjunct2 RS bspec)) 1); |
100 by (Blast_tac 1); |
102 qed "Ord_contains_Transset"; |
101 qed "Ord_contains_Transset"; |
103 |
102 |
104 (*** Lemmas for ordinals ***) |
103 (*** Lemmas for ordinals ***) |
105 |
104 |
106 Goalw [Ord_def,Transset_def] "[| Ord(i); j:i |] ==> Ord(j)"; |
105 Goalw [Ord_def,Transset_def] "[| Ord(i); j:i |] ==> Ord(j)"; |
157 |
156 |
158 Goalw [Ord_def] "[| Ord(i); Ord(j) |] ==> Ord(i Int j)"; |
157 Goalw [Ord_def] "[| Ord(i); Ord(j) |] ==> Ord(i Int j)"; |
159 by (blast_tac (claset() addSIs [Transset_Int]) 1); |
158 by (blast_tac (claset() addSIs [Transset_Int]) 1); |
160 qed "Ord_Int"; |
159 qed "Ord_Int"; |
161 |
160 |
162 val nonempty::prems = goal Ordinal.thy |
161 val nonempty::prems = Goal |
163 "[| j:A; !!i. i:A ==> Ord(i) |] ==> Ord(Inter(A))"; |
162 "[| j:A; !!i. i:A ==> Ord(i) |] ==> Ord(Inter(A))"; |
164 by (rtac (nonempty RS Transset_Inter_family RS OrdI) 1); |
163 by (rtac (nonempty RS Transset_Inter_family RS OrdI) 1); |
165 by (rtac Ord_is_Transset 1); |
164 by (rtac Ord_is_Transset 1); |
166 by (REPEAT (ares_tac ([Ord_contains_Transset,nonempty]@prems) 1 |
165 by (REPEAT (ares_tac ([Ord_contains_Transset,nonempty]@prems) 1 |
167 ORELSE etac InterD 1)); |
166 ORELSE etac InterD 1)); |
168 qed "Ord_Inter"; |
167 qed "Ord_Inter"; |
169 |
168 |
170 val jmemA::prems = goal Ordinal.thy |
169 val jmemA::prems = Goal |
171 "[| j:A; !!x. x:A ==> Ord(B(x)) |] ==> Ord(INT x:A. B(x))"; |
170 "[| j:A; !!x. x:A ==> Ord(B(x)) |] ==> Ord(INT x:A. B(x))"; |
172 by (rtac (jmemA RS RepFunI RS Ord_Inter) 1); |
171 by (rtac (jmemA RS RepFunI RS Ord_Inter) 1); |
173 by (etac RepFunE 1); |
172 by (etac RepFunE 1); |
174 by (etac ssubst 1); |
173 by (etac ssubst 1); |
175 by (eresolve_tac prems 1); |
174 by (eresolve_tac prems 1); |
256 by (asm_simp_tac (simpset() addsimps [le_iff]) 1); |
255 by (asm_simp_tac (simpset() addsimps [le_iff]) 1); |
257 qed "le_eqI"; |
256 qed "le_eqI"; |
258 |
257 |
259 val le_refl = refl RS le_eqI; |
258 val le_refl = refl RS le_eqI; |
260 |
259 |
261 val [prem] = goal Ordinal.thy "(~ (i=j & Ord(j)) ==> i<j) ==> i le j"; |
260 val [prem] = Goal "(~ (i=j & Ord(j)) ==> i<j) ==> i le j"; |
262 by (rtac (disjCI RS (le_iff RS iffD2)) 1); |
261 by (rtac (disjCI RS (le_iff RS iffD2)) 1); |
263 by (etac prem 1); |
262 by (etac prem 1); |
264 qed "leCI"; |
263 qed "leCI"; |
265 |
264 |
266 val major::prems = goal Ordinal.thy |
265 val major::prems = Goal |
267 "[| i le j; i<j ==> P; [| i=j; Ord(j) |] ==> P |] ==> P"; |
266 "[| i le j; i<j ==> P; [| i=j; Ord(j) |] ==> P |] ==> P"; |
268 by (rtac (major RS (le_iff RS iffD1 RS disjE)) 1); |
267 by (rtac (major RS (le_iff RS iffD1 RS disjE)) 1); |
269 by (DEPTH_SOLVE (ares_tac prems 1 ORELSE etac conjE 1)); |
268 by (DEPTH_SOLVE (ares_tac prems 1 ORELSE etac conjE 1)); |
270 qed "leE"; |
269 qed "leE"; |
271 |
270 |
296 |
295 |
297 Goal "[| a: b; a: A; b: A |] ==> <a,b> : Memrel(A)"; |
296 Goal "[| a: b; a: A; b: A |] ==> <a,b> : Memrel(A)"; |
298 by (REPEAT (ares_tac [conjI, Memrel_iff RS iffD2] 1)); |
297 by (REPEAT (ares_tac [conjI, Memrel_iff RS iffD2] 1)); |
299 qed "MemrelI"; |
298 qed "MemrelI"; |
300 |
299 |
301 val [major,minor] = goal Ordinal.thy |
300 val [major,minor] = Goal |
302 "[| <a,b> : Memrel(A); \ |
301 "[| <a,b> : Memrel(A); \ |
303 \ [| a: A; b: A; a:b |] ==> P \ |
302 \ [| a: A; b: A; a:b |] ==> P \ |
304 \ |] ==> P"; |
303 \ |] ==> P"; |
305 by (rtac (major RS (Memrel_iff RS iffD1) RS conjE) 1); |
304 by (rtac (major RS (Memrel_iff RS iffD1) RS conjE) 1); |
306 by (etac conjE 1); |
305 by (etac conjE 1); |
371 |
370 |
372 (*Induction over an ordinal*) |
371 (*Induction over an ordinal*) |
373 val Ord_induct = Ord_is_Transset RSN (2, Transset_induct); |
372 val Ord_induct = Ord_is_Transset RSN (2, Transset_induct); |
374 |
373 |
375 (*Induction over the class of ordinals -- a useful corollary of Ord_induct*) |
374 (*Induction over the class of ordinals -- a useful corollary of Ord_induct*) |
376 val [major,indhyp] = goal Ordinal.thy |
375 val [major,indhyp] = Goal |
377 "[| Ord(i); \ |
376 "[| Ord(i); \ |
378 \ !!x.[| Ord(x); ALL y:x. P(y) |] ==> P(x) \ |
377 \ !!x.[| Ord(x); ALL y:x. P(y) |] ==> P(x) \ |
379 \ |] ==> P(i)"; |
378 \ |] ==> P(i)"; |
380 by (rtac (major RS Ord_succ RS (succI1 RS Ord_induct)) 1); |
379 by (rtac (major RS Ord_succ RS (succI1 RS Ord_induct)) 1); |
381 by (rtac indhyp 1); |
380 by (rtac indhyp 1); |
395 (*Finds contradictions for the following proof*) |
394 (*Finds contradictions for the following proof*) |
396 val Ord_trans_tac = EVERY' [etac notE, etac Ord_trans, REPEAT o atac]; |
395 val Ord_trans_tac = EVERY' [etac notE, etac Ord_trans, REPEAT o atac]; |
397 |
396 |
398 (** Proving that < is a linear ordering on the ordinals **) |
397 (** Proving that < is a linear ordering on the ordinals **) |
399 |
398 |
400 val prems = goal Ordinal.thy |
399 Goal "Ord(i) ==> (ALL j. Ord(j) --> i:j | i=j | j:i)"; |
401 "Ord(i) ==> (ALL j. Ord(j) --> i:j | i=j | j:i)"; |
400 by (etac trans_induct 1); |
402 by (trans_ind_tac "i" prems 1); |
|
403 by (rtac (impI RS allI) 1); |
401 by (rtac (impI RS allI) 1); |
404 by (trans_ind_tac "j" [] 1); |
402 by (trans_ind_tac "j" [] 1); |
405 by (DEPTH_SOLVE (Step_tac 1 ORELSE Ord_trans_tac 1)); |
403 by (DEPTH_SOLVE (Step_tac 1 ORELSE Ord_trans_tac 1)); |
406 qed_spec_mp "Ord_linear"; |
404 qed_spec_mp "Ord_linear"; |
407 |
405 |
408 (*The trichotomy law for ordinals!*) |
406 (*The trichotomy law for ordinals!*) |
409 val ordi::ordj::prems = goalw Ordinal.thy [lt_def] |
407 val ordi::ordj::prems = Goalw [lt_def] |
410 "[| Ord(i); Ord(j); i<j ==> P; i=j ==> P; j<i ==> P |] ==> P"; |
408 "[| Ord(i); Ord(j); i<j ==> P; i=j ==> P; j<i ==> P |] ==> P"; |
411 by (rtac ([ordi,ordj] MRS Ord_linear RS disjE) 1); |
409 by (rtac ([ordi,ordj] MRS Ord_linear RS disjE) 1); |
412 by (etac disjE 2); |
410 by (etac disjE 2); |
413 by (DEPTH_SOLVE (ares_tac ([ordi,ordj,conjI] @ prems) 1)); |
411 by (DEPTH_SOLVE (ares_tac ([ordi,ordj,conjI] @ prems) 1)); |
414 qed "Ord_linear_lt"; |
412 qed "Ord_linear_lt"; |
415 |
413 |
416 val prems = goal Ordinal.thy |
414 val prems = Goal |
417 "[| Ord(i); Ord(j); i<j ==> P; j le i ==> P |] ==> P"; |
415 "[| Ord(i); Ord(j); i<j ==> P; j le i ==> P |] ==> P"; |
418 by (res_inst_tac [("i","i"),("j","j")] Ord_linear_lt 1); |
416 by (res_inst_tac [("i","i"),("j","j")] Ord_linear_lt 1); |
419 by (DEPTH_SOLVE (ares_tac ([leI, sym RS le_eqI] @ prems) 1)); |
417 by (DEPTH_SOLVE (ares_tac ([leI, sym RS le_eqI] @ prems) 1)); |
420 qed "Ord_linear2"; |
418 qed "Ord_linear2"; |
421 |
419 |
422 val prems = goal Ordinal.thy |
420 val prems = Goal |
423 "[| Ord(i); Ord(j); i le j ==> P; j le i ==> P |] ==> P"; |
421 "[| Ord(i); Ord(j); i le j ==> P; j le i ==> P |] ==> P"; |
424 by (res_inst_tac [("i","i"),("j","j")] Ord_linear_lt 1); |
422 by (res_inst_tac [("i","i"),("j","j")] Ord_linear_lt 1); |
425 by (DEPTH_SOLVE (ares_tac ([leI,le_eqI] @ prems) 1)); |
423 by (DEPTH_SOLVE (ares_tac ([leI,le_eqI] @ prems) 1)); |
426 qed "Ord_linear_le"; |
424 qed "Ord_linear_le"; |
427 |
425 |
487 by (simp_tac (simpset() addsimps [le_iff]) 1); |
485 by (simp_tac (simpset() addsimps [le_iff]) 1); |
488 by (blast_tac (claset() addIs [Ord_succ] addDs [Ord_succD]) 1); |
486 by (blast_tac (claset() addIs [Ord_succ] addDs [Ord_succD]) 1); |
489 qed "le_succ_iff"; |
487 qed "le_succ_iff"; |
490 |
488 |
491 (*Just a variant of subset_imp_le*) |
489 (*Just a variant of subset_imp_le*) |
492 val [ordi,ordj,minor] = goal Ordinal.thy |
490 val [ordi,ordj,minor] = Goal |
493 "[| Ord(i); Ord(j); !!x. x<j ==> x<i |] ==> j le i"; |
491 "[| Ord(i); Ord(j); !!x. x<j ==> x<i |] ==> j le i"; |
494 by (REPEAT_FIRST (ares_tac [notI RS not_lt_imp_le, ordi, ordj])); |
492 by (REPEAT_FIRST (ares_tac [notI RS not_lt_imp_le, ordi, ordj])); |
495 by (etac (minor RS lt_irrefl) 1); |
493 by (etac (minor RS lt_irrefl) 1); |
496 qed "all_lt_imp_le"; |
494 qed "all_lt_imp_le"; |
497 |
495 |
579 (*FIXME: the Intersection duals are missing!*) |
577 (*FIXME: the Intersection duals are missing!*) |
580 |
578 |
581 |
579 |
582 (*** Results about limits ***) |
580 (*** Results about limits ***) |
583 |
581 |
584 val prems = goal Ordinal.thy "[| !!i. i:A ==> Ord(i) |] ==> Ord(Union(A))"; |
582 val prems = Goal "[| !!i. i:A ==> Ord(i) |] ==> Ord(Union(A))"; |
585 by (rtac (Ord_is_Transset RS Transset_Union_family RS OrdI) 1); |
583 by (rtac (Ord_is_Transset RS Transset_Union_family RS OrdI) 1); |
586 by (REPEAT (etac UnionE 1 ORELSE ares_tac ([Ord_contains_Transset]@prems) 1)); |
584 by (REPEAT (etac UnionE 1 ORELSE ares_tac ([Ord_contains_Transset]@prems) 1)); |
587 qed "Ord_Union"; |
585 qed "Ord_Union"; |
588 |
586 |
589 val prems = goal Ordinal.thy |
587 val prems = Goal |
590 "[| !!x. x:A ==> Ord(B(x)) |] ==> Ord(UN x:A. B(x))"; |
588 "[| !!x. x:A ==> Ord(B(x)) |] ==> Ord(UN x:A. B(x))"; |
591 by (rtac Ord_Union 1); |
589 by (rtac Ord_Union 1); |
592 by (etac RepFunE 1); |
590 by (etac RepFunE 1); |
593 by (etac ssubst 1); |
591 by (etac ssubst 1); |
594 by (eresolve_tac prems 1); |
592 by (eresolve_tac prems 1); |
595 qed "Ord_UN"; |
593 qed "Ord_UN"; |
596 |
594 |
597 (* No < version; consider (UN i:nat.i)=nat *) |
595 (* No < version; consider (UN i:nat.i)=nat *) |
598 val [ordi,limit] = goal Ordinal.thy |
596 val [ordi,limit] = Goal |
599 "[| Ord(i); !!x. x:A ==> b(x) le i |] ==> (UN x:A. b(x)) le i"; |
597 "[| Ord(i); !!x. x:A ==> b(x) le i |] ==> (UN x:A. b(x)) le i"; |
600 by (rtac (le_imp_subset RS UN_least RS subset_imp_le) 1); |
598 by (rtac (le_imp_subset RS UN_least RS subset_imp_le) 1); |
601 by (REPEAT (ares_tac [ordi, Ord_UN, limit] 1 ORELSE etac (limit RS ltE) 1)); |
599 by (REPEAT (ares_tac [ordi, Ord_UN, limit] 1 ORELSE etac (limit RS ltE) 1)); |
602 qed "UN_least_le"; |
600 qed "UN_least_le"; |
603 |
601 |
604 val [jlti,limit] = goal Ordinal.thy |
602 val [jlti,limit] = Goal |
605 "[| j<i; !!x. x:A ==> b(x)<j |] ==> (UN x:A. succ(b(x))) < i"; |
603 "[| j<i; !!x. x:A ==> b(x)<j |] ==> (UN x:A. succ(b(x))) < i"; |
606 by (rtac (jlti RS ltE) 1); |
604 by (rtac (jlti RS ltE) 1); |
607 by (rtac (UN_least_le RS lt_trans2) 1); |
605 by (rtac (UN_least_le RS lt_trans2) 1); |
608 by (REPEAT (ares_tac [jlti, succ_leI, limit] 1)); |
606 by (REPEAT (ares_tac [jlti, succ_leI, limit] 1)); |
609 qed "UN_succ_least_lt"; |
607 qed "UN_succ_least_lt"; |
610 |
608 |
611 val prems = goal Ordinal.thy |
609 val prems = Goal |
612 "[| a: A; i le b(a); !!x. x:A ==> Ord(b(x)) |] ==> i le (UN x:A. b(x))"; |
610 "[| a: A; i le b(a); !!x. x:A ==> Ord(b(x)) |] ==> i le (UN x:A. b(x))"; |
613 by (resolve_tac (prems RL [ltE]) 1); |
611 by (resolve_tac (prems RL [ltE]) 1); |
614 by (rtac (le_imp_subset RS subset_trans RS subset_imp_le) 1); |
612 by (rtac (le_imp_subset RS subset_trans RS subset_imp_le) 1); |
615 by (REPEAT (ares_tac (prems @ [UN_upper, Ord_UN]) 1)); |
613 by (REPEAT (ares_tac (prems @ [UN_upper, Ord_UN]) 1)); |
616 qed "UN_upper_le"; |
614 qed "UN_upper_le"; |
617 |
615 |
618 val [leprem] = goal Ordinal.thy |
616 val [leprem] = Goal |
619 "[| !!x. x:A ==> c(x) le d(x) |] ==> (UN x:A. c(x)) le (UN x:A. d(x))"; |
617 "[| !!x. x:A ==> c(x) le d(x) |] ==> (UN x:A. c(x)) le (UN x:A. d(x))"; |
620 by (rtac UN_least_le 1); |
618 by (rtac UN_least_le 1); |
621 by (rtac UN_upper_le 2); |
619 by (rtac UN_upper_le 2); |
622 by (REPEAT (ares_tac [leprem] 2)); |
620 by (REPEAT (ares_tac [leprem] 2)); |
623 by (rtac Ord_UN 1); |
621 by (rtac Ord_UN 1); |
677 Goal "Ord(i) ==> i=0 | (EX j. Ord(j) & i=succ(j)) | Limit(i)"; |
675 Goal "Ord(i) ==> i=0 | (EX j. Ord(j) & i=succ(j)) | Limit(i)"; |
678 by (blast_tac (claset() addSIs [non_succ_LimitI, Ord_0_lt] |
676 by (blast_tac (claset() addSIs [non_succ_LimitI, Ord_0_lt] |
679 addSDs [Ord_succD]) 1); |
677 addSDs [Ord_succD]) 1); |
680 qed "Ord_cases_disj"; |
678 qed "Ord_cases_disj"; |
681 |
679 |
682 val major::prems = goal Ordinal.thy |
680 val major::prems = Goal |
683 "[| Ord(i); \ |
681 "[| Ord(i); \ |
684 \ i=0 ==> P; \ |
682 \ i=0 ==> P; \ |
685 \ !!j. [| Ord(j); i=succ(j) |] ==> P; \ |
683 \ !!j. [| Ord(j); i=succ(j) |] ==> P; \ |
686 \ Limit(i) ==> P \ |
684 \ Limit(i) ==> P \ |
687 \ |] ==> P"; |
685 \ |] ==> P"; |
688 by (cut_facts_tac [major RS Ord_cases_disj] 1); |
686 by (cut_facts_tac [major RS Ord_cases_disj] 1); |
689 by (REPEAT (eresolve_tac (prems@[asm_rl, disjE, exE, conjE]) 1)); |
687 by (REPEAT (eresolve_tac (prems@[asm_rl, disjE, exE, conjE]) 1)); |
690 qed "Ord_cases"; |
688 qed "Ord_cases"; |
691 |
689 |
692 val major::prems = goal Ordinal.thy |
690 val major::prems = Goal |
693 "[| Ord(i); \ |
691 "[| Ord(i); \ |
694 \ P(0); \ |
692 \ P(0); \ |
695 \ !!x. [| Ord(x); P(x) |] ==> P(succ(x)); \ |
693 \ !!x. [| Ord(x); P(x) |] ==> P(succ(x)); \ |
696 \ !!x. [| Limit(x); ALL y:x. P(y) |] ==> P(x) \ |
694 \ !!x. [| Limit(x); ALL y:x. P(y) |] ==> P(x) \ |
697 \ |] ==> P(i)"; |
695 \ |] ==> P(i)"; |