bookshelf/Bookshelf/Enderton/Set/Chapter_2.lean

653 lines
19 KiB
Plaintext
Raw Normal View History

import Mathlib.Data.Set.Basic
import Mathlib.Data.Set.Lattice
import Bookshelf.Enderton.Set.Chapter_1
import Common.Logic.Basic
import Common.Set.Basic
/-! # Enderton.Chapter_2
Axioms and Operations
-/
namespace Enderton.Set.Chapter_2
/-- ### Exercise 3.1
Assume that `A` is the set of integers divisible by `4`. Similarly assume that
`B` and `C` are the sets of integers divisible by `9` and `10`, respectively.
What is in `A ∩ B ∩ C`?
-/
theorem exercise_3_1 {A B C : Set }
(hA : A = { x | Dvd.dvd 4 x })
(hB : B = { x | Dvd.dvd 9 x })
(hC : C = { x | Dvd.dvd 10 x })
: ∀ x ∈ (A ∩ B ∩ C), (4 x) ∧ (9 x) ∧ (10 x) := by
intro x h
rw [Set.mem_inter_iff] at h
have ⟨⟨ha, hb⟩, hc⟩ := h
refine ⟨?_, ⟨?_, ?_⟩⟩
· rw [hA] at ha
exact Set.mem_setOf.mp ha
· rw [hB] at hb
exact Set.mem_setOf.mp hb
· rw [hC] at hc
exact Set.mem_setOf.mp hc
/-- ### Exercise 3.2
Give an example of sets `A` and `B` for which ` A = B` but `A ≠ B`.
-/
theorem exercise_3_2 {A B : Set (Set )}
(hA : A = {{1}, {2}}) (hB : B = {{1, 2}})
: Set.sUnion A = Set.sUnion B ∧ A ≠ B := by
apply And.intro
· show ⋃₀ A = ⋃₀ B
ext x
show (∃ t, t ∈ A ∧ x ∈ t) ↔ ∃ t, t ∈ B ∧ x ∈ t
apply Iff.intro
· intro ⟨t, ⟨ht, hx⟩⟩
rw [hA] at ht
refine ⟨{1, 2}, ⟨by rw [hB]; simp, ?_⟩⟩
apply Or.elim ht <;>
· intro ht'
rw [ht'] at hx
rw [hx]
simp
· intro ⟨t, ⟨ht, hx⟩⟩
rw [hB] at ht
rw [ht] at hx
apply Or.elim hx
· intro hx'
exact ⟨{1}, ⟨by rw [hA]; simp, by rw [hx']; simp⟩⟩
· intro hx'
exact ⟨{2}, ⟨by rw [hA]; simp, by rw [hx']; simp⟩⟩
· show A ≠ B
-- Find an element that exists in `B` but not in `A`. Extensionality
-- concludes the proof.
intro h
rw [hA, hB, Set.ext_iff] at h
have h₁ := h {1, 2}
simp at h₁
rw [Set.ext_iff] at h₁
have h₂ := h₁ 2
simp at h₂
/-- ### Exercise 3.3
Show that every member of a set `A` is a subset of `U A`. (This was stated as an
example in this section.)
-/
theorem exercise_3_3 {A : Set (Set α)}
: ∀ x ∈ A, x ⊆ Set.sUnion A := by
intro x hx
show ∀ y ∈ x, y ∈ { a | ∃ t, t ∈ A ∧ a ∈ t }
intro y hy
rw [Set.mem_setOf_eq]
exact ⟨x, ⟨hx, hy⟩⟩
/-- ### Exercise 3.4
Show that if `A ⊆ B`, then ` A ⊆ B`.
-/
2023-06-10 18:09:24 +00:00
theorem exercise_3_4 {A B : Set (Set α)} (h : A ⊆ B) : ⋃₀ A ⊆ ⋃₀ B := by
show ∀ x ∈ { a | ∃ t, t ∈ A ∧ a ∈ t }, x ∈ { a | ∃ t, t ∈ B ∧ a ∈ t }
intro x hx
rw [Set.mem_setOf_eq] at hx
have ⟨t, ⟨ht, hxt⟩⟩ := hx
rw [Set.mem_setOf_eq]
exact ⟨t, ⟨h ht, hxt⟩⟩
/-- ### Exercise 3.5
Assume that every member of `𝓐` is a subset of `B`. Show that ` 𝓐 ⊆ B`.
-/
2023-06-10 18:09:24 +00:00
theorem exercise_3_5 {𝓐 : Set (Set α)} (h : ∀ x ∈ 𝓐, x ⊆ B)
: ⋃₀ 𝓐 ⊆ B := by
show ∀ y ∈ { a | ∃ t, t ∈ 𝓐 ∧ a ∈ t }, y ∈ B
intro y hy
rw [Set.mem_setOf_eq] at hy
have ⟨t, ⟨ht𝓐, hyt⟩⟩ := hy
exact (h t ht𝓐) hyt
/-- ### Exercise 3.6a
Show that for any set `A`, ` 𝓟 A = A`.
-/
2023-06-04 23:34:42 +00:00
theorem exercise_3_6a : ⋃₀ (𝒫 A) = A := by
show { a | ∃ t, t ∈ { t | t ⊆ A } ∧ a ∈ t } = A
ext x
apply Iff.intro
· intro hx
rw [Set.mem_setOf_eq] at hx
have ⟨t, ⟨htl, htr⟩⟩ := hx
rw [Set.mem_setOf_eq] at htl
exact htl htr
· intro hx
rw [Set.mem_setOf_eq]
exact ⟨A, ⟨by rw [Set.mem_setOf_eq], hx⟩⟩
/-- ### Exercise 3.6b
Show that `A ⊆ 𝓟 A`. Under what conditions does equality hold?
-/
theorem exercise_3_6b
2023-06-04 23:34:42 +00:00
: A ⊆ 𝒫 (⋃₀ A)
∧ (A = 𝒫 (⋃₀ A) ↔ ∃ B, A = 𝒫 B) := by
apply And.intro
2023-06-04 23:34:42 +00:00
· show ∀ x ∈ A, x ∈ { t | t ⊆ ⋃₀ A }
intro x hx
rw [Set.mem_setOf]
exact exercise_3_3 x hx
· apply Iff.intro
· intro hA
exact ⟨⋃₀ A, hA⟩
· intro ⟨B, hB⟩
conv => rhs; rw [hB, exercise_3_6a]
exact hB
/-- ### Exercise 3.7a
Show that for any sets `A` and `B`, `𝓟 A ∩ 𝓟 B = 𝓟 (A ∩ B)`.
-/
theorem exercise_3_7A
2023-06-04 23:34:42 +00:00
: 𝒫 A ∩ 𝒫 B = 𝒫 (A ∩ B) := by
suffices 𝒫 A ∩ 𝒫 B ⊆ 𝒫 (A ∩ B) ∧ 𝒫 (A ∩ B) ⊆ 𝒫 A ∩ 𝒫 B from
subset_antisymm this.left this.right
apply And.intro
· unfold Set.powerset
intro x hx
simp only [Set.mem_inter_iff, Set.mem_setOf_eq] at hx
rwa [Set.mem_setOf, Set.subset_inter_iff]
· unfold Set.powerset
simp
intro x hA _
exact hA
-- theorem false_of_false_iff_true : (false ↔ true) → false := by simp
/-- ### Exercise 3.7b (i)
Show that `𝓟 A 𝓟 B ⊆ 𝓟 (A B)`.
-/
theorem exercise_3_7b_i
2023-06-04 23:34:42 +00:00
: 𝒫 A 𝒫 B ⊆ 𝒫 (A B) := by
unfold Set.powerset
intro x hx
simp at hx
apply Or.elim hx
· intro hA
rw [Set.mem_setOf_eq]
exact Set.subset_union_of_subset_left hA B
· intro hB
rw [Set.mem_setOf_eq]
exact Set.subset_union_of_subset_right hB A
/-- ### Exercise 3.7b (ii)
Under what conditions does `𝓟 A 𝓟 B = 𝓟 (A B)`.?
-/
theorem exercise_3_7b_ii
2023-06-04 23:34:42 +00:00
: 𝒫 A 𝒫 B = 𝒫 (A B) ↔ A ⊆ B B ⊆ A := by
unfold Set.powerset
apply Iff.intro
· intro h
by_contra nh
rw [not_or_de_morgan] at nh
have ⟨a, hA⟩ := Set.not_subset.mp nh.left
have ⟨b, hB⟩ := Set.not_subset.mp nh.right
rw [Set.ext_iff] at h
have hz := h {a, b}
-- `hz` states that `{a, b} ⊆ A {a, b} ⊆ B ↔ {a, b} ⊆ A B`. We show the
-- left-hand side is false but the right-hand side is true, yielding our
-- contradiction.
suffices ¬({a, b} ⊆ A {a, b} ⊆ B) by
have hz₁ : a ∈ A B := by
rw [Set.mem_union]
exact Or.inl hA.left
have hz₂ : b ∈ A B := by
rw [Set.mem_union]
exact Or.inr hB.left
exact absurd (hz.mpr $ Set.mem_mem_imp_pair_subset hz₁ hz₂) this
intro hAB
exact Or.elim hAB
(fun y => absurd (y $ show b ∈ {a, b} by simp) hB.right)
(fun y => absurd (y $ show a ∈ {a, b} by simp) hA.right)
· intro h
ext x
apply Or.elim h
· intro hA
apply Iff.intro
· intro hx
exact Or.elim hx
(Set.subset_union_of_subset_left · B)
(Set.subset_union_of_subset_right · A)
· intro hx
refine Or.inr (Set.Subset.trans hx ?_)
exact subset_of_eq (Set.left_subset_union_eq_self hA)
· intro hB
apply Iff.intro
· intro hx
exact Or.elim hx
(Set.subset_union_of_subset_left · B)
(Set.subset_union_of_subset_right · A)
· intro hx
refine Or.inl (Set.Subset.trans hx ?_)
exact subset_of_eq (Set.right_subset_union_eq_self hB)
/-- ### Exercise 3.9
Give an example of sets `a` and `B` for which `a ∈ B` but `𝓟 a ∉ 𝓟 B`.
-/
theorem exercise_3_9 (ha : a = {1}) (hB : B = {{1}})
2023-06-04 23:34:42 +00:00
: a ∈ B ∧ 𝒫 a ∉ 𝒫 B := by
apply And.intro
· rw [ha, hB]
simp
· intro h
2023-06-04 23:34:42 +00:00
have h₁ : 𝒫 a = {∅, {1}} := by
rw [ha]
exact Set.powerset_singleton 1
2023-06-04 23:34:42 +00:00
have h₂ : 𝒫 B = {∅, {{1}}} := by
rw [hB]
exact Set.powerset_singleton {1}
rw [h₁, h₂] at h
simp at h
apply Or.elim h
· intro h
rw [Set.ext_iff] at h
have := h ∅
simp at this
· intro h
rw [Set.ext_iff] at h
have := h 1
simp at this
/-- ### Exercise 3.10
Show that if `a ∈ B`, then `𝓟 a ∈ 𝓟 𝓟 B`.
-/
2023-06-10 18:09:24 +00:00
theorem exercise_3_10 {B : Set (Set α)} (ha : a ∈ B)
2023-06-04 23:34:42 +00:00
: 𝒫 a ∈ 𝒫 (𝒫 (⋃₀ B)) := by
have h₁ := exercise_3_3 a ha
have h₂ := Chapter_1.exercise_1_3 h₁
generalize hb : 𝒫 (⋃₀ B) = b
conv => rhs; unfold Set.powerset
rw [← hb, Set.mem_setOf_eq]
exact h₂
/-- ### Exercise 4.11 (i)
Show that for any sets `A` and `B`, `A = (A ∩ B) (A - B)`.
-/
theorem exercise_4_11_i {A B : Set α}
: A = (A ∩ B) (A \ B) := by
2023-06-04 23:34:42 +00:00
show A = fun a => A a ∧ B a A a ∧ ¬B a
suffices ∀ x, (A x ∧ (B x ¬B x)) = A x by
conv => rhs; ext x; rw [← and_or_left, this]
intro x
refine propext ?_
apply Iff.intro
· intro hx
exact hx.left
· intro hx
exact ⟨hx, em (B x)⟩
/-- ### Exercise 4.11 (ii)
Show that for any sets `A` and `B`, `A (B - A) = A B`.
-/
theorem exercise_4_11_ii {A B : Set α}
: A (B \ A) = A B := by
2023-06-04 23:34:42 +00:00
show (fun a => A a B a ∧ ¬A a) = fun a => A a B a
suffices ∀ x, ((A x B x) ∧ (A x ¬A x)) = (A x B x) by
conv => lhs; ext x; rw [or_and_left, this x]
intro x
refine propext ?_
apply Iff.intro
· intro hx
exact hx.left
· intro hx
exact ⟨hx, em (A x)⟩
section
variable {A B C : Set }
variable {hA : A = {1, 2, 3}}
variable {hB : B = {2, 3, 4}}
variable {hC : C = {3, 4, 5}}
lemma right_diff_eq_insert_one_three : A \ (B \ C) = {1, 3} := by
rw [hA, hB, hC]
ext x
apply Iff.intro
· intro hx
unfold SDiff.sdiff Set.instSDiffSet Set.diff at hx
unfold Membership.mem Set.instMembershipSet Set.Mem setOf at hx
unfold insert Set.instInsertSet Set.insert setOf at hx
have ⟨ha, hb⟩ := hx
rw [not_and_de_morgan, not_or_de_morgan] at hb
simp only [Set.mem_singleton_iff, not_not] at hb
refine Or.elim ha Or.inl ?_
intro hy
apply Or.elim hb
· intro hz
exact Or.elim hy (absurd · hz.left) Or.inr
· intro hz
refine Or.elim hz Or.inr ?_
intro hz₁
apply Or.elim hy <;> apply Or.elim hz₁ <;>
· intro hz₂ hz₃
rw [hz₂] at hz₃
simp at hz₃
· intro hx
unfold SDiff.sdiff Set.instSDiffSet Set.diff
unfold Membership.mem Set.instMembershipSet Set.Mem setOf
unfold insert Set.instInsertSet Set.insert setOf
apply Or.elim hx
· intro hy
refine ⟨Or.inl hy, ?_⟩
intro hz
rw [hy] at hz
unfold Membership.mem Set.instMembershipSet Set.Mem at hz
unfold singleton Set.instSingletonSet Set.singleton setOf at hz
simp only at hz
· intro hy
refine ⟨Or.inr (Or.inr hy), ?_⟩
intro hz
have hzr := hz.right
rw [not_or_de_morgan] at hzr
exact absurd hy hzr.left
lemma left_diff_eq_singleton_one : (A \ B) \ C = {1} := by
rw [hA, hB, hC]
ext x
apply Iff.intro
· intro hx
unfold SDiff.sdiff Set.instSDiffSet Set.diff at hx
unfold Membership.mem Set.instMembershipSet Set.Mem setOf at hx
unfold insert Set.instInsertSet Set.insert setOf at hx
have ⟨⟨ha, hb⟩, hc⟩ := hx
rw [not_or_de_morgan] at hb hc
apply Or.elim ha
· simp
· intro hy
apply Or.elim hy
· intro hz
exact absurd hz hb.left
· intro hz
exact absurd hz hc.left
· intro hx
refine ⟨⟨Or.inl hx, ?_⟩, ?_⟩ <;>
· intro hy
cases hy with
| inl y => rw [hx] at y; simp at y
| inr hz => cases hz with
| inl y => rw [hx] at y; simp at y
| inr y => rw [hx] at y; simp at y
/-- ### Exercise 4.14
Show by example that for some sets `A`, `B`, and `C`, the set `A - (B - C)` is
different from `(A - B) - C`.
-/
theorem exercise_4_14 : A \ (B \ C) ≠ (A \ B) \ C := by
rw [
@right_diff_eq_insert_one_three A B C hA hB hC,
@left_diff_eq_singleton_one A B C hA hB hC
]
intro h
rw [Set.ext_iff] at h
have := h 3
simp at this
end
2023-06-04 23:34:42 +00:00
/-- ### Exercise 4.16
Simplify:
`[(A B C) ∩ (A B)] - [(A (B - C)) ∩ A]`
-/
theorem exercise_4_16 {A B C : Set α}
: ((A B C) ∩ (A B)) \ ((A (B \ C)) ∩ A) = B \ A := by
calc ((A B C) ∩ (A B)) \ ((A (B \ C)) ∩ A)
_ = (A B) \ ((A (B \ C)) ∩ A) := by rw [Set.union_inter_cancel_left]
_ = (A B) \ A := by rw [Set.union_inter_cancel_left]
_ = B \ A := by rw [Set.union_diff_left]
/-! ### Exercise 4.17
Show that the following four conditions are equivalent.
(a) `A ⊆ B`
(b) `A - B = ∅`
(c) `A B = B`
(d) `A ∩ B = A`
-/
theorem exercise_4_17_i {A B : Set α} (h : A ⊆ B)
: A \ B = ∅ := by
ext x
apply Iff.intro
· intro hx
exact absurd (h hx.left) hx.right
· intro hx
exact False.elim hx
theorem exercise_4_17_ii {A B : Set α} (h : A \ B = ∅)
: A B = B := by
suffices A ⊆ B from Set.left_subset_union_eq_self this
show ∀ t, t ∈ A → t ∈ B
intro t ht
rw [Set.ext_iff] at h
by_contra nt
exact (h t).mp ⟨ht, nt⟩
theorem exercise_4_17_iii {A B : Set α} (h : A B = B)
: A ∩ B = A := by
suffices A ⊆ B from Set.inter_eq_left_iff_subset.mpr this
exact Set.union_eq_right_iff_subset.mp h
theorem exercise_4_17_iv {A B : Set α} (h : A ∩ B = A)
: A ⊆ B := Set.inter_eq_left_iff_subset.mp h
/-- ### Exercise 4.19
Is `𝒫 (A - B)` always equal to `𝒫 A - 𝒫 B`? Is it ever equal to `𝒫 A - 𝒫 B`?
-/
theorem exercise_4_19 {A B : Set α}
: 𝒫 (A \ B) ≠ (𝒫 A) \ (𝒫 B) := by
intro h
have he : ∅ ∈ 𝒫 (A \ B) := by simp
have ne : ∅ ∉ (𝒫 A) \ (𝒫 B) := by simp
rw [Set.ext_iff] at h
have := h ∅
exact absurd (this.mp he) ne
/-- ### Exercise 4.20
Let `A`, `B`, and `C` be sets such that `A B = A C` and `A ∩ B = A ∩ C`.
Show that `B = C`.
-/
theorem exercise_4_20 {A B C : Set α}
(hu : A B = A C) (hi : A ∩ B = A ∩ C) : B = C := by
ext x
apply Iff.intro
· intro hB
by_cases hA : x ∈ A
· have : x ∈ A ∩ B := Set.mem_inter hA hB
rw [hi] at this
exact this.right
· have : x ∈ A B := Set.mem_union_right A hB
rw [hu] at this
exact Or.elim this (absurd · hA) (by simp)
· intro hC
by_cases hA : x ∈ A
· have : x ∈ A ∩ C := Set.mem_inter hA hC
rw [← hi] at this
exact this.right
· have : x ∈ A C := Set.mem_union_right A hC
rw [← hu] at this
exact Or.elim this (absurd · hA) (by simp)
/-- ### Exercise 4.21
Show that ` (A B) = ( A) ( B)`.
-/
theorem exercise_4_21 {A B : Set (Set α)}
: ⋃₀ (A B) = (⋃₀ A) (⋃₀ B) := by
ext x
apply Iff.intro
· intro hx
have ⟨t, ht⟩ : ∃ t, t ∈ A B ∧ x ∈ t := hx
apply Or.elim ht.left
· intro hA
exact Or.inl ⟨t, ⟨hA, ht.right⟩⟩
· intro hB
exact Or.inr ⟨t, ⟨hB, ht.right⟩⟩
· intro hx
apply Or.elim hx
· intro hA
have ⟨t, ht⟩ : ∃ t, t ∈ A ∧ x ∈ t := hA
exact ⟨t, ⟨Set.mem_union_left B ht.left, ht.right⟩⟩
· intro hB
have ⟨t, ht⟩ : ∃ t, t ∈ B ∧ x ∈ t := hB
exact ⟨t, ⟨Set.mem_union_right A ht.left, ht.right⟩⟩
/-- ### Exercise 4.22
Show that if `A` and `B` are nonempty sets, then `⋂ (A B) = ⋂ A ∩ ⋂ B`.
-/
theorem exercise_4_22 {A B : Set (Set α)}
: ⋂₀ (A B) = ⋂₀ A ∩ ⋂₀ B := by
ext x
apply Iff.intro
· intro hx
have : ∀ t : Set α, t ∈ A B → x ∈ t := hx
show (∀ t : Set α, t ∈ A → x ∈ t) ∧ (∀ t : Set α, t ∈ B → x ∈ t)
rw [← forall_and]
intro t
exact ⟨
fun ht => this t (Set.mem_union_left B ht),
fun ht => this t (Set.mem_union_right A ht)
· intro hx
have : ∀ t : Set α, (t ∈ A → x ∈ t) ∧ (t ∈ B → x ∈ t) := by
have : (∀ t : Set α, t ∈ A → x ∈ t) ∧ (∀ t : Set α, t ∈ B → x ∈ t) := hx
rwa [← forall_and] at this
show ∀ (t : Set α), t ∈ A B → x ∈ t
intro t ht
apply Or.elim ht
· intro hA
exact (this t).left hA
· intro hB
exact (this t).right hB
/-- ### Exercise 4.24a
Show that is `𝓐` is nonempty, then `𝒫 (⋂ 𝓐) = ⋂ { 𝒫 X | X ∈ 𝓐 }`.
-/
theorem exercise_4_24a {𝓐 : Set (Set α)}
: 𝒫 (⋂₀ 𝓐) = ⋂₀ { 𝒫 X | X ∈ 𝓐 } := by
calc 𝒫 (⋂₀ 𝓐)
_ = { x | x ⊆ ⋂₀ 𝓐 } := rfl
_ = { x | x ⊆ { y | ∀ X, X ∈ 𝓐 → y ∈ X } } := rfl
_ = { x | ∀ t ∈ x, t ∈ { y | ∀ X, X ∈ 𝓐 → y ∈ X } } := rfl
_ = { x | ∀ t ∈ x, (∀ X, X ∈ 𝓐 → t ∈ X) } := rfl
_ = { x | ∀ X ∈ 𝓐, (∀ t, t ∈ x → t ∈ X) } := by
ext
rw [Set.mem_setOf, Set.mem_setOf, forall_mem_comm (· ∈ ·)]
_ = { x | ∀ X ∈ 𝓐, x ⊆ X} := rfl
_ = { x | ∀ X ∈ 𝓐, x ∈ 𝒫 X } := rfl
_ = { x | ∀ t ∈ { 𝒫 X | X ∈ 𝓐 }, x ∈ t} := by simp
_ = ⋂₀ { 𝒫 X | X ∈ 𝓐 } := rfl
/-- ### Exercise 4.24b
Show that
```
{𝒫 X | X ∈ 𝓐} ⊆ 𝒫 𝓐.
```
Under what conditions does equality hold?
-/
theorem exercise_4_24b {𝓐 : Set (Set α)}
: (⋃₀ { 𝒫 X | X ∈ 𝓐 } ⊆ 𝒫 ⋃₀ 𝓐)
∧ ((⋃₀ { 𝒫 X | X ∈ 𝓐 } = 𝒫 ⋃₀ 𝓐) ↔ (⋃₀ 𝓐𝓐)) := by
have hS : (⋃₀ { 𝒫 X | X ∈ 𝓐 } ⊆ 𝒫 ⋃₀ 𝓐) := by
simp
exact exercise_3_3
refine ⟨hS, ?_⟩
apply Iff.intro
· intro rS
have rS : 𝒫 ⋃₀ 𝓐 ⊆ ⋃₀ { 𝒫 X | X ∈ 𝓐 } :=
(Set.Subset.antisymm_iff.mp rS).right
have hA : ⋃₀ 𝓐 ∈ ⋃₀ { 𝒫 X | X ∈ 𝓐 } :=
rS Set.self_mem_powerset_self
conv at hA =>
rhs
unfold Set.sUnion sSup Set.instSupSetSet
simp only
have ⟨X, ⟨⟨x, hx⟩, ht⟩⟩ := Set.mem_setOf.mp hA
have : ⋃₀ 𝓐 = x := by
rw [← hx.right] at ht
have hl : ⋃₀ 𝓐 ⊆ x := ht
have hr : x ⊆ ⋃₀ 𝓐 := exercise_3_3 x hx.left
exact Set.Subset.antisymm hl hr
rw [← this] at hx
exact hx.left
· intro hA
suffices 𝒫 ⋃₀ 𝓐 ⊆ ⋃₀ { 𝒫 X | X ∈ 𝓐 } from
subset_antisymm hS this
show ∀ x, x ∈ 𝒫 ⋃₀ 𝓐 → x ∈ ⋃₀ { x | ∃ X, X ∈ 𝓐𝒫 X = x }
intro x hx
unfold Set.sUnion sSup Set.instSupSetSet
simp only [Set.mem_setOf_eq, exists_exists_and_eq_and, Set.mem_powerset_iff]
exact ⟨⋃₀ 𝓐, ⟨hA, hx⟩⟩
/-- ### Exercise 4.25
Is `A ( 𝓑)` always the same as ` { A X | X ∈ 𝓑 }`? If not, then under
what conditions does equality hold?
-/
theorem exercise_4_25 {A : Set α} (𝓑 : Set (Set α))
: (A (⋃₀ 𝓑) = ⋃₀ { A X | X ∈ 𝓑 }) ↔ (A = ∅ Set.Nonempty 𝓑) := by
apply Iff.intro
· intro h
by_cases h𝓑 : Set.Nonempty 𝓑
· exact Or.inr h𝓑
· have : 𝓑 = ∅ := Set.not_nonempty_iff_eq_empty.mp h𝓑
rw [this] at h
simp at h
exact Or.inl h
· intro h
apply Or.elim h
· intro hA
rw [hA]
simp
· intro h𝓑
calc A (⋃₀ 𝓑)
_ = { x | x ∈ A x ∈ ⋃₀ 𝓑} := rfl
_ = { x | x ∈ A (∃ b ∈ 𝓑, x ∈ b) } := rfl
_ = { x | ∃ b ∈ 𝓑, x ∈ A x ∈ b } := by
ext x
rw [Set.mem_setOf, Set.mem_setOf]
apply Iff.intro
· intro hx
apply Or.elim hx
· intro hA
have ⟨b, hb⟩ := Set.nonempty_def.mp h𝓑
exact ⟨b, ⟨hb, Or.inl hA⟩⟩
· intro ⟨b, hb⟩
exact ⟨b, ⟨hb.left, Or.inr hb.right⟩⟩
· intro ⟨b, ⟨hb, hx⟩⟩
apply Or.elim hx
· exact (Or.inl ·)
· intro h
exact Or.inr ⟨b, ⟨hb, h⟩⟩
_ = { x | ∃ b ∈ 𝓑, x ∈ A b } := rfl
_ = { x | ∃ t, t ∈ { y | ∃ X, X ∈ 𝓑 ∧ A X = y } ∧ x ∈ t } := by simp
_ = ⋃₀ { A X | X ∈ 𝓑 } := rfl
end Enderton.Set.Chapter_2