Skip to content

Commit dc24f22

Browse files
committed
feat(Topology/Maps): add Bourbaki strict maps (#36660)
Implements #36269.
1 parent c1755e4 commit dc24f22

File tree

3 files changed

+108
-0
lines changed

3 files changed

+108
-0
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7655,6 +7655,7 @@ public import Mathlib.Topology.Maps.OpenQuotient
76557655
public import Mathlib.Topology.Maps.Proper.Basic
76567656
public import Mathlib.Topology.Maps.Proper.CompactlyGenerated
76577657
public import Mathlib.Topology.Maps.Proper.UniversallyClosed
7658+
public import Mathlib.Topology.Maps.Strict.Basic
76587659
public import Mathlib.Topology.MetricSpace.Algebra
76597660
public import Mathlib.Topology.MetricSpace.Antilipschitz
76607661
public import Mathlib.Topology.MetricSpace.Basic

Mathlib/Topology/Homeomorph/Lemmas.lean

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,13 @@ lemma isHomeomorph_iff_isEmbedding_surjective : IsHomeomorph f ↔ IsEmbedding f
520520
mpr h := ⟨h.1.continuous, ((isOpenEmbedding_iff f).2 ⟨h.1, h.2.range_eq ▸ isOpen_univ⟩).isOpenMap,
521521
h.1.injective, h.2
522522

523+
/-- A map is a homeomorphism iff it is a quotient map and injective. -/
524+
lemma isHomeomorph_iff_isQuotientMap_injective {f : X → Y} :
525+
IsHomeomorph f ↔ IsQuotientMap f ∧ Injective f := by
526+
refine ⟨fun h ↦ ⟨h.isQuotientMap, h.injective⟩,
527+
fun h ↦ ⟨h.1.continuous, fun s hs ↦ ?_, h.2, h.1.surjective⟩⟩
528+
rwa [← h.1.isOpen_preimage, Set.preimage_image_eq _ h.2]
529+
523530
/-- A map is a homeomorphism iff it is continuous, closed and bijective. -/
524531
lemma isHomeomorph_iff_continuous_isClosedMap_bijective : IsHomeomorph f ↔
525532
Continuous f ∧ IsClosedMap f ∧ Function.Bijective f :=
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
/-
2+
Copyright (c) 2026 Ziyan Wei. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Ziyan Wei
5+
-/
6+
module
7+
8+
public import Mathlib.Topology.Maps.Basic
9+
public import Mathlib.Topology.Homeomorph.Lemmas
10+
public import Mathlib.Topology.Constructions
11+
public import Mathlib.Data.Setoid.Basic
12+
/-!
13+
# Bourbaki Strict Maps
14+
15+
This file defines Bourbaki strict maps (`Topology.IsStrictMap`) and proves some of their
16+
basic properties. ?
17+
18+
A map `f : X → Y` between topological spaces is called *strict* in the sense of Bourbaki
19+
if the natural corestriction to its image (i.e., `Set.rangeFactorization f`) is a quotient map.
20+
Equivalently, these are precisely the maps for which the first isomorphism
21+
theorem yields a homeomorphism: the canonical bijection `X ⧸ ker f ≃ range f`
22+
is a homeomorphism if and only if `f` is strict. This provides a natural
23+
generalization of quotient maps to non-surjective maps.
24+
25+
Many important classes of maps are automatically continuous strict maps, including:
26+
- continuous open maps (`IsOpenMap.isStrictMap`);
27+
- continuous closed maps (`IsClosedMap.isStrictMap`).
28+
29+
## Equivalent characterizations
30+
31+
We provide several equivalent ways to characterize a strict map `f`:
32+
* `Topology.isStrictMap_iff_isHomeomorph_quotientKerEquivRange`: `f` is strict if and only if
33+
the canonical bijection `Quotient (Setoid.ker f) ≃ Set.range f` is a homeomorphism.
34+
* `Topology.isStrictMap_iff_isEmbedding_kerLift`: `f` is strict if and only if
35+
the canonical injection `Quotient (Setoid.ker f) → Y` (`Setoid.kerLift f`) is an embedding.
36+
-/
37+
38+
@[expose] public section
39+
40+
open Function Set Topology
41+
42+
namespace Topology
43+
44+
variable {X Y : Type*} [TopologicalSpace X] [TopologicalSpace Y] (f : X → Y)
45+
46+
/-- A map is a strict map in the sense of Bourbaki if the natural map to its image
47+
is a quotient map. -/
48+
def IsStrictMap : Prop :=
49+
IsQuotientMap (Set.rangeFactorization f)
50+
51+
lemma isStrictMap_iff_isQuotientMap_rangeFactorization :
52+
IsStrictMap f ↔ IsQuotientMap (Set.rangeFactorization f) :=
53+
Iff.rfl
54+
55+
variable {f}
56+
57+
/-- A map is a strict map if and only if the canonical bijection
58+
`Quotient (Setoid.ker f) ≃ Set.range f` is a homeomorphism. -/
59+
theorem isStrictMap_iff_isHomeomorph_quotientKerEquivRange :
60+
IsStrictMap f ↔
61+
IsHomeomorph (Setoid.quotientKerEquivRange f : Quotient (Setoid.ker f) → Set.range f) := by
62+
simp only [IsStrictMap, isHomeomorph_iff_isQuotientMap_injective, Equiv.injective, and_true]
63+
exact ⟨fun h => IsQuotientMap.of_comp_isQuotientMap isQuotientMap_quotient_mk' h,
64+
fun h ↦ h.comp isQuotientMap_quotient_mk'⟩
65+
66+
/-- The homeomorphism `Quotient (Setoid.ker f) ≃ₜ Set.range f` given by a strict map `f`.
67+
This is the homeomorphism obtained from the first isomorphism theorem. -/
68+
noncomputable def Homeomorph.quotientKerEquivRange (hf : IsStrictMap f) :
69+
Quotient (Setoid.ker f) ≃ₜ Set.range f :=
70+
(isStrictMap_iff_isHomeomorph_quotientKerEquivRange.mp hf).homeomorph
71+
72+
/-- A map is a strict map if and only if the canonical injection `Quotient (Setoid.ker f) → Y`
73+
(`Setoid.kerLift f`) is an embedding. -/
74+
theorem isStrictMap_iff_isEmbedding_kerLift :
75+
IsStrictMap f ↔ IsEmbedding (Setoid.kerLift f) := by
76+
simp only [isStrictMap_iff_isHomeomorph_quotientKerEquivRange,
77+
isHomeomorph_iff_isEmbedding_surjective, Equiv.surjective, and_true]
78+
exact (IsEmbedding.of_comp_iff .subtypeVal).symm
79+
80+
/-- A strict map is continuous, since the range factorization is continuous. -/
81+
lemma IsStrictMap.continuous {f : X → Y} (hf : IsStrictMap f) : Continuous f := by
82+
rw [isStrictMap_iff_isQuotientMap_rangeFactorization] at hf
83+
exact continuous_rangeFactorization_iff.mp hf.continuous
84+
85+
/-- A open continuous map is a strict map. -/
86+
lemma IsOpenMap.isStrictMap (ho : IsOpenMap f) (h_cont : Continuous f) :
87+
IsStrictMap f := by
88+
rw [isStrictMap_iff_isQuotientMap_rangeFactorization]
89+
exact (ho.subtype_mk fun x => ⟨x, rfl⟩).isQuotientMap
90+
h_cont.rangeFactorization Set.rangeFactorization_surjective
91+
92+
/-- A closed continuous map is a strict map. -/
93+
lemma IsClosedMap.isStrictMap (hc : IsClosedMap f) (h_cont : Continuous f) :
94+
IsStrictMap f := by
95+
rw [isStrictMap_iff_isQuotientMap_rangeFactorization]
96+
exact (hc.subtype_mk fun x => ⟨x, rfl⟩).isQuotientMap
97+
h_cont.rangeFactorization Set.rangeFactorization_surjective
98+
99+
100+
end Topology

0 commit comments

Comments
 (0)