Measure Theory and Integration

2.6. Failure of Additivity🔗

We show that there exist a pair of sets that do not satisfy additivity.

As preparation, we first recall the translation invariance of measure.

Lemma (Translation Invariance).

For every set A \subseteq \mathbb{R} and every c \in \mathbb{R}, m(\{x \mid x - c \in A\}) = m(A).

Lean code
def translate (A : Set ) (c : ) : Set := {x | x - c A}
theorem measure_translate_le (A : Set ) (c : ) : measure (translate A c) measure A := A:Set c:measure (translate A c) measure A A:Set c:a: b: hA:A i, Ioo (a i) (b i)measure (translate A c) ∑' (i : ), ENNReal.ofReal (b i - a i) have hA' : translate A c n, Ioo (a n + c) (b n + c) := A:Set c:measure (translate A c) measure A intro x A:Set c:a: b: hA:A i, Ioo (a i) (b i)x:hx:x translate A cx n, Ioo (a n + c) (b n + c) A:Set c:a: b: hA:A i, Ioo (a i) (b i)x:hx:x translate A cn:hn:x - c Ioo (a n) (b n)x n, Ioo (a n + c) (b n + c) A:Set c:a: b: hA:A i, Ioo (a i) (b i)x:hx:x translate A cn:hn:x - c Ioo (a n) (b n)x Ioo (a n + c) (b n + c) A:Set c:a: b: hA:A i, Ioo (a i) (b i)x:hx:x translate A cn:hna:a n < x - chnb:x - c < b nx Ioo (a n + c) (b n + c) A:Set c:a: b: hA:A i, Ioo (a i) (b i)x:hx:x translate A cn:hna:a n < x - chnb:x - c < b na n + c < xA:Set c:a: b: hA:A i, Ioo (a i) (b i)x:hx:x translate A cn:hna:a n < x - chnb:x - c < b nx < b n + c A:Set c:a: b: hA:A i, Ioo (a i) (b i)x:hx:x translate A cn:hna:a n < x - chnb:x - c < b na n + c < xA:Set c:a: b: hA:A i, Ioo (a i) (b i)x:hx:x translate A cn:hna:a n < x - chnb:x - c < b nx < b n + c All goals completed! 🐙 calc measure (translate A c) ∑' n, ENNReal.ofReal ((b n + c) - (a n + c)) := measure_le _ _ _ hA' _ = ∑' n, ENNReal.ofReal (b n - a n) := A:Set c:a: b: hA:A i, Ioo (a i) (b i)hA':translate A c n, Ioo (a n + c) (b n + c) := fun x hx => Exists.casesOn (mem_iUnion.mp (hA hx)) fun n hn => mem_iUnion.mpr (Exists.intro n (And.casesOn hn fun hna hnb => measure_translate_le._proof_1 c a n hna, measure_translate_le._proof_2 c b n hnb))∑' (n : ), ENNReal.ofReal (b n + c - (a n + c)) = ∑' (n : ), ENNReal.ofReal (b n - a n) All goals completed! 🐙
theorem measure_translate (A : Set ) (c : ) : measure (translate A c) = measure A := A:Set c:measure (translate A c) = measure A A:Set c:measure A measure (translate A c) All goals completed! 🐙
Definition (Vitali Set).

A set A \subseteq \mathbb{R} is called a Vitali set if A \subseteq [0,1] and, for every x \in \mathbb{R} there exists a unique rational number q such that x - q \in A.

Lean code
structure IsVitali (A : Set ) : Prop where exists_rational : x : , ∃! q : , x - q A subset_Icc_zero_one : A Icc 0 1
Lemma.

If A is a Vitali set, then m(A) \neq 0.

