Skip to content

Commit e3960f5

Browse files
committed
feat(Topology): test strictness on quotient and subspaces (#39210)
1 parent a0185a6 commit e3960f5

3 files changed

Lines changed: 66 additions & 6 deletions

File tree

Mathlib/Topology/Connected/TotallyDisconnected.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ theorem Continuous.connectedComponentsMap_continuous {β : Type*} [TopologicalSp
306306
lemma Topology.IsCoinducing.connectedComponentsMap {β : Type*} [TopologicalSpace β] {f : α → β}
307307
(hf : IsCoinducing f) :
308308
IsCoinducing hf.continuous.connectedComponentsMap := by
309-
rw [← ConnectedComponents.isQuotientMap_coe.of_comp_iff]
309+
rw [← ConnectedComponents.isQuotientMap_coe.isCoinducing.of_comp_iff]
310310
exact ConnectedComponents.isQuotientMap_coe.isCoinducing.comp hf
311311

312312
@[simp]

Mathlib/Topology/Maps/Basic.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,10 @@ theorem of_comp_of_isCoinducing (hgf : IsQuotientMap (g ∘ f)) (hf : IsCoinduci
328328
@[deprecated (since := "2026-03-21")]
329329
alias of_comp_of_eq_coinduced := of_comp_of_isCoinducing
330330

331+
protected theorem of_comp_iff (hf : IsQuotientMap f) :
332+
IsQuotientMap (g ∘ f) ↔ IsQuotientMap g := by
333+
rw [isQuotientMap_iff, isQuotientMap_iff, hf.isCoinducing.of_comp_iff, hf.surjective.of_comp_iff]
334+
331335
theorem of_comp_isQuotientMap (hf : IsQuotientMap f) (hgf : IsQuotientMap (g ∘ f)) :
332336
IsQuotientMap g := of_comp_of_isCoinducing hgf hf.isCoinducing
333337

Mathlib/Topology/Maps/Strict/Basic.lean

Lines changed: 61 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
/-
22
Copyright (c) 2026 Ziyan Wei. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
4-
Authors: Ziyan Wei
4+
Authors: Ziyan Wei, Anatole Dedecker
55
-/
66
module
77

88
public import Mathlib.Topology.Maps.Basic
9-
public import Mathlib.Topology.Homeomorph.Lemmas
9+
public import Mathlib.Topology.Homeomorph.Quotient
1010
public import Mathlib.Topology.Constructions
1111
public import Mathlib.Data.Setoid.Basic
1212
/-!
1313
# Bourbaki Strict Maps
1414
1515
This file defines Bourbaki strict maps (`Topology.IsStrictMap`) and proves some of their
16-
basic properties. ?
16+
basic properties.
1717
1818
A map `f : X → Y` between topological spaces is called *strict* in the sense of Bourbaki
1919
if the natural corestriction to its image (i.e., `Set.rangeFactorization f`) is a quotient map.
@@ -37,11 +37,12 @@ We provide several equivalent ways to characterize a strict map `f`:
3737

3838
@[expose] public section
3939

40-
open Function Set Topology
40+
open Function Set Topology Setoid
4141

4242
namespace Topology
4343

44-
variable {X Y : Type*} [TopologicalSpace X] [TopologicalSpace Y] (f : X → Y)
44+
variable {X Y Z : Type*} [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z]
45+
(f : X → Y) {g : Y → Z}
4546

4647
/-- A map is a strict map in the sense of Bourbaki if the natural map to its image
4748
is a quotient map. -/
@@ -96,5 +97,60 @@ lemma IsClosedMap.isStrictMap (hc : IsClosedMap f) (h_cont : Continuous f) :
9697
exact (hc.subtype_mk fun x => ⟨x, rfl⟩).isQuotientMap
9798
h_cont.rangeFactorization Set.rangeFactorization_surjective
9899

100+
/-- A homeomorphism is a strict map. -/
101+
lemma IsHomeomorph.isStrictMap (f_homeo : IsHomeomorph f) :
102+
IsStrictMap f :=
103+
f_homeo.isOpenMap.isStrictMap f_homeo.continuous
104+
105+
/-- The identity is a strict map. -/
106+
lemma IsStrictMap.id : IsStrictMap (id : X → X) := IsHomeomorph.id.isStrictMap
107+
108+
/-- Assume that `f : X → Y` is a quotient map. Then `g : Y → Z` is strict
109+
if and only if `g ∘ f` is strict. -/
110+
lemma IsQuotientMap.isStrictMap_iff (f_quot : IsQuotientMap f) :
111+
IsStrictMap g ↔ IsStrictMap (g ∘ f) := by
112+
set Φ : range (g ∘ f) ≃ₜ range g := .setCongr <| f_quot.surjective.range_comp g
113+
have key : rangeFactorization g ∘ f = Φ ∘ rangeFactorization (g ∘ f) := rfl
114+
simp_rw [isStrictMap_iff_isQuotientMap_rangeFactorization, ← f_quot.of_comp_iff, key]
115+
exact ⟨fun H ↦ by simpa using Φ.symm.isQuotientMap.comp H, fun H ↦ Φ.isQuotientMap.comp H⟩
116+
117+
/-- A quotient map is strict. See also `isQuotientMap_iff_isStrictMap_surjective`. -/
118+
lemma IsQuotientMap.isStrictMap (f_quot : IsQuotientMap f) :
119+
IsStrictMap f :=
120+
f_quot.isStrictMap_iff.mp .id
121+
122+
/-- Assume that `g : Y → Z` is an embedding. Then `f : X → Y` is strict
123+
if and only if `g ∘ f` is strict. -/
124+
lemma IsEmbedding.isStrictMap_iff (g_emb : IsEmbedding g) :
125+
IsStrictMap f ↔ IsStrictMap (g ∘ f) := by
126+
set Φ : Quotient (Setoid.ker (g ∘ f)) ≃ₜ Quotient (Setoid.ker (f)) :=
127+
Homeomorph.Quotient.congrRight (fun _ _ ↦ by simp [g_emb.injective.eq_iff])
128+
have key : g ∘ kerLift f ∘ Φ = kerLift (g ∘ f) :=
129+
funext <| Quotient.ind fun _ ↦ rfl
130+
simp_rw [isStrictMap_iff_isEmbedding_kerLift, ← g_emb.of_comp_iff, ← key]
131+
exact ⟨fun H ↦ H.comp Φ.isEmbedding,
132+
fun H ↦ by simpa [comp_assoc] using H.comp Φ.symm.isEmbedding⟩
133+
134+
/-- An embedding is strict. See also `isEmbedding_iff_isStrictMap_injective`. -/
135+
lemma IsEmbedding.isStrictMap (f_emb : IsEmbedding f) :
136+
IsStrictMap f :=
137+
f_emb.isStrictMap_iff.mp .id
138+
139+
/-- Quotient maps are precisely surjective strict maps. -/
140+
lemma isQuotientMap_iff_isStrictMap_surjective :
141+
IsQuotientMap f ↔ IsStrictMap f ∧ Surjective f := by
142+
refine ⟨fun H ↦ ⟨H.isStrictMap, H.surjective⟩, fun ⟨f_strict, f_surj⟩ ↦ ?_⟩
143+
rw [isStrictMap_iff_isQuotientMap_rangeFactorization] at f_strict
144+
set Φ : range f ≃ₜ Y := .trans (.setCongr f_surj.range_eq) (Homeomorph.Set.univ Y)
145+
exact Φ.isQuotientMap.comp f_strict
146+
147+
/-- Embeddings are precisely injective strict maps. -/
148+
lemma isEmbedding_iff_isStrictMap_injective :
149+
IsEmbedding f ↔ IsStrictMap f ∧ Injective f := by
150+
refine ⟨fun H ↦ ⟨H.isStrictMap, H.injective⟩, fun ⟨f_strict, f_inj⟩ ↦ ?_⟩
151+
rw [isStrictMap_iff_isEmbedding_kerLift] at f_strict
152+
set Φ : Quotient (ker f) ≃ₜ X :=
153+
(Homeomorph.Quotient.congrRight <| by simp [f_inj.eq_iff]).trans Homeomorph.quotientBot
154+
exact f_strict.comp Φ.symm.isEmbedding
99155

100156
end Topology

0 commit comments

Comments
 (0)