# HG changeset patch # User paulson # Date 1666105141 -3600 # Node ID 332b76850f0e5a2f0cee381aecd892378f16d46b # Parent e5162a8baa2458d3e70d0b994491746bfb19fba6 Slight tidying of legacy proofs diff -r e5162a8baa24 -r 332b76850f0e src/ZF/ZF_Base.thy --- a/src/ZF/ZF_Base.thy Mon Oct 17 16:00:41 2022 +0100 +++ b/src/ZF/ZF_Base.thy Tue Oct 18 15:59:01 2022 +0100 @@ -313,13 +313,13 @@ lemma rev_bspec: "\x: A; \x\A. P(x)\ \ P(x)" by (simp add: Ball_def) -(*Trival rewrite rule; @{term"(\x\A.P)<->P"} holds only if A is nonempty!*) -lemma ball_triv [simp]: "(\x\A. P) <-> ((\x. x\A) \ P)" +(*Trival rewrite rule; @{term"(\x\A.P)\P"} holds only if A is nonempty!*) +lemma ball_triv [simp]: "(\x\A. P) \ ((\x. x\A) \ P)" by (simp add: Ball_def) (*Congruence rule for rewriting*) lemma ball_cong [cong]: - "\A=A'; \x. x\A' \ P(x) <-> P'(x)\ \ (\x\A. P(x)) <-> (\x\A'. P'(x))" + "\A=A'; \x. x\A' \ P(x) \ P'(x)\ \ (\x\A. P(x)) \ (\x\A'. P'(x))" by (simp add: Ball_def) lemma atomize_ball: @@ -346,13 +346,13 @@ lemma bexE [elim!]: "\\x\A. P(x); \x. \x\A; P(x)\ \ Q\ \ Q" by (simp add: Bex_def, blast) -(*We do not even have @{term"(\x\A. True) <-> True"} unless @{term"A" is nonempty\*) -lemma bex_triv [simp]: "(\x\A. P) <-> ((\x. x\A) \ P)" +(*We do not even have @{term"(\x\A. True) \ True"} unless @{term"A" is nonempty\*) +lemma bex_triv [simp]: "(\x\A. P) \ ((\x. x\A) \ P)" by (simp add: Bex_def) lemma bex_cong [cong]: - "\A=A'; \x. x\A' \ P(x) <-> P'(x)\ - \ (\x\A. P(x)) <-> (\x\A'. P'(x))" + "\A=A'; \x. x\A' \ P(x) \ P'(x)\ + \ (\x\A. P(x)) \ (\x\A'. P'(x))" by (simp add: Bex_def cong: conj_cong) @@ -375,27 +375,25 @@ by (simp add: subset_def, blast) (*Sometimes useful with premises in this order*) -lemma rev_subsetD: "\c\A; A<=B\ \ c\B" +lemma rev_subsetD: "\c\A; A\B\ \ c\B" by blast lemma contra_subsetD: "\A \ B; c \ B\ \ c \ A" -by blast + by blast lemma rev_contra_subsetD: "\c \ B; A \ B\ \ c \ A" -by blast + by blast lemma subset_refl [simp]: "A \ A" -by blast + by blast -lemma subset_trans: "\A<=B; B<=C\ \ A<=C" -by blast +lemma subset_trans: "\A\B; B\C\ \ A\C" + by blast -(*Useful for proving A<=B by rewriting in some cases*) +(*Useful for proving A\B by rewriting in some cases*) lemma subset_iff: - "A<=B <-> (\x. x\A \ x\B)" - unfolding subset_def Ball_def -apply (rule iff_refl) -done + "A\B \ (\x. x\A \ x\B)" + by auto text\For calculations\ declare subsetD [trans] rev_subsetD [trans] subset_trans [trans] @@ -405,34 +403,33 @@ (*Anti-symmetry of the subset relation*) lemma equalityI [intro]: "\A \ B; B \ A\ \ A = B" -by (rule extension [THEN iffD2], rule conjI) + by (rule extension [THEN iffD2], rule conjI) -lemma equality_iffI: "(\x. x\A <-> x\B) \ A = B" -by (rule equalityI, blast+) +lemma equality_iffI: "(\x. x\A \ x\B) \ A = B" + by (rule equalityI, blast+) lemmas equalityD1 = extension [THEN iffD1, THEN conjunct1] lemmas equalityD2 = extension [THEN iffD1, THEN conjunct2] -lemma equalityE: "\A = B; \A<=B; B<=A\ \ P\ \ P" -by (blast dest: equalityD1 equalityD2) +lemma equalityE: "\A = B; \A\B; B\A\ \ P\ \ P" + by (blast dest: equalityD1 equalityD2) lemma equalityCE: - "\A = B; \c\A; c\B\ \ P; \c\A; c\B\ \ P\ \ P" -by (erule equalityE, blast) + "\A = B; \c\A; c\B\ \ P; \c\A; c\B\ \ P\ \ P" + by (erule equalityE, blast) lemma equality_iffD: - "A = B \ (\x. x \ A <-> x \ B)" + "A = B \ (\x. x \ A \ x \ B)" by auto subsection\Rules for Replace -- the derived form of replacement\ lemma Replace_iff: - "b \ {y. x\A, P(x,y)} <-> (\x\A. P(x,b) \ (\y. P(x,y) \ y=b))" + "b \ {y. x\A, P(x,y)} \ (\x\A. P(x,b) \ (\y. P(x,y) \ y=b))" unfolding Replace_def -apply (rule replacement [THEN iff_trans], blast+) -done + by (rule replacement [THEN iff_trans], blast+) (*Introduction; there must be a unique y such that P(x,y), namely y=b. *) lemma ReplaceI [intro]: @@ -449,17 +446,16 @@ (*As above but without the (generally useless) 3rd assumption*) lemma ReplaceE2 [elim!]: - "\b \ {y. x\A, P(x,y)}; + "\b \ {y. x\A, P(x,y)}; \x. \x: A; P(x,b)\ \ R -\ \ R" -by (erule ReplaceE, blast) + \ \ R" + by (erule ReplaceE, blast) lemma Replace_cong [cong]: - "\A=B; \x y. x\B \ P(x,y) <-> Q(x,y)\ \ - Replace(A,P) = Replace(B,Q)" -apply (rule equality_iffI) -apply (simp add: Replace_iff) -done + "\A=B; \x y. x\B \ P(x,y) \ Q(x,y)\ \ Replace(A,P) = Replace(B,Q)" + apply (rule equality_iffI) + apply (simp add: Replace_iff) + done subsection\Rules for RepFun\ @@ -469,49 +465,44 @@ (*Useful for coinduction proofs*) lemma RepFun_eqI [intro]: "\b=f(a); a \ A\ \ b \ {f(x). x\A}" -apply (erule ssubst) -apply (erule RepFunI) -done + by (blast intro: RepFunI) lemma RepFunE [elim!]: - "\b \ {f(x). x\A}; + "\b \ {f(x). x\A}; \x.\x\A; b=f(x)\ \ P\ \ P" -by (simp add: RepFun_def Replace_iff, blast) + by (simp add: RepFun_def Replace_iff, blast) lemma RepFun_cong [cong]: - "\A=B; \x. x\B \ f(x)=g(x)\ \ RepFun(A,f) = RepFun(B,g)" -by (simp add: RepFun_def) + "\A=B; \x. x\B \ f(x)=g(x)\ \ RepFun(A,f) = RepFun(B,g)" + by (simp add: RepFun_def) -lemma RepFun_iff [simp]: "b \ {f(x). x\A} <-> (\x\A. b=f(x))" -by (unfold Bex_def, blast) +lemma RepFun_iff [simp]: "b \ {f(x). x\A} \ (\x\A. b=f(x))" + by (unfold Bex_def, blast) lemma triv_RepFun [simp]: "{x. x\A} = A" -by blast + by blast subsection\Rules for Collect -- forming a subset by separation\ (*Separation is derivable from Replacement*) -lemma separation [simp]: "a \ {x\A. P(x)} <-> a\A \ P(a)" -by (unfold Collect_def, blast) +lemma separation [simp]: "a \ {x\A. P(x)} \ a\A \ P(a)" + by (auto simp: Collect_def) lemma CollectI [intro!]: "\a\A; P(a)\ \ a \ {x\A. P(x)}" -by simp + by simp lemma CollectE [elim!]: "\a \ {x\A. P(x)}; \a\A; P(a)\ \ R\ \ R" -by simp + by simp -lemma CollectD1: "a \ {x\A. P(x)} \ a\A" -by (erule CollectE, assumption) - -lemma CollectD2: "a \ {x\A. P(x)} \ P(a)" -by (erule CollectE, assumption) +lemma CollectD1: "a \ {x\A. P(x)} \ a\A" and CollectD2: "a \ {x\A. P(x)} \ P(a)" + by auto lemma Collect_cong [cong]: - "\A=B; \x. x\B \ P(x) <-> Q(x)\ + "\A=B; \x. x\B \ P(x) \ Q(x)\ \ Collect(A, \x. P(x)) = Collect(B, \x. Q(x))" -by (simp add: Collect_def) + by (simp add: Collect_def) subsection\Rules for Unions\ @@ -520,30 +511,30 @@ (*The order of the premises presupposes that C is rigid; A may be flexible*) lemma UnionI [intro]: "\B: C; A: B\ \ A: \(C)" -by (simp, blast) + by auto lemma UnionE [elim!]: "\A \ \(C); \B.\A: B; B: C\ \ R\ \ R" -by (simp, blast) + by auto subsection\Rules for Unions of families\ (* @{term"\x\A. B(x)"} abbreviates @{term"\({B(x). x\A})"} *) -lemma UN_iff [simp]: "b \ (\x\A. B(x)) <-> (\x\A. b \ B(x))" -by (simp add: Bex_def, blast) +lemma UN_iff [simp]: "b \ (\x\A. B(x)) \ (\x\A. b \ B(x))" + by blast (*The order of the premises presupposes that A is rigid; b may be flexible*) lemma UN_I: "\a: A; b: B(a)\ \ b: (\x\A. B(x))" -by (simp, blast) + by force lemma UN_E [elim!]: - "\b \ (\x\A. B(x)); \x.\x: A; b: B(x)\ \ R\ \ R" -by blast + "\b \ (\x\A. B(x)); \x.\x: A; b: B(x)\ \ R\ \ R" + by blast lemma UN_cong: - "\A=B; \x. x\B \ C(x)=D(x)\ \ (\x\A. C(x)) = (\x\B. D(x))" -by simp + "\A=B; \x. x\B \ C(x)=D(x)\ \ (\x\A. C(x)) = (\x\B. D(x))" + by simp (*No "Addcongs [UN_cong]" because @{term\} is a combination of constants*) @@ -558,69 +549,67 @@ (*The set @{term"{x\0. False}"} is empty; by foundation it equals 0 See Suppes, page 21.*) lemma not_mem_empty [simp]: "a \ 0" -apply (cut_tac foundation) -apply (best dest: equalityD2) -done + using foundation by (best dest: equalityD2) lemmas emptyE [elim!] = not_mem_empty [THEN notE] lemma empty_subsetI [simp]: "0 \ A" -by blast + by blast lemma equals0I: "\\y. y\A \ False\ \ A=0" -by blast + by blast lemma equals0D [dest]: "A=0 \ a \ A" -by blast + by blast declare sym [THEN equals0D, dest] lemma not_emptyI: "a\A \ A \ 0" -by blast + by blast lemma not_emptyE: "\A \ 0; \x. x\A \ R\ \ R" -by blast + by blast subsection\Rules for Inter\ (*Not obviously useful for proving InterI, InterD, InterE*) -lemma Inter_iff: "A \ \(C) <-> (\x\C. A: x) \ C\0" -by (simp add: Inter_def Ball_def, blast) +lemma Inter_iff: "A \ \(C) \ (\x\C. A: x) \ C\0" + by (force simp: Inter_def) (* Intersection is well-behaved only if the family is non-empty! *) lemma InterI [intro!]: - "\\x. x: C \ A: x; C\0\ \ A \ \(C)" -by (simp add: Inter_iff) + "\\x. x: C \ A: x; C\0\ \ A \ \(C)" + by (simp add: Inter_iff) (*A "destruct" rule -- every B in C contains A as an element, but A\B can hold when B\C does not! This rule is analogous to "spec". *) lemma InterD [elim, Pure.elim]: "\A \ \(C); B \ C\ \ A \ B" -by (unfold Inter_def, blast) + by (force simp: Inter_def) (*"Classical" elimination rule -- does not require exhibiting @{term"B\C"} *) lemma InterE [elim]: - "\A \ \(C); B\C \ R; A\B \ R\ \ R" -by (simp add: Inter_def, blast) + "\A \ \(C); B\C \ R; A\B \ R\ \ R" + by (auto simp: Inter_def) subsection\Rules for Intersections of families\ (* @{term"\x\A. B(x)"} abbreviates @{term"\({B(x). x\A})"} *) -lemma INT_iff: "b \ (\x\A. B(x)) <-> (\x\A. b \ B(x)) \ A\0" -by (force simp add: Inter_def) +lemma INT_iff: "b \ (\x\A. B(x)) \ (\x\A. b \ B(x)) \ A\0" + by (force simp add: Inter_def) lemma INT_I: "\\x. x: A \ b: B(x); A\0\ \ b: (\x\A. B(x))" -by blast + by blast lemma INT_E: "\b \ (\x\A. B(x)); a: A\ \ b \ B(a)" -by blast + by blast lemma INT_cong: - "\A=B; \x. x\B \ C(x)=D(x)\ \ (\x\A. C(x)) = (\x\B. D(x))" -by simp + "\A=B; \x. x\B \ C(x)=D(x)\ \ (\x\A. C(x)) = (\x\B. D(x))" + by simp (*No "Addcongs [INT_cong]" because @{term\} is a combination of constants*) @@ -628,10 +617,10 @@ subsection\Rules for Powersets\ lemma PowI: "A \ B \ A \ Pow(B)" -by (erule Pow_iff [THEN iffD2]) + by (erule Pow_iff [THEN iffD2]) -lemma PowD: "A \ Pow(B) \ A<=B" -by (erule Pow_iff [THEN iffD1]) +lemma PowD: "A \ Pow(B) \ A\B" + by (erule Pow_iff [THEN iffD1]) declare Pow_iff [iff] @@ -645,6 +634,6 @@ make it diverge. Variable b represents ANY map, such as (lam x\A.b(x)): A->Pow(A). *) lemma cantor: "\S \ Pow(A). \x\A. b(x) \ S" -by (best elim!: equalityCE del: ReplaceI RepFun_eqI) + by (best elim!: equalityCE del: ReplaceI RepFun_eqI) end