Skip to content

Commit b5226eb

Browse files
feat (Topology.IsQuotientMap) : quotient maps for Sum.map, Sigma.map, sigma of coherent subspaces
1 parent 92964bc commit b5226eb

File tree

4 files changed

+67
-1
lines changed

4 files changed

+67
-1
lines changed

Mathlib/Topology/Coherent.lean

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Authors: Yury Kudryashov
55
-/
66
import Mathlib.Topology.Defs.Sequences
77
import Mathlib.Topology.ContinuousOn
8+
import Mathlib.Topology.ContinuousMap.Basic
89

910
/-!
1011
# Topology generated by its restrictions to subsets
@@ -32,7 +33,8 @@ and provide the others as corollaries.
3233

3334
open Filter Set
3435

35-
variable {X : Type*} [TopologicalSpace X] {S : Set (Set X)} {t : Set X} {x : X}
36+
variable {X Y : Type*} [TopologicalSpace X] [TopologicalSpace Y]
37+
{S : Set (Set X)} {t : Set X} {x : X}
3638

3739
namespace Topology.IsCoherentWith
3840

@@ -90,4 +92,27 @@ lemma of_nhds (h : ∀ x, ∃ s ∈ S, s ∈ 𝓝 x) : IsCoherentWith S :=
9092
let ⟨s, hsS, hsx⟩ := h x
9193
(hf s hsS).continuousAt hsx
9294

95+
/-- If a space `X` is coherent with an indexed family of subspaces `S` whose union is `X`, then the
96+
canonical inclusion from `Σ i, S i` to `X` is a quotient map. -/
97+
lemma isQuotientMap_sigma_desc'
98+
{ι : Type*} {S : ι → Set X} (hX : IsCoherentWith (range S)) (hS : ⋃ i, S i = univ) :
99+
IsQuotientMap (ContinuousMap.sigma (fun _ ↦ ContinuousMap.subtypeVal) : C(Σ i, S i, X)) where
100+
surjective y := by
101+
rw [iUnion_eq_univ_iff] at hS
102+
obtain ⟨i, hx⟩ := hS y
103+
use Sigma.mk i ⟨y, hx⟩
104+
simp
105+
eq_coinduced := by
106+
ext t
107+
unfold instTopologicalSpaceSigma
108+
simp [hX.isOpen_iff (t := t), isOpen_coinduced, isOpen_iSup_iff, preimage_preimage]
109+
110+
/-- If a space `X` is coherent with a set of subspaces `S` whose union is `X`, then the
111+
canonical inclusion from `Σ i, S i` to `X` is a quotient map. -/
112+
lemma isQuotientMap_sigma_desc (hX : IsCoherentWith S) (hS : ⋃₀ S = univ) :
113+
IsQuotientMap (ContinuousMap.sigma (fun _ ↦ ContinuousMap.subtypeVal) : C(Σ (s : S), s, X)) :=
114+
have h : S = range Subtype.val := by simp
115+
IsCoherentWith.isQuotientMap_sigma_desc' (S := ((↑) : S → Set X))
116+
(h ▸ hX) (sUnion_eq_iUnion ▸ hS)
117+
93118
end Topology.IsCoherentWith