Lean code
theorem IsVitali.Icc_zero_one_subset_iUnion_translate {A : Set } (hA : IsVitali A) : Icc 0 1 q : (Icc (-1) 1 : Set ), translate A (q : ) := A:Set hA:IsVitali AIcc 0 1 q, translate A q intro x A:Set hA:IsVitali Ax:hx:x Icc 0 1x q, translate A q A:Set hA:IsVitali Ax:hx:x Icc 0 1q:hqA:x - q Aright✝: (y : ), (fun q => x - q A) y y = qx q, translate A q have hq_lower : (-1 : ) q := A:Set hA:IsVitali AIcc 0 1 q, translate A q suffices (q : ) -1 A:Set hA:IsVitali Ax:hx:x Icc 0 1q:hqA:x - q Aright✝: (y : ), (fun q => x - q A) y y = qthis:q -1 := ?m.58-1 q All goals completed! 🐙 A:Set hA:IsVitali Ax:hx:x Icc 0 1q:hqA:x - q Aright✝: (y : ), (fun q => x - q A) y y = qhxq:x - q Icc 0 1 := hA.subset_Icc_zero_one hqAq -1 All goals completed! 🐙 have hq_upper : q (1 : ) := A:Set hA:IsVitali AIcc 0 1 q, translate A q suffices (q : ) 1 A:Set hA:IsVitali Ax:hx:x Icc 0 1q:hqA:x - q Aright✝: (y : ), (fun q => x - q A) y y = qhq_lower:-1 q := have this := have hxq := hA.subset_Icc_zero_one hqA; Icc_zero_one_subset_iUnion_translate._proof_1 hx q hxq; cast (Eq.trans (Eq.trans (congrArg (GE.ge q) (congrArg Neg.neg (Eq.symm Nat.cast_one))) (Eq.trans (congrArg (GE.ge q) (Int.cast_negSucc._simp_1 0)) Rat.intCast_le_cast._simp_1)) (Eq.symm (Eq.trans (congrFun' (congrArg LE.le (congrArg Neg.neg (Eq.symm Nat.cast_one))) q) (congrFun' (congrArg LE.le (Int.cast_negSucc._simp_1 0)) q)))) thisthis:q 1 := ?m.91q 1 All goals completed! 🐙 A:Set hA:IsVitali Ax:hx:x Icc 0 1q:hqA:x - q Aright✝: (y : ), (fun q => x - q A) y y = qhq_lower:-1 q := have this := have hxq := hA.subset_Icc_zero_one hqA; Icc_zero_one_subset_iUnion_translate._proof_1 hx q hxq; cast (Eq.trans (Eq.trans (congrArg (GE.ge q) (congrArg Neg.neg (Eq.symm Nat.cast_one))) (Eq.trans (congrArg (GE.ge q) (Int.cast_negSucc._simp_1 0)) Rat.intCast_le_cast._simp_1)) (Eq.symm (Eq.trans (congrFun' (congrArg LE.le (congrArg Neg.neg (Eq.symm Nat.cast_one))) q) (congrFun' (congrArg LE.le (Int.cast_negSucc._simp_1 0)) q)))) thishxq:x - q Icc 0 1 := hA.subset_Icc_zero_one hqAq 1 All goals completed! 🐙 A:Set hA:IsVitali Ax:hx:x Icc 0 1q:hqA:x - q Aright✝: (y : ), (fun q => x - q A) y y = qhq_lower:-1 q := have this := have hxq := hA.subset_Icc_zero_one hqA; Icc_zero_one_subset_iUnion_translate._proof_1 hx q hxq; cast (Eq.trans (Eq.trans (congrArg (GE.ge q) (congrArg Neg.neg (Eq.symm Nat.cast_one))) (Eq.trans (congrArg (GE.ge q) (Int.cast_negSucc._simp_1 0)) Rat.intCast_le_cast._simp_1)) (Eq.symm (Eq.trans (congrFun' (congrArg LE.le (congrArg Neg.neg (Eq.symm Nat.cast_one))) q) (congrFun' (congrArg LE.le (Int.cast_negSucc._simp_1 0)) q)))) thishq_upper:q 1 := have this := have hxq := hA.subset_Icc_zero_one hqA; Icc_zero_one_subset_iUnion_translate._proof_2 hx q hxq; cast (Eq.trans (Eq.trans (Eq.trans (congrArg (LE.le q) (Eq.symm Nat.cast_one)) Rat.cast_le_natCast._simp_1) (congrArg (LE.le q) Nat.cast_one)) (Eq.symm (Eq.trans (congrArg (LE.le q) (Eq.symm Nat.cast_one)) (congrArg (LE.le q) Nat.cast_one)))) thisx translate A q, All goals completed! 🐙
theorem IsVitali.measure_ne_zero {A : Set } (hA : IsVitali A) : measure A 0 := A:Set hA:IsVitali Ameasure A 0 A:Set hA:IsVitali Ahzero:measure A = 0False suffices hcontra : (1 : ℝ≥0∞) 0 A:Set hA:IsVitali Ahzero:measure A = 0hcontra:1 0 := ?m.16False All goals completed! 🐙 calc (1 : ℝ≥0∞) = measure (Icc 0 1) := measure_Icc_zero_one.symm _ measure ( q : (Icc (-1) 1 : Set ), translate A (q : )) := A:Set hA:IsVitali Ahzero:measure A = 0measure (Icc 0 1) measure (⋃ q, translate A q) All goals completed! 🐙 _ ∑' q : (Icc (-1) 1 : Set ), measure (translate A (q : )) := measure_iUnion_le_countable _ _ = 0 := A:Set hA:IsVitali Ahzero:measure A = 0∑' (q : (Icc (-1) 1)), measure (translate A q) = 0 All goals completed! 🐙
Lemma.

If A is a Vitali set and E \subseteq A is measurable, then m(E) = 0.

