Skip to content

Commit d9328bf

Browse files
committed
feat: separable but not second countable LOTS (#29920)
1 parent f51758c commit d9328bf

3 files changed

Lines changed: 56 additions & 0 deletions

File tree

Counterexamples.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import Counterexamples.PolynomialIsDomain
1919
import Counterexamples.Pseudoelement
2020
import Counterexamples.QuadraticForm
2121
import Counterexamples.SeminormLatticeNotDistrib
22+
import Counterexamples.SeparableNotSecondCountable
2223
import Counterexamples.SorgenfreyLine
2324
import Counterexamples.TopologistsSineCurve
2425
import Counterexamples.ZeroDivisorsInAddMonoidAlgebras
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/-
2+
Copyright (c) 2025 Yury G. Kudryashov. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Yury G. Kudryashov
5+
-/
6+
import Mathlib.Analysis.Real.Cardinality
7+
8+
/-!
9+
# Example of a linear order which is a separable space but is not a second countable topology
10+
11+
In this file we provide an example of a linear order
12+
such that the order topology is a separable space but is not a second countable topology.
13+
14+
The example is `ℝ ×ₗ Bool` which is the real line with each point duplicated
15+
so that the duplicate is greater than the original point
16+
and points with different real values are compared by these values.
17+
-/
18+
19+
open Set TopologicalSpace
20+
21+
namespace RealProdLexBool
22+
23+
instance instTopologicalSpace : TopologicalSpace (ℝ ×ₗ Bool) := Preorder.topology _
24+
instance instOrderTopology : OrderTopology (ℝ ×ₗ Bool) := ⟨rfl⟩
25+
noncomputable instance instLinearOrder : LinearOrder (ℝ ×ₗ Bool) := inferInstance
26+
27+
instance instSeparableSpace : SeparableSpace (ℝ ×ₗ Bool) := by
28+
refine ⟨⟨range fun q : ℚ ↦ toLex (q, false), countable_range _, ?_⟩⟩
29+
simp only [dense_iff_inter_open, Set.Nonempty, toLex.surjective.exists]
30+
rintro U hUo ⟨⟨x, _ | _⟩, hx⟩
31+
· rcases exists_Ioc_subset_of_mem_nhds (hUo.mem_nhds hx) (exists_lt _) with ⟨y, hyx, hyU⟩
32+
rcases toLex.surjective y with ⟨y, rfl⟩
33+
have : y.1 < x := by simpa [Prod.Lex.toLex_lt_toLex, y.2.false_le.not_gt] using hyx
34+
rcases exists_rat_btwn this with ⟨q, hyq, hqx⟩
35+
refine ⟨(q, false), hyU ?_, mem_range_self _⟩
36+
simp [Prod.Lex.toLex_le_toLex, Prod.Lex.toLex_lt_toLex, hyq, hqx]
37+
· rcases exists_Ico_subset_of_mem_nhds (hUo.mem_nhds hx) (exists_gt _) with ⟨y, hyx, hyU⟩
38+
rcases toLex.surjective y with ⟨y, rfl⟩
39+
have : x < y.1 := by simpa [Prod.Lex.toLex_lt_toLex, y.2.le_true.not_gt] using hyx
40+
rcases exists_rat_btwn this with ⟨q, hyq, hqx⟩
41+
refine ⟨(q, false), hyU ?_, mem_range_self _⟩
42+
simp [Prod.Lex.toLex_le_toLex, Prod.Lex.toLex_lt_toLex, hyq, hqx]
43+
44+
theorem not_secondCountableTopology : ¬SecondCountableTopology (ℝ ×ₗ Bool) := by
45+
intro h
46+
have : {x : ℝ ×ₗ Bool | (ofLex x).2}.Countable := by
47+
simpa [Prod.Lex.covBy_iff, Bool.covBy_iff, exists_or, not_covBy, (Bool.le_true _).not_gt,
48+
(Bool.false_le _).lt_iff_ne] using countable_setOf_covBy_left (α := ℝ ×ₗ Bool)
49+
refine not_countable_univ <| (this.image fun x ↦ (ofLex x).1).mono fun x _ ↦ ?_
50+
exact ⟨toLex (x, true), rfl, rfl⟩
51+
52+
end RealProdLexBool

Mathlib/Data/Prod/Lex.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ variable [Preorder α] [Preorder β]
8484

8585
theorem monotone_fst_ofLex : Monotone fun x : α ×ₗ β ↦ (ofLex x).1 := monotone_fst
8686

87+
theorem _root_.WCovBy.fst_ofLex {a b : α ×ₗ β} (h : a ⩿ b) : (ofLex a).1 ⩿ (ofLex b).1 :=
88+
⟨monotone_fst _ _ h.1, fun c hac hcb ↦ h.2 (c := toLex (c, a.2)) (.left _ _ hac) (.left _ _ hcb)⟩
89+
8790
theorem toLex_covBy_toLex_iff {a₁ a₂ : α} {b₁ b₂ : β} :
8891
toLex (a₁, b₁) ⋖ toLex (a₂, b₂) ↔ a₁ = a₂ ∧ b₁ ⋖ b₂ ∨ a₁ ⋖ a₂ ∧ IsMax b₁ ∧ IsMin b₂ := by
8992
simp only [CovBy, toLex_lt_toLex, toLex.surjective.forall, Prod.forall, isMax_iff_forall_not_lt,

0 commit comments

Comments
 (0)