Mathlib/Topology/Constructions.lean

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1184,6 +1184,22 @@ lemma Topology.isOpenEmbedding_sigmaMap {f₁ : ι → κ} {f₂ : ∀ i, σ i
11841184
simp only [isOpenEmbedding_iff_isEmbedding_isOpenMap, isOpenMap_sigma_map, isEmbedding_sigmaMap h,
11851185
forall_and]
11861186

1187+
lemma Topology.IsQuotientMap.sigmaMap {f₁ : ι → κ} {f₂ : (i : ι) → σ i → τ (f₁ i)}
1188+
(h₁ : f₁.Surjective) (h₂ : ∀ i, IsQuotientMap (f₂ i)) :
1189+
IsQuotientMap (Sigma.map f₁ f₂) := by
1190+
fconstructor
1191+
· rintro ⟨k, t⟩
1192+
obtain ⟨i, rfl⟩ := h₁ k
1193+
obtain ⟨s, rfl⟩ := (h₂ i).surjective t
1194+
use ⟨i, s⟩
1195+
simp [Sigma.map]
1196+
· simp_rw [instTopologicalSpaceSigma, coinduced_iSup, coinduced_compose, Function.comp_def,
1197+
Sigma.map_mk, ← Function.comp_def, ← coinduced_compose, ← (h₂ · |>.eq_coinduced)]
1198+
conv_lhs => enter [1, k]
1199+
rw [← range_eq_univ] at h₁
1200+
rw [← iSup_univ (β := ι), ← iSup_image (g := (fun k ↦ coinduced (Sigma.mk k) _))]
1201+
simp_rw [image_univ, h₁, iSup_univ]
1202+
11871203
end Sigma
11881204

11891205
section ULift

Mathlib/Topology/Constructions/SumProd.lean

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -844,6 +844,18 @@ lemma IsClosedEmbedding.sumElim {f : X → Z} {g : Y → Z}
844844
rw [IsClosedEmbedding.isClosedEmbedding_iff_continuous_injective_isClosedMap] at hf hg ⊢
845845
exact ⟨hf.1.sumElim hg.1, h, hf.2.2.sumElim hg.2.2
846846

847+
lemma IsQuotientMap.sumMap (f : X → Y) (g : Z → W) (h₁ : IsQuotientMap f) (h₂ : IsQuotientMap g) :
848+
IsQuotientMap (Sum.map f g) := by
849+
fconstructor
850+
· rintro (x | y)
851+
· use .inl (h₁.surjective x).choose
852+
simp [h₁.surjective x |>.choose_spec]
853+
· use .inr (h₂.surjective y).choose
854+
simp [h₂.surjective y |>.choose_spec]
855+
· simp_rw [instTopologicalSpaceSum, coinduced_sup, coinduced_compose, Function.comp_def,
856+
Sum.map_inl, Sum.map_inr, ← Function.comp_def, ← coinduced_compose, h₁.eq_coinduced,
857+
h₂.eq_coinduced]
858+
847859
-- Homeomorphisms between the various constructions: sums of two homeomorphisms,
848860
-- as well as commutativity, associativity and distributivity with products.
849861
namespace Homeomorph

Mathlib/Topology/ContinuousMap/Basic.lean

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -612,6 +612,13 @@ theorem lift_comp : (hf.lift g h).comp f = g := by
612612
ext
613613
simpa using h (Function.rightInverse_surjInv _ _)
614614

615+
@[simp↓]
616+
lemma lift_comp_apply {X Y Z : Type*} [TopologicalSpace X]
617+
[TopologicalSpace Y] [TopologicalSpace Z] {f : C(X, Y)} (hf : IsQuotientMap f)
618+
(g : C(X, Z)) (hg : Function.FactorsThrough g f) (x : X) :
619+
(hf.lift g hg) (f x) = g x := by
620+
rw [← (hf.lift g hg).comp_apply, lift_comp]
621+
615622
/-- `IsQuotientMap.lift` as an equivalence. -/
616623
@[simps]
617624
noncomputable def liftEquiv : { g : C(X, Z) // Function.FactorsThrough g f} ≃ C(Y, Z) where
@@ -623,6 +630,12 @@ noncomputable def liftEquiv : { g : C(X, Z) // Function.FactorsThrough g f} ≃
623630
ext a
624631
simpa using congrArg g (Function.rightInverse_surjInv hf.surjective a)
625632

633+
/-- A version of `liftEquiv_apply` that is more convenient when rewriting. -/
634+
lemma liftEquiv_apply' {X Y Z : Type*} [TopologicalSpace X]
635+
[TopologicalSpace Y] [TopologicalSpace Z] {f : C(X, Y)} (hf : IsQuotientMap f)
636+
(g : C(X, Z)) (hg : Function.FactorsThrough g f) : hf.lift g hg = hf.liftEquiv ⟨g, hg⟩ := by
637+
rfl
638+
626639
end Topology.IsQuotientMap
627640
end Lift
628641

0 commit comments

Comments
 (0)