|
| 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