Lean code
theorem IsVitali.measure_eq_zero_of_measurableSet_subset {A E : Set } (hA : IsVitali A) (hE : MeasurableSet E) (hEA : E A) : measure E = 0 := A:Set E:Set hA:IsVitali AhE:MeasurableSet EhEA:E Ameasure E = 0 A:Set E:Set hA:IsVitali AhE:MeasurableSet EhEA:E Aι:Set := Ioc 0 1measure E = 0 A:Set E:Set hA:IsVitali AhE:MeasurableSet EhEA:E Aι:Set := Ioc 0 1B:ι Set := fun q => translate E qmeasure E = 0 have hBdisj : Pairwise (Disjoint on B) := A:Set E:Set hA:IsVitali AhE:MeasurableSet EhEA:E Ameasure E = 0 intro q A:Set E:Set hA:IsVitali AhE:MeasurableSet EhEA:E Aι:Set := Ioc 0 1B:ι Set := fun q => translate E qq:ιr:ιq r (Disjoint on B) q r A:Set E:Set hA:IsVitali AhE:MeasurableSet EhEA:E Aι:Set := Ioc 0 1B:ι Set := fun q => translate E qq:ιr:ιhqr:q r(Disjoint on B) q r A:Set E:Set hA:IsVitali AhE:MeasurableSet EhEA:E Aι:Set := Ioc 0 1B:ι Set := fun q => translate E qq:ιr:ιhqr:q rB q B r = All goals completed! 🐙 have hBsub : q, B q Icc 0 2 := A:Set E:Set hA:IsVitali AhE:MeasurableSet EhEA:E Ameasure E = 0 intro x A:Set E:Set hA:IsVitali AhE:MeasurableSet EhEA:E Aι:Set := Ioc 0 1B:ι Set := fun q => translate E qhBdisj:Pairwise (Disjoint on B) := fun q r hqr => have this := disjoint_translate_of_subset hA hEA fun h => hqr (Subtype.ext h); disjoint_iff_inter_eq_empty.mpr thisx:hx:x q, B qx Icc 0 2 A:Set E:Set hA:IsVitali AhE:MeasurableSet EhEA:E Aι:Set := Ioc 0 1B:ι Set := fun q => translate E qhBdisj:Pairwise (Disjoint on B) := fun q r hqr => have this := disjoint_translate_of_subset hA hEA fun h => hqr (Subtype.ext h); disjoint_iff_inter_eq_empty.mpr thisx:hx:x q, B qq:ιhq:x B qx Icc 0 2 exact translate_subset_Icc_zero_two (hEA.trans hA.subset_Icc_zero_one) (q : ) (A:Set E:Set hA:IsVitali AhE:MeasurableSet EhEA:E Aι:Set := Ioc 0 1B:ι Set := fun q => translate E qhBdisj:Pairwise (Disjoint on B) := fun q r hqr => have this := disjoint_translate_of_subset hA hEA fun h => hqr (Subtype.ext h); disjoint_iff_inter_eq_empty.mpr thisx:hx:x q, B qq:ιhq:x B q0 q All goals completed! 🐙) (A:Set E:Set hA:IsVitali AhE:MeasurableSet EhEA:E Aι:Set := Ioc 0 1B:ι Set := fun q => translate E qhBdisj:Pairwise (Disjoint on B) := fun q r hqr => have this := disjoint_translate_of_subset hA hEA fun h => hqr (Subtype.ext h); disjoint_iff_inter_eq_empty.mpr thisx:hx:x q, B qq:ιhq:x B qq 1 All goals completed! 🐙) (A:Set E:Set hA:IsVitali AhE:MeasurableSet EhEA:E Aι:Set := Ioc 0 1B:ι Set := fun q => translate E qhBdisj:Pairwise (Disjoint on B) := fun q r hqr => have this := disjoint_translate_of_subset hA hEA fun h => hqr (Subtype.ext h); disjoint_iff_inter_eq_empty.mpr thisx:hx:x q, B qq:ιhq:x B qx translate E q All goals completed! 🐙) A:Set E:Set hA:IsVitali AhE:MeasurableSet EhEA:E Aι:Set := Ioc 0 1B:ι Set := fun q => translate E qhBdisj:Pairwise (Disjoint on B) := fun q r hqr => have this := disjoint_translate_of_subset hA hEA fun h => hqr (Subtype.ext h); disjoint_iff_inter_eq_empty.mpr thishBsub: q, B q Icc 0 2 := fun x hx => Exists.casesOn (mem_iUnion.mp hx) fun q hq => translate_subset_Icc_zero_two (HasSubset.Subset.trans hEA hA.subset_Icc_zero_one) (↑q) (cast (Eq.trans (Eq.trans (congrFun' (congrArg LE.le (Eq.symm Nat.cast_zero)) q) (congrFun' (congrArg LE.le Nat.cast_zero) q)) (Eq.symm (Eq.trans (Eq.trans (congrFun' (congrArg LE.le (Eq.symm Nat.cast_zero)) q) Rat.natCast_le_cast._simp_1) (congrFun' (congrArg LE.le Nat.cast_zero) q)))) (le_of_lt q.property.left)) (cast (Eq.trans (Eq.trans (congrArg (LE.le q) (Eq.symm Nat.cast_one)) (congrArg (LE.le q) Nat.cast_one)) (Eq.symm (Eq.trans (Eq.trans (congrArg (LE.le q) (Eq.symm Nat.cast_one)) Rat.cast_le_natCast._simp_1) (congrArg (LE.le q) Nat.cast_one)))) q.property.right) (Eq.mpr (id mem_translate._simp_1) (Eq.mp mem_translate._simp_1 hq))hE0:¬measure E = 0False suffices hcontra : ( : ℝ≥0∞) 2 A:Set E:Set hA:IsVitali AhE:MeasurableSet EhEA:E Aι:Set := Ioc 0 1B:ι Set := fun q => translate E qhBdisj:Pairwise (Disjoint on B) := fun q r hqr => have this := disjoint_translate_of_subset hA hEA fun h => hqr (Subtype.ext h); disjoint_iff_inter_eq_empty.mpr thishBsub: q, B q Icc 0 2 := fun x hx => Exists.casesOn (mem_iUnion.mp hx) fun q hq => translate_subset_Icc_zero_two (HasSubset.Subset.trans hEA hA.subset_Icc_zero_one) (↑q) (cast (Eq.trans (Eq.trans (congrFun' (congrArg LE.le (Eq.symm Nat.cast_zero)) q) (congrFun' (congrArg LE.le Nat.cast_zero) q)) (Eq.symm (Eq.trans (Eq.trans (congrFun' (congrArg LE.le (Eq.symm Nat.cast_zero)) q) Rat.natCast_le_cast._simp_1) (congrFun' (congrArg LE.le Nat.cast_zero) q)))) (le_of_lt q.property.left)) (cast (Eq.trans (Eq.trans (congrArg (LE.le q) (Eq.symm Nat.cast_one)) (congrArg (LE.le q) Nat.cast_one)) (Eq.symm (Eq.trans (Eq.trans (congrArg (LE.le q) (Eq.symm Nat.cast_one)) Rat.cast_le_natCast._simp_1) (congrArg (LE.le q) Nat.cast_one)))) q.property.right) (Eq.mpr (id mem_translate._simp_1) (Eq.mp mem_translate._simp_1 hq))hE0:¬measure E = 0hcontra: 2 := ?m.136False All goals completed! 🐙 calc = ∑' _ : ι, measure E := (ENNReal.tsum_const_eq_top_of_ne_zero hE0).symm _ = ∑' q : ι, measure (B q) := A:Set E:Set hA:IsVitali AhE:MeasurableSet EhEA:E Aι:Set := Ioc 0 1B:ι Set := fun q => translate E qhBdisj:Pairwise (Disjoint on B) := fun q r hqr => have this := disjoint_translate_of_subset hA hEA fun h => hqr (Subtype.ext h); disjoint_iff_inter_eq_empty.mpr thishBsub: q, B q Icc 0 2 := fun x hx => Exists.casesOn (mem_iUnion.mp hx) fun q hq => translate_subset_Icc_zero_two (HasSubset.Subset.trans hEA hA.subset_Icc_zero_one) (↑q) (cast (Eq.trans (Eq.trans (congrFun' (congrArg LE.le (Eq.symm Nat.cast_zero)) q) (congrFun' (congrArg LE.le Nat.cast_zero) q)) (Eq.symm (Eq.trans (Eq.trans (congrFun' (congrArg LE.le (Eq.symm Nat.cast_zero)) q) Rat.natCast_le_cast._simp_1) (congrFun' (congrArg LE.le Nat.cast_zero) q)))) (le_of_lt q.property.left)) (cast (Eq.trans (Eq.trans (congrArg (LE.le q) (Eq.symm Nat.cast_one)) (congrArg (LE.le q) Nat.cast_one)) (Eq.symm (Eq.trans (Eq.trans (congrArg (LE.le q) (Eq.symm Nat.cast_one)) Rat.cast_le_natCast._simp_1) (congrArg (LE.le q) Nat.cast_one)))) q.property.right) (Eq.mpr (id mem_translate._simp_1) (Eq.mp mem_translate._simp_1 hq))hE0:¬measure E = 0∑' (x : ι), measure E = ∑' (q : ι), measure (B q) A:Set E:Set hA:IsVitali AhE:MeasurableSet EhEA:E Aι:Set := Ioc 0 1B:ι Set := fun q => translate E qhBdisj:Pairwise (Disjoint on B) := fun q r hqr => have this := disjoint_translate_of_subset hA hEA fun h => hqr (Subtype.ext h); disjoint_iff_inter_eq_empty.mpr thishBsub: q, B q Icc 0 2 := fun x hx => Exists.casesOn (mem_iUnion.mp hx) fun q hq => translate_subset_Icc_zero_two (HasSubset.Subset.trans hEA hA.subset_Icc_zero_one) (↑q) (cast (Eq.trans (Eq.trans (congrFun' (congrArg LE.le (Eq.symm Nat.cast_zero)) q) (congrFun' (congrArg LE.le Nat.cast_zero) q)) (Eq.symm (Eq.trans (Eq.trans (congrFun' (congrArg LE.le (Eq.symm Nat.cast_zero)) q) Rat.natCast_le_cast._simp_1) (congrFun' (congrArg LE.le Nat.cast_zero) q)))) (le_of_lt q.property.left)) (cast (Eq.trans (Eq.trans (congrArg (LE.le q) (Eq.symm Nat.cast_one)) (congrArg (LE.le q) Nat.cast_one)) (Eq.symm (Eq.trans (Eq.trans (congrArg (LE.le q) (Eq.symm Nat.cast_one)) Rat.cast_le_natCast._simp_1) (congrArg (LE.le q) Nat.cast_one)))) q.property.right) (Eq.mpr (id mem_translate._simp_1) (Eq.mp mem_translate._simp_1 hq))hE0:¬measure E = 0q:ιmeasure E = measure (B q) All goals completed! 🐙 _ = measure ( q, B q) := (measure_iUnion_countable hBdisj (fun q hE.translate _)).symm _ measure (Icc 0 2) := measure_mono hBsub _ = 2 := A:Set E:Set hA:IsVitali AhE:MeasurableSet EhEA:E Aι:Set := Ioc 0 1B:ι Set := fun q => translate E qhBdisj:Pairwise (Disjoint on B) := fun q r hqr => have this := disjoint_translate_of_subset hA hEA fun h => hqr (Subtype.ext h); disjoint_iff_inter_eq_empty.mpr thishBsub: q, B q Icc 0 2 := fun x hx => Exists.casesOn (mem_iUnion.mp hx) fun q hq => translate_subset_Icc_zero_two (HasSubset.Subset.trans hEA hA.subset_Icc_zero_one) (↑q) (cast (Eq.trans (Eq.trans (congrFun' (congrArg LE.le (Eq.symm Nat.cast_zero)) q) (congrFun' (congrArg LE.le Nat.cast_zero) q)) (Eq.symm (Eq.trans (Eq.trans (congrFun' (congrArg LE.le (Eq.symm Nat.cast_zero)) q) Rat.natCast_le_cast._simp_1) (congrFun' (congrArg LE.le Nat.cast_zero) q)))) (le_of_lt q.property.left)) (cast (Eq.trans (Eq.trans (congrArg (LE.le q) (Eq.symm Nat.cast_one)) (congrArg (LE.le q) Nat.cast_one)) (Eq.symm (Eq.trans (Eq.trans (congrArg (LE.le q) (Eq.symm Nat.cast_one)) Rat.cast_le_natCast._simp_1) (congrArg (LE.le q) Nat.cast_one)))) q.property.right) (Eq.mpr (id mem_translate._simp_1) (Eq.mp mem_translate._simp_1 hq))hE0:¬measure E = 0measure (Icc 0 2) = 2 All goals completed! 🐙

Taken together, the previous two lemmas show that a Vitali set cannot be measurable.

Theorem (Nonmeasurability of Vitali Sets).

If A is a Vitali set, then A is not measurable.

Lean code
theorem IsVitali.not_measurableSet {A : Set } (hA : IsVitali A) : ¬ MeasurableSet A := fun h hA.measure_ne_zero <| hA.measure_eq_zero_of_measurableSet_subset h subset_rfl
Lemma.

If A is a Vitali set, then m([0,1] \setminus A) = 1.

Lean code
theorem IsVitali.measure_compl_eq_one {A : Set } (hA : IsVitali A) : measure (Icc 0 1 \ A) = 1 := A:Set hA:IsVitali Ameasure (Icc 0 1 \ A) = 1 A:Set hA:IsVitali Ameasure (Icc 0 1 \ A) 1A:Set hA:IsVitali A1 measure (Icc 0 1 \ A) A:Set hA:IsVitali Ameasure (Icc 0 1 \ A) 1 calc measure (Icc 0 1 \ A) measure (Icc 0 1) := measure_mono diff_subset _ = 1 := measure_Icc_zero_one A:Set hA:IsVitali Ahlt:¬1 measure (Icc 0 1 \ A)False A:Set hA:IsVitali Ahlt:¬1 measure (Icc 0 1 \ A)measure (Icc 0 1 \ A) = 1 A:Set hA:IsVitali Ahlt:¬1 measure (Icc 0 1 \ A)E':Set hE':Icc 0 1 \ A E'hE'meas:MeasurableSet E'hE'eq:measure E' = measure (Icc 0 1 \ A)measure (Icc 0 1 \ A) = 1 A:Set hA:IsVitali Ahlt:¬1 measure (Icc 0 1 \ A)E':Set hE':Icc 0 1 \ A E'hE'meas:MeasurableSet E'hE'eq:measure E' = measure (Icc 0 1 \ A)F:Set := E' Icc 0 1measure (Icc 0 1 \ A) = 1 A:Set hA:IsVitali Ahlt:¬1 measure (Icc 0 1 \ A)E':Set hE':Icc 0 1 \ A E'hE'meas:MeasurableSet E'hE'eq:measure E' = measure (Icc 0 1 \ A)F:Set := E' Icc 0 1hBsubF:Icc 0 1 \ A F := fun x hx => hE' hx, hx.leftmeasure (Icc 0 1 \ A) = 1 have hFeq : measure F = measure (Icc 0 1 \ A) := A:Set hA:IsVitali Ameasure (Icc 0 1 \ A) = 1 A:Set hA:IsVitali Ahlt:¬1 measure (Icc 0 1 \ A)E':Set hE':Icc 0 1 \ A E'hE'meas:MeasurableSet E'hE'eq:measure E' = measure (Icc 0 1 \ A)F:Set := E' Icc 0 1hBsubF:Icc 0 1 \ A F := fun x hx => hE' hx, hx.leftmeasure F measure (Icc 0 1 \ A) calc measure F measure E' := measure_mono Set.inter_subset_left _ = measure (Icc 0 1 \ A) := hE'eq A:Set hA:IsVitali Ahlt:¬1 measure (Icc 0 1 \ A)E':Set hE':Icc 0 1 \ A E'hE'meas:MeasurableSet E'hE'eq:measure E' = measure (Icc 0 1 \ A)F:Set := E' Icc 0 1hBsubF:Icc 0 1 \ A F := fun x hx => hE' hx, hx.lefthFeq:measure F = measure (Icc 0 1 \ A) := le_antisymm (Trans.trans (measure_mono inter_subset_left) hE'eq) (measure_mono hBsubF)E:Set := Icc 0 1 \ Fmeasure (Icc 0 1 \ A) = 1 A:Set hA:IsVitali Ahlt:¬1 measure (Icc 0 1 \ A)E':Set hE':Icc 0 1 \ A E'hE'meas:MeasurableSet E'hE'eq:measure E' = measure (Icc 0 1 \ A)F:Set := E' Icc 0 1hBsubF:Icc 0 1 \ A F := fun x hx => hE' hx, hx.lefthFeq:measure F = measure (Icc 0 1 \ A) := le_antisymm (Trans.trans (measure_mono inter_subset_left) hE'eq) (measure_mono hBsubF)E:Set := Icc 0 1 \ FhEmeas:MeasurableSet E := MeasurableSet.diff (measurableSet_Icc 0 1) (MeasurableSet.inter hE'meas (measurableSet_Icc 0 1))measure (Icc 0 1 \ A) = 1 have hEsubA : E A := A:Set hA:IsVitali Ameasure (Icc 0 1 \ A) = 1 intro x A:Set hA:IsVitali Ahlt:¬1 measure (Icc 0 1 \ A)E':Set hE':Icc 0 1 \ A E'hE'meas:MeasurableSet E'hE'eq:measure E' = measure (Icc 0 1 \ A)F:Set := E' Icc 0 1hBsubF:Icc 0 1 \ A F := fun x hx => hE' hx, hx.lefthFeq:measure F = measure (Icc 0 1 \ A) := le_antisymm (Trans.trans (measure_mono inter_subset_left) hE'eq) (measure_mono hBsubF)E:Set := Icc 0 1 \ FhEmeas:MeasurableSet E := MeasurableSet.diff (measurableSet_Icc 0 1) (MeasurableSet.inter hE'meas (measurableSet_Icc 0 1))x:hx:x Ex A A:Set hA:IsVitali Ahlt:¬1 measure (Icc 0 1 \ A)E':Set hE':Icc 0 1 \ A E'hE'meas:MeasurableSet E'hE'eq:measure E' = measure (Icc 0 1 \ A)F:Set := E' Icc 0 1hBsubF:Icc 0 1 \ A F := fun x hx => hE' hx, hx.lefthFeq:measure F = measure (Icc 0 1 \ A) := le_antisymm (Trans.trans (measure_mono inter_subset_left) hE'eq) (measure_mono hBsubF)E:Set := Icc 0 1 \ FhEmeas:MeasurableSet E := MeasurableSet.diff (measurableSet_Icc 0 1) (MeasurableSet.inter hE'meas (measurableSet_Icc 0 1))x:hx:x EhxA:x AFalse A:Set hA:IsVitali Ahlt:¬1 measure (Icc 0 1 \ A)E':Set hE':Icc 0 1 \ A E'hE'meas:MeasurableSet E'hE'eq:measure E' = measure (Icc 0 1 \ A)F:Set := E' Icc 0 1hBsubF:Icc 0 1 \ A F := fun x hx => hE' hx, hx.lefthFeq:measure F = measure (Icc 0 1 \ A) := le_antisymm (Trans.trans (measure_mono inter_subset_left) hE'eq) (measure_mono hBsubF)E:Set := Icc 0 1 \ FhEmeas:MeasurableSet E := MeasurableSet.diff (measurableSet_Icc 0 1) (MeasurableSet.inter hE'meas (measurableSet_Icc 0 1))x:hx:x EhxA:x Ahxdiff:x Icc 0 1 \ A := hx.left, hxAFalse A:Set hA:IsVitali Ahlt:¬1 measure (Icc 0 1 \ A)E':Set hE':Icc 0 1 \ A E'hE'meas:MeasurableSet E'hE'eq:measure E' = measure (Icc 0 1 \ A)F:Set := E' Icc 0 1hBsubF:Icc 0 1 \ A F := fun x hx => hE' hx, hx.lefthFeq:measure F = measure (Icc 0 1 \ A) := le_antisymm (Trans.trans (measure_mono inter_subset_left) hE'eq) (measure_mono hBsubF)E:Set := Icc 0 1 \ FhEmeas:MeasurableSet E := MeasurableSet.diff (measurableSet_Icc 0 1) (MeasurableSet.inter hE'meas (measurableSet_Icc 0 1))x:hx:x EhxA:x Ahxdiff:x Icc 0 1 \ A := hx.left, hxAhxF:x F := hE' hxdiff, hx.leftFalse All goals completed! 🐙 have hEF : E F = := Set.disjoint_iff_inter_eq_empty.1 (A:Set hA:IsVitali Ahlt:¬1 measure (Icc 0 1 \ A)E':Set hE':Icc 0 1 \ A E'hE'meas:MeasurableSet E'hE'eq:measure E' = measure (Icc 0 1 \ A)F:Set := E' Icc 0 1hBsubF:Icc 0 1 \ A F := fun x hx => hE' hx, hx.lefthFeq:measure F = measure (Icc 0 1 \ A) := le_antisymm (Trans.trans (measure_mono inter_subset_left) hE'eq) (measure_mono hBsubF)E:Set := Icc 0 1 \ FhEmeas:MeasurableSet E := MeasurableSet.diff (measurableSet_Icc 0 1) (MeasurableSet.inter hE'meas (measurableSet_Icc 0 1))hEsubA:E A := fun x hx => Classical.byContradiction fun hxA => have hxdiff := hx.left, hxA; have hxF := hE' hxdiff, hx.left; hx.right hxFDisjoint E F All goals completed! 🐙) calc measure (Icc 0 1 \ A) = measure F := hFeq.symm _ = measure E + measure F := A:Set hA:IsVitali Ahlt:¬1 measure (Icc 0 1 \ A)E':Set hE':Icc 0 1 \ A E'hE'meas:MeasurableSet E'hE'eq:measure E' = measure (Icc 0 1 \ A)F:Set := E' Icc 0 1hBsubF:Icc 0 1 \ A F := fun x hx => hE' hx, hx.lefthFeq:measure F = measure (Icc 0 1 \ A) := le_antisymm (Trans.trans (measure_mono inter_subset_left) hE'eq) (measure_mono hBsubF)E:Set := Icc 0 1 \ FhEmeas:MeasurableSet E := MeasurableSet.diff (measurableSet_Icc 0 1) (MeasurableSet.inter hE'meas (measurableSet_Icc 0 1))hEsubA:E A := fun x hx => Classical.byContradiction fun hxA => have hxdiff := hx.left, hxA; have hxF := hE' hxdiff, hx.left; hx.right hxFhEF:E F = := disjoint_iff_inter_eq_empty.mp (measure_compl_eq_one._proof_1 E')measure F = measure E + measure F All goals completed! 🐙 _ = measure (E F) := A:Set hA:IsVitali Ahlt:¬1 measure (Icc 0 1 \ A)E':Set hE':Icc 0 1 \ A E'hE'meas:MeasurableSet E'hE'eq:measure E' = measure (Icc 0 1 \ A)F:Set := E' Icc 0 1hBsubF:Icc 0 1 \ A F := fun x hx => hE' hx, hx.lefthFeq:measure F = measure (Icc 0 1 \ A) := le_antisymm (Trans.trans (measure_mono inter_subset_left) hE'eq) (measure_mono hBsubF)E:Set := Icc 0 1 \ FhEmeas:MeasurableSet E := MeasurableSet.diff (measurableSet_Icc 0 1) (MeasurableSet.inter hE'meas (measurableSet_Icc 0 1))hEsubA:E A := fun x hx => Classical.byContradiction fun hxA => have hxdiff := hx.left, hxA; have hxF := hE' hxdiff, hx.left; hx.right hxFhEF:E F = := disjoint_iff_inter_eq_empty.mp (measure_compl_eq_one._proof_1 E')measure E + measure F = measure (E F) All goals completed! 🐙 _ = measure (Icc 0 1) := A:Set hA:IsVitali Ahlt:¬1 measure (Icc 0 1 \ A)E':Set hE':Icc 0 1 \ A E'hE'meas:MeasurableSet E'hE'eq:measure E' = measure (Icc 0 1 \ A)F:Set := E' Icc 0 1hBsubF:Icc 0 1 \ A F := fun x hx => hE' hx, hx.lefthFeq:measure F = measure (Icc 0 1 \ A) := le_antisymm (Trans.trans (measure_mono inter_subset_left) hE'eq) (measure_mono hBsubF)E:Set := Icc 0 1 \ FhEmeas:MeasurableSet E := MeasurableSet.diff (measurableSet_Icc 0 1) (MeasurableSet.inter hE'meas (measurableSet_Icc 0 1))hEsubA:E A := fun x hx => Classical.byContradiction fun hxA => have hxdiff := hx.left, hxA; have hxF := hE' hxdiff, hx.left; hx.right hxFhEF:E F = := disjoint_iff_inter_eq_empty.mp (measure_compl_eq_one._proof_1 E')measure (E F) = measure (Icc 0 1) All goals completed! 🐙 _ = 1 := measure_Icc_zero_one
Theorem (Failure of Additivity for Vitali Sets).

If A is a Vitali set, then m([0,1]) \neq m(A) + m([0,1] \setminus A).

Lean code
theorem IsVitali.compl_nonadditive {A : Set } (hA : IsVitali A) : measure (Icc 0 1) measure A + measure (Icc 0 1 \ A) := A:Set hA:IsVitali Ameasure (Icc 0 1) measure A + measure (Icc 0 1 \ A) A:Set hA:IsVitali Ameasure (Icc 0 1) < measure A + measure (Icc 0 1 \ A) calc measure (Icc 0 1) = 1 := measure_Icc_zero_one _ < measure A + 1 := A:Set hA:IsVitali A1 < measure A + 1 simpa [add_comm] using ENNReal.lt_add_right (A:Set hA:IsVitali A1 All goals completed! 🐙) hA.measure_ne_zero _ = measure A + measure (Icc 0 1 \ A) := A:Set hA:IsVitali Ameasure A + 1 = measure A + measure (Icc 0 1 \ A) All goals completed! 🐙

To deduce actual existence statements, it remains only to construct one Vitali set.

Definition (Existence of Vitali Sets).

Consider the equivalence relation on \mathbb{R} given by rational translation. Every equivalence class meets [0,1], so by the axiom of choice we may choose one point in [0,1] from each class. Let V \subseteq \mathbb{R} be the set of all chosen representatives.

Lean code
theorem exists_rationalRel_mem_Icc_zero_one (x : ) : y : (Icc 0 1 : Set ), rationalRel x y := x: y, rationalRel x y x:q:hq_left:x - 1 < qhq_right:q < x y, rationalRel x y refine x - q, x:q:hq_left:x - 1 < qhq_right:q < xx - q Icc 0 1 All goals completed! 🐙, q, x:q:hq_left:x - 1 < qhq_right:q < xx - x - q, = q All goals completed! 🐙
theorem exists_subtype_mk_eq_quotient (q : Quotient rationalRelSetoid) : y : (Icc 0 1 : Set ), (y : ) = q := q:Quotient rationalRelSetoid y, y = q q:Quotient rationalRelSetoid (a : ), y, y = a q:Quotient rationalRelSetoidx: y, y = x q:Quotient rationalRelSetoidx:y:(Icc 0 1)hy:rationalRel x y y, y = x All goals completed! 🐙
def chosenVitaliPoint (q : Quotient rationalRelSetoid) : (Icc 0 1 : Set ) := Classical.choose (exists_subtype_mk_eq_quotient q)
def chosenVitali : Set := Set.range fun q : Quotient rationalRelSetoid (chosenVitaliPoint q : )
Lemma.

The set V defined above is a Vitali set.

Lean code
theorem chosenVitali_subset_Icc_zero_one : chosenVitali Icc 0 1 := chosenVitali Icc 0 1 q:Quotient rationalRelSetoid(fun q => (chosenVitaliPoint q)) q Icc 0 1 All goals completed! 🐙
theorem existsUnique_rational_chosenVitali (x : ) : ∃! q : , x - q chosenVitali := x:∃! q, x - q chosenVitali x:q:hq:x - (chosenVitaliPoint x) = q∃! q, x - q chosenVitali refine q, x, x:q:hq:x - (chosenVitaliPoint x) = q(fun q => (chosenVitaliPoint q)) x = x - q All goals completed! 🐙, ?_ intro r x:q:hq:x - (chosenVitaliPoint x) = qr:hr:x - r chosenVitalir = q have hz : x - r = chosenVitaliPoint x := eq_chosenVitaliPoint_of_mem_chosenVitali_of_rationalRel hr r, x:q:hq:x - (chosenVitaliPoint x) = qr:hr:x - r chosenVitalix - (x - r) = r All goals completed! 🐙 exact Rat.cast_inj.mp <| calc (r : ) = x - (chosenVitaliPoint x : ) := x:q:hq:x - (chosenVitaliPoint x) = qr:hr:x - r chosenVitalihz:x - r = (chosenVitaliPoint x) := eq_chosenVitaliPoint_of_mem_chosenVitali_of_rationalRel hr (Exists.intro r (Mathlib.Tactic.Ring.of_eq (Mathlib.Tactic.Ring.sub_congr (Mathlib.Tactic.Ring.atom_pf x) (Mathlib.Tactic.Ring.sub_congr (Mathlib.Tactic.Ring.atom_pf x) (Mathlib.Tactic.Ring.atom_pf r) (Mathlib.Tactic.Ring.sub_pf (Mathlib.Tactic.Ring.neg_add (Mathlib.Tactic.Ring.neg_mul (↑r) (Nat.rawCast 1) (Mathlib.Tactic.Ring.neg_one_mul (Mathlib.Meta.NormNum.IsInt.to_raw_eq (Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsInt.of_raw (Int.negOfNat 1)) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw 1)) (Eq.refl (Int.negOfNat 1)))))) Mathlib.Tactic.Ring.neg_zero) (Mathlib.Tactic.Ring.add_pf_add_lt (x ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.add_pf_zero_add (r ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))))) (Mathlib.Tactic.Ring.sub_pf (Mathlib.Tactic.Ring.neg_add (Mathlib.Tactic.Ring.neg_mul x (Nat.rawCast 1) (Mathlib.Tactic.Ring.neg_one_mul (Mathlib.Meta.NormNum.IsInt.to_raw_eq (Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsInt.of_raw (Int.negOfNat 1)) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw 1)) (Eq.refl (Int.negOfNat 1)))))) (Mathlib.Tactic.Ring.neg_add (Mathlib.Tactic.Ring.neg_mul (↑r) (Nat.rawCast 1) (Mathlib.Tactic.Ring.neg_one_mul (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsInt.of_raw (Int.negOfNat 1)) (Mathlib.Meta.NormNum.IsInt.of_raw (Int.negOfNat 1)) (Eq.refl (Int.ofNat 1))))))) Mathlib.Tactic.Ring.neg_zero)) (Mathlib.Tactic.Ring.add_pf_add_overlap_zero (Mathlib.Tactic.Ring.add_overlap_pf_zero x (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw 1)) (Mathlib.Meta.NormNum.IsInt.of_raw (Int.negOfNat 1)) (Eq.refl (Int.ofNat 0))))) (Mathlib.Tactic.Ring.add_pf_zero_add (r ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.atom_pf r)))r = x - (chosenVitaliPoint x) All goals completed! 🐙 _ = (q : ) := x:q:hq:x - (chosenVitaliPoint x) = qr:hr:x - r chosenVitalihz:x - r = (chosenVitaliPoint x) := eq_chosenVitaliPoint_of_mem_chosenVitali_of_rationalRel hr (Exists.intro r (Mathlib.Tactic.Ring.of_eq (Mathlib.Tactic.Ring.sub_congr (Mathlib.Tactic.Ring.atom_pf x) (Mathlib.Tactic.Ring.sub_congr (Mathlib.Tactic.Ring.atom_pf x) (Mathlib.Tactic.Ring.atom_pf r) (Mathlib.Tactic.Ring.sub_pf (Mathlib.Tactic.Ring.neg_add (Mathlib.Tactic.Ring.neg_mul (↑r) (Nat.rawCast 1) (Mathlib.Tactic.Ring.neg_one_mul (Mathlib.Meta.NormNum.IsInt.to_raw_eq (Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsInt.of_raw (Int.negOfNat 1)) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw 1)) (Eq.refl (Int.negOfNat 1)))))) Mathlib.Tactic.Ring.neg_zero) (Mathlib.Tactic.Ring.add_pf_add_lt (x ^ Nat.rawCast 1 * Nat.rawCast 1) (Mathlib.Tactic.Ring.add_pf_zero_add (r ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))))) (Mathlib.Tactic.Ring.sub_pf (Mathlib.Tactic.Ring.neg_add (Mathlib.Tactic.Ring.neg_mul x (Nat.rawCast 1) (Mathlib.Tactic.Ring.neg_one_mul (Mathlib.Meta.NormNum.IsInt.to_raw_eq (Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsInt.of_raw (Int.negOfNat 1)) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw 1)) (Eq.refl (Int.negOfNat 1)))))) (Mathlib.Tactic.Ring.neg_add (Mathlib.Tactic.Ring.neg_mul (↑r) (Nat.rawCast 1) (Mathlib.Tactic.Ring.neg_one_mul (Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul) (Mathlib.Meta.NormNum.IsInt.of_raw (Int.negOfNat 1)) (Mathlib.Meta.NormNum.IsInt.of_raw (Int.negOfNat 1)) (Eq.refl (Int.ofNat 1))))))) Mathlib.Tactic.Ring.neg_zero)) (Mathlib.Tactic.Ring.add_pf_add_overlap_zero (Mathlib.Tactic.Ring.add_overlap_pf_zero x (Nat.rawCast 1) (Mathlib.Meta.NormNum.IsInt.to_isNat (Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw 1)) (Mathlib.Meta.NormNum.IsInt.of_raw (Int.negOfNat 1)) (Eq.refl (Int.ofNat 0))))) (Mathlib.Tactic.Ring.add_pf_zero_add (r ^ Nat.rawCast 1 * Nat.rawCast 1 + 0))))) (Mathlib.Tactic.Ring.atom_pf r)))x - (chosenVitaliPoint x) = q All goals completed! 🐙
Theorem (Existence of Nonmeasurable Sets).

There exists a set A \subseteq \mathbb{R} that is not measurable.

Lean code
theorem exists_not_measurableSet : A : Set , ¬ MeasurableSet A := chosenVitali, isVitali_chosenVitali.not_measurableSet
Theorem (Failure of Additivity).

There exist disjoint sets A, B \subseteq \mathbb{R} such that m(A \cup B) \neq m(A) + m(B).

Lean code
theorem exists_disjoint_nonadditive : A B : Set , A B = measure (A B) measure A + measure B := A B, A B = measure (A B) measure A + measure B refine chosenVitali, Icc 0 1 \ chosenVitali, chosenVitali (Icc 0 1 \ chosenVitali) = All goals completed! 🐙, ?_ All goals completed! 🐙