Full source
/-- Used to prove that a regular topological space with Lindelöf topology is a normal space,
and a perfectly normal space is a completely normal space. -/
theorem hasSeparatingCovers_iff_separatedNhds {s t : Set X} :
HasSeparatingCoverHasSeparatingCover s t ∧ HasSeparatingCover t sHasSeparatingCover s t ∧ HasSeparatingCover t s ↔ SeparatedNhds s t := by
constructor
· rintro ⟨⟨u, u_cov, u_props⟩, ⟨v, v_cov, v_props⟩⟩
have open_lemma : ∀ (u₀ a : ℕ → Set X), (∀ n, IsOpen (u₀ n)) →
IsOpen (⋃ n, u₀ n \ closure (a n)) := fun _ _ u₀i_open ↦
isOpen_iUnion fun i ↦ (u₀i_open i).sdiff isClosed_closure
have cover_lemma : ∀ (h₀ : Set X) (u₀ v₀ : ℕ → Set X),
(h₀ ⊆ ⋃ n, u₀ n) → (∀ n, Disjoint (closure (v₀ n)) h₀) →
(h₀ ⊆ ⋃ n, u₀ n \ closure (⋃ m ≤ n, v₀ m)) :=
fun h₀ u₀ v₀ h₀_cov dis x xinh ↦ by
rcases h₀_cov xinh with ⟨un , ⟨n, rfl⟩ , xinun⟩
simp only [mem_iUnion]
refine ⟨n, xinun, ?_⟩
simp_all only [closure_iUnion₂_le_nat, disjoint_right, mem_setOf_eq, mem_iUnion,
exists_false, exists_const, not_false_eq_true]
refine
⟨⋃ n : ℕ, u n \ (closure (⋃ m ≤ n, v m)),
⋃ n : ℕ, v n \ (closure (⋃ m ≤ n, u m)),
open_lemma u (fun n ↦ ⋃ m ≤ n, v m) (fun n ↦ (u_props n).1),
open_lemma v (fun n ↦ ⋃ m ≤ n, u m) (fun n ↦ (v_props n).1),
cover_lemma s u v u_cov (fun n ↦ (v_props n).2),
cover_lemma t v u v_cov (fun n ↦ (u_props n).2),
?_⟩
rw [Set.disjoint_left]
rintro x ⟨un, ⟨n, rfl⟩, xinun⟩
suffices ∀ (m : ℕ), x ∈ v m → x ∈ closure (⋃ m' ∈ {m' | m' ≤ m}, u m') by simpa
intro m xinvm
have n_le_m : n ≤ m := by
by_contra m_gt_n
exact xinun.2 (subset_closure (mem_biUnion (le_of_lt (not_le.mp m_gt_n)) xinvm))
exact subset_closure (mem_biUnion n_le_m xinun.1)
· rintro ⟨U, V, U_open, V_open, h_sub_U, k_sub_V, UV_dis⟩
exact
⟨⟨fun _ ↦ U,
h_sub_U.trans (iUnion_const U).symm.subset,
fun _ ↦
⟨U_open, disjoint_of_subset (fun ⦃a⦄ a ↦ a) k_sub_V (UV_dis.closure_left V_open)⟩⟩,
⟨fun _ ↦ V,
k_sub_V.trans (iUnion_const V).symm.subset,
fun _ ↦
⟨V_open, disjoint_of_subset (fun ⦃a⦄ a ↦ a) h_sub_U (UV_dis.closure_right U_open).symm⟩⟩⟩