Imports
import Mathlib.Tactic import Analysis.Section_3_1

Analysis I, Section 3.2: Russell's paradox

I have attempted to make the translation as faithful a paraphrasing as possible of the original text. When there is a choice between a more idiomatic Lean solution and a more faithful translation, I have generally chosen the latter. In particular, there will be places where the Lean code could be "golfed" to be more elegant and idiomatic, but I have consciously avoided doing so.

This section is mostly optional, though it does make explicit the axiom of foundation which is used in a minor role in an exercise in Section 3.5.

Main constructions and results of this section:

  • Russell's paradox (ruling out the axiom of universal specification).

  • The axiom of regularity (foundation) - an axiom designed to avoid Russell's paradox.

Tips from past users

Users of the companion who have completed the exercises in this section are welcome to send their tips for future users in this section as PRs.

  • (Add tip here)

namespace Chapter3export SetTheory (Set Object)variable [SetTheory]

Axiom 3.8 (Universal specification)

abbrev axiom_of_universal_specification : Prop := ∀ P : Object → Prop, ∃ A : Set, ∀ x : Object, x ∈ A ↔ P x
theorem Russells_paradox : ¬ axiom_of_universal_specification := inst✝:SetTheory⊢ ¬axiom_of_universal_specification -- This proof is written to follow the structure of the original text. inst✝:SetTheoryh:axiom_of_universal_specification⊢ False inst✝:SetTheoryh:axiom_of_universal_specificationP:Object → Prop := fun x ↦ ∃ X, x = SetTheory.set_to_object X ∧ x ∉ X⊢ False inst✝:SetTheoryh:axiom_of_universal_specificationP:Object → Prop := fun x ↦ ∃ X, x = SetTheory.set_to_object X ∧ x ∉ XΩ:SethΩ:∀ (x : Object), x ∈ Ω ↔ P x⊢ False inst✝:SetTheoryh✝:axiom_of_universal_specificationP:Object → Prop := fun x ↦ ∃ X, x = SetTheory.set_to_object X ∧ x ∉ XΩ:SethΩ:∀ (x : Object), x ∈ Ω ↔ P xh:SetTheory.set_to_object Ω ∈ Ω⊢ Falseinst✝:SetTheoryh✝:axiom_of_universal_specificationP:Object → Prop := fun x ↦ ∃ X, x = SetTheory.set_to_object X ∧ x ∉ XΩ:SethΩ:∀ (x : Object), x ∈ Ω ↔ P xh:SetTheory.set_to_object Ω ∉ Ω⊢ False inst✝:SetTheoryh✝:axiom_of_universal_specificationP:Object → Prop := fun x ↦ ∃ X, x = SetTheory.set_to_object X ∧ x ∉ XΩ:SethΩ:∀ (x : Object), x ∈ Ω ↔ P xh:SetTheory.set_to_object Ω ∈ Ω⊢ False inst✝:SetTheoryh✝:axiom_of_universal_specificationP:Object → Prop := fun x ↦ ∃ X, x = SetTheory.set_to_object X ∧ x ∉ XΩ:SethΩ:∀ (x : Object), x ∈ Ω ↔ P xh:SetTheory.set_to_object Ω ∈ Ωthis:P (SetTheory.set_to_object Ω)⊢ False inst✝:SetTheoryh✝:axiom_of_universal_specificationP:Object → Prop := fun x ↦ ∃ X, x = SetTheory.set_to_object X ∧ x ∉ XΩ:SethΩ:∀ (x : Object), x ∈ Ω ↔ P xh:SetTheory.set_to_object Ω ∈ ΩΩ':SethΩ1:SetTheory.set_to_object Ω = SetTheory.set_to_object Ω'hΩ2:SetTheory.set_to_object Ω ∉ Ω'⊢ False inst✝:SetTheoryh✝:axiom_of_universal_specificationP:Object → Prop := fun x ↦ ∃ X, x = SetTheory.set_to_object X ∧ x ∉ XΩ:SethΩ:∀ (x : Object), x ∈ Ω ↔ P xh:SetTheory.set_to_object Ω ∈ ΩΩ':SethΩ2:SetTheory.set_to_object Ω ∉ Ω'hΩ1:Ω = Ω'⊢ False inst✝:SetTheoryh✝:axiom_of_universal_specificationP:Object → Prop := fun x ↦ ∃ X, x = SetTheory.set_to_object X ∧ x ∉ XΩ:SethΩ:∀ (x : Object), x ∈ Ω ↔ P xh:SetTheory.set_to_object Ω ∈ ΩΩ':SethΩ2:SetTheory.set_to_object Ω ∉ ΩhΩ1:Ω = Ω'⊢ False All goals completed! 🐙 have : P (Ω:Object) := inst✝:SetTheory⊢ ¬axiom_of_universal_specification All goals completed! 🐙 inst✝:SetTheoryh✝:axiom_of_universal_specificationP:Object → Prop := fun x ↦ ∃ X, x = SetTheory.set_to_object X ∧ x ∉ XΩ:SethΩ:∀ (x : Object), x ∈ Ω ↔ P xh:SetTheory.set_to_object Ω ∉ Ωthis:SetTheory.set_to_object Ω ∈ Ω⊢ False All goals completed! 🐙

Axiom 3.9 (Regularity)

theorem SetTheory.Set.axiom_of_regularity {A:Set} (h: A ≠ ∅) : ∃ x:A, ∀ S:Set, x.val = S → Disjoint S A := inst✝:SetTheoryA:Seth:A ≠ ∅⊢ ∃ x, ∀ (S : Set), ↑x = set_to_object S → Disjoint S A inst✝:SetTheoryA:Seth✝:A ≠ ∅x:Objecth:mem x Ah':∀ (S : Set), x = set_to_object S → ¬∃ y, mem y A ∧ mem y S⊢ ∃ x, ∀ (S : Set), ↑x = set_to_object S → Disjoint S A inst✝:SetTheoryA:Seth✝:A ≠ ∅x:Objecth:mem x Ah':∀ (S : Set), x = set_to_object S → ¬∃ y, mem y A ∧ mem y S⊢ ∀ (S : Set), ↑⟨x, h⟩ = set_to_object S → Disjoint S A intro S inst✝:SetTheoryA:Seth✝:A ≠ ∅x:Objecth:mem x Ah':∀ (S : Set), x = set_to_object S → ¬∃ y, mem y A ∧ mem y SS:SethS:↑⟨x, h⟩ = set_to_object S⊢ Disjoint S A; inst✝:SetTheoryA:Seth✝:A ≠ ∅x:Objecth:mem x AS:SethS:↑⟨x, h⟩ = set_to_object Sh':¬∃ y, mem y A ∧ mem y S⊢ Disjoint S A inst✝:SetTheoryA:Seth✝:A ≠ ∅x:Objecth:mem x AS:SethS:↑⟨x, h⟩ = set_to_object Sh':¬∃ y, mem y A ∧ mem y S⊢ ∀ (x : Object), x ∉ S ∩ A inst✝:SetTheoryA:Seth✝:A ≠ ∅x:Objecth:mem x AS:SethS:↑⟨x, h⟩ = set_to_object Sh':∃ x, x ∈ S ∩ A⊢ ∃ y, mem y A ∧ mem y S; inst✝:SetTheoryA:Seth✝:A ≠ ∅x:Objecth:mem x AS:SethS:↑⟨x, h⟩ = set_to_object Sh':∃ x ∈ S, x ∈ A⊢ ∃ y, mem y A ∧ mem y S All goals completed! 🐙

Exercise 3.2.1. The spirit of the exercise is to establish these results without using either Russell's paradox, or the empty set.

theorem declaration uses `sorry`SetTheory.Set.emptyset_exists (h: axiom_of_universal_specification): ∃ (X:Set), ∀ x, x ∉ X := inst✝:SetTheoryh:axiom_of_universal_specification⊢ ∃ X, ∀ (x : Object), x ∉ X All goals completed! 🐙

Exercise 3.2.1. The spirit of the exercise is to establish these results without using either Russell's paradox, or the singleton set.

theorem declaration uses `sorry`SetTheory.Set.singleton_exists (h: axiom_of_universal_specification) (x:Object): ∃ (X:Set), ∀ y, y ∈ X ↔ y = x := inst✝:SetTheoryh:axiom_of_universal_specificationx:Object⊢ ∃ X, ∀ (y : Object), y ∈ X ↔ y = x All goals completed! 🐙

Exercise 3.2.1. The spirit of the exercise is to establish these results without using either Russell's paradox, or the pair set.

theorem declaration uses `sorry`SetTheory.Set.pair_exists (h: axiom_of_universal_specification) (x₁ x₂:Object): ∃ (X:Set), ∀ y, y ∈ X ↔ y = x₁ ∨ y = x₂ := inst✝:SetTheoryh:axiom_of_universal_specificationx₁:Objectx₂:Object⊢ ∃ X, ∀ (y : Object), y ∈ X ↔ y = x₁ ∨ y = x₂ All goals completed! 🐙

Exercise 3.2.1. The spirit of the exercise is to establish these results without using either Russell's paradox, or the union operation.

theorem declaration uses `sorry`SetTheory.Set.union_exists (h: axiom_of_universal_specification) (A B:Set): ∃ (Z:Set), ∀ z, z ∈ Z ↔ z ∈ A ∨ z ∈ B := inst✝:SetTheoryh:axiom_of_universal_specificationA:SetB:Set⊢ ∃ Z, ∀ (z : Object), z ∈ Z ↔ z ∈ A ∨ z ∈ B All goals completed! 🐙

Exercise 3.2.1. The spirit of the exercise is to establish these results without using either Russell's paradox, or the specify operation.

theorem declaration uses `sorry`SetTheory.Set.specify_exists (h: axiom_of_universal_specification) (A:Set) (P: A → Prop): ∃ (Z:Set), ∀ z, z ∈ Z ↔ ∃ h : z ∈ A, P ⟨ z, h ⟩ := inst✝:SetTheoryh:axiom_of_universal_specificationA:SetP:A.toSubtype → Prop⊢ ∃ Z, ∀ (z : Object), z ∈ Z ↔ ∃ (h : z ∈ A), P ⟨z, h⟩ All goals completed! 🐙

Exercise 3.2.1. The spirit of the exercise is to establish these results without using either Russell's paradox, or the replace operation.

theorem declaration uses `sorry`SetTheory.Set.replace_exists (h: axiom_of_universal_specification) (A:Set) (P: A → Object → Prop) (hP: ∀ x y y', P x y ∧ P x y' → y = y') : ∃ (Z:Set), ∀ y, y ∈ Z ↔ ∃ a : A, P a y := inst✝:SetTheoryh:axiom_of_universal_specificationA:SetP:A.toSubtype → Object → ProphP:∀ (x : A.toSubtype) (y y' : Object), P x y ∧ P x y' → y = y'⊢ ∃ Z, ∀ (y : Object), y ∈ Z ↔ ∃ a, P a y All goals completed! 🐙

Exercise 3.2.2 (no set contains itself)

theorem declaration uses `sorry`SetTheory.Set.not_mem_self (A:Set) : (A:Object) ∉ A := inst✝:SetTheoryA:Set⊢ set_to_object A ∉ A All goals completed! 🐙

Exercise 3.2.2 (no two sets contain each other)

theorem declaration uses `sorry`SetTheory.Set.not_mem_mem (A B:Set) : (A:Object) ∉ B ∨ (B:Object) ∉ A := inst✝:SetTheoryA:SetB:Set⊢ set_to_object A ∉ B ∨ set_to_object B ∉ A All goals completed! 🐙

Exercise 3.2.3 (universal specification)

theorem declaration uses `sorry`SetTheory.Set.univ_iff : axiom_of_universal_specification ↔ ∃ (U:Set), ∀ x, x ∈ U := inst✝:SetTheory⊢ axiom_of_universal_specification ↔ ∃ U, ∀ (x : Object), x ∈ U All goals completed! 🐙

Exercise 3.2.3 (there is no universal set)

theorem declaration uses `sorry`SetTheory.Set.no_univ : ¬ ∃ (U:Set), ∀ (x:Object), x ∈ U := inst✝:SetTheory⊢ ¬∃ U, ∀ (x : Object), x ∈ U All goals completed! 🐙
end Chapter3