# HG changeset patch # User paulson # Date 1010073719 -3600 # Node ID 4e6626725e21f74acffc909126b78975e0e71166 # Parent ddfe8083fef2a9606979fff8198288ab0768a170 Some new theorems for ordinals diff -r ddfe8083fef2 -r 4e6626725e21 src/ZF/Main.thy --- a/src/ZF/Main.thy Wed Jan 02 21:54:45 2002 +0100 +++ b/src/ZF/Main.thy Thu Jan 03 17:01:59 2002 +0100 @@ -46,4 +46,14 @@ lemmas posDivAlg_induct = posDivAlg_induct [consumes 2] and negDivAlg_induct = negDivAlg_induct [consumes 2] + +(* belongs to theory Epsilon *) + +lemma def_transrec2: + "(!!x. f(x)==transrec2(x,a,b)) + ==> f(0) = a & + f(succ(i)) = b(i, f(i)) & + (Limit(K) --> f(K) = (UN j o] => o + oall :: "[i, i => o] => o" + "oall(A, P) == ALL x. x P(x)" + + oex :: "[i, i => o] => o" + "oex(A, P) == EX x. x i] => i + OUnion :: "[i, i => i] => i" + "OUnion(i,B) == {z: UN x:i. B(x). Ord(i)}" syntax - "@oall" :: [idt, i, o] => o ("(3ALL _<_./ _)" 10) - "@oex" :: [idt, i, o] => o ("(3EX _<_./ _)" 10) - "@OUNION" :: [idt, i, i] => i ("(3UN _<_./ _)" 10) + "@oall" :: "[idt, i, o] => o" ("(3ALL _<_./ _)" 10) + "@oex" :: "[idt, i, o] => o" ("(3EX _<_./ _)" 10) + "@OUNION" :: "[idt, i, i] => i" ("(3UN _<_./ _)" 10) translations "ALL x o ("(3\\_<_./ _)" 10) - "@oex" :: [idt, i, o] => o ("(3\\_<_./ _)" 10) - "@OUNION" :: [idt, i, i] => i ("(3\\_<_./ _)" 10) + "@oall" :: "[idt, i, o] => o" ("(3\_<_./ _)" 10) + "@oex" :: "[idt, i, o] => o" ("(3\_<_./ _)" 10) + "@OUNION" :: "[idt, i, i] => i" ("(3\_<_./ _)" 10) + + +declare Ord_Un [intro,simp] +declare Ord_UN [intro,simp] +declare Ord_Union [intro,simp] + +(** These mostly belong to theory Ordinal **) + +lemma Union_upper_le: + "\j: J; i\j; Ord(\(J))\ \ i \ \J" +apply (subst Union_eq_UN) +apply (rule UN_upper_le) +apply auto +done + +lemma increasing_LimitI: "\0x\l. \y\l. x \ Limit(l)" +apply (simp add: Limit_def lt_Ord2) +apply clarify +apply (drule_tac i=y in ltD) +apply (blast intro: lt_trans1 succ_leI ltI lt_Ord2) +done + +lemma UN_upper_lt: + "\a\ A; i < b(a); Ord(\x\A. b(x))\ \ i < (\x\A. b(x))" +by (unfold lt_def, blast) + +lemma lt_imp_0_lt: "j 0i\I. Ord(i) \ I=0 \ \(I) \ I \ (\(I) \ I \ Limit(\(I)))" +apply (clarify elim!: not_emptyE) +apply (cases "\(I)" rule: Ord_cases) + apply (blast intro: Ord_Union) + apply (blast intro: subst_elem) + apply auto +apply (clarify elim!: equalityE succ_subsetE) +apply (simp add: Union_subset_iff) +apply (subgoal_tac "B = succ(j)", blast ) +apply (rule le_anti_sym) + apply (simp add: le_subset_iff) +apply (simp add: ltI) +done + +lemma Ord_Union_eq_succD: "[|\x\X. Ord(x); \X = succ(j)|] ==> succ(j) \ X" +by (drule Ord_set_cases, auto) + +(*See also Transset_iff_Union_succ*) +lemma Ord_Union_succ_eq: "Ord(i) \ \(succ(i)) = i" +by (blast intro: Ord_trans) -defs - - (* Ordinal Quantifiers *) - oall_def "oall(A, P) == ALL x. x P(x)" - oex_def "oex(A, P) == EX x. xi\A. Ord(i) \ (j < \(A)) <-> (\i\A. j k < i Un j" +by (simp add: lt_def) + +lemma Un_upper2_lt: "[|k < j; Ord(i)|] ==> k < i Un j" +by (simp add: lt_def) + +lemma Ord_OUN [intro,simp]: + "\!!x. x Ord(B(x))\ \ Ord(\xax \ i < (\xab(a); Ord(\x \ i \ (\x (UN x B(x) \ C) ==> (UN x C" +by (simp add: OUnion_def UN_least ltI) + +(* No < version; consider (UN i:nat.i)=nat *) +lemma OUN_least_le: + "[| Ord(i); !!x. x b(x) \ i |] ==> (UN x i" +by (simp add: OUnion_def UN_least_le ltI Ord_0_le) + +lemma le_implies_OUN_le_OUN: + "[| !!x. x c(x) \ d(x) |] ==> (UN x (UN x Ord(B(x))) + ==> (UN z < (UN x:A. B(x)). C(z)) = (UN x:A. UN z < B(x). C(z))" +by (simp add: OUnion_def) + +lemma OUN_Union_eq: + "(!!x. x:X ==> Ord(x)) + ==> (UN z < Union(X). C(z)) = (UN x:X. UN z < x. C(z))" +by (simp add: OUnion_def) + end