Skip to content

Commit e58fb43

Browse files
committed
feat(Topology/Group): drop an unneeded assumption (#16551)
- prove that the quotient map `G → G ⧸ N` is an open quotient map; - use recently added lemmas to drop a `[LocallyCompactSpace G]` assumption in `QuotientGroup.continuousSMul` (now called `QuotientGroup.instContinuousSMul`).
1 parent fa42460 commit e58fb43

File tree

8 files changed

+74
-85
lines changed

8 files changed

+74
-85
lines changed

Mathlib/MeasureTheory/Measure/Haar/Quotient.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ theorem MeasureTheory.QuotientMeasureEqMeasurePreimage.haarMeasure_quotient [Loc
223223
[IsFiniteMeasure μ] : IsHaarMeasure μ := by
224224
obtain ⟨K⟩ := PositiveCompacts.nonempty' (α := G)
225225
let K' : PositiveCompacts (G ⧸ Γ) :=
226-
K.map π continuous_coinduced_rng (QuotientGroup.isOpenMap_coe Γ)
226+
K.map π QuotientGroup.continuous_mk QuotientGroup.isOpenMap_coe
227227
haveI : IsMulLeftInvariant μ :=
228228
MeasureTheory.QuotientMeasureEqMeasurePreimage.mulInvariantMeasure_quotient ν
229229
rw [haarMeasure_unique μ K']

Mathlib/Topology/Algebra/ConstMulAction.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,11 @@ theorem isOpenMap_quotient_mk'_mul [ContinuousConstSMul Γ T] :
451451
rw [isOpen_coinduced, MulAction.quotient_preimage_image_eq_union_mul U]
452452
exact isOpen_iUnion fun γ => isOpenMap_smul γ U hU
453453

454+
@[to_additive]
455+
theorem MulAction.isOpenQuotientMap_quotientMk [ContinuousConstSMul Γ T] :
456+
IsOpenQuotientMap (Quotient.mk (MulAction.orbitRel Γ T)) :=
457+
⟨surjective_quot_mk _, continuous_quot_mk, isOpenMap_quotient_mk'_mul⟩
458+
454459
/-- The quotient by a discontinuous group action of a locally compact t2 space is t2. -/
455460
@[to_additive "The quotient by a discontinuous group action of a locally compact t2
456461
space is t2."]

Mathlib/Topology/Algebra/Group/Basic.lean

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import Mathlib.GroupTheory.GroupAction.ConjAct
77
import Mathlib.GroupTheory.GroupAction.Quotient
88
import Mathlib.Topology.Algebra.Monoid
99
import Mathlib.Topology.Algebra.Constructions
10+
import Mathlib.Topology.Maps.OpenQuotient
1011
import Mathlib.Algebra.Order.Archimedean.Basic
1112
import Mathlib.GroupTheory.QuotientGroup.Basic
1213

@@ -862,44 +863,43 @@ instance [CompactSpace G] (N : Subgroup G) : CompactSpace (G ⧸ N) :=
862863
theorem quotientMap_mk (N : Subgroup G) : QuotientMap (mk : G → G ⧸ N) :=
863864
quotientMap_quot_mk
864865

865-
variable [TopologicalGroup G] (N : Subgroup G)
866+
@[to_additive]
867+
theorem continuous_mk {N : Subgroup G} : Continuous (mk : G → G ⧸ N) :=
868+
continuous_quot_mk
869+
870+
section ContinuousMul
871+
872+
variable [ContinuousMul G] {N : Subgroup G}
873+
874+
@[to_additive]
875+
theorem isOpenMap_coe : IsOpenMap ((↑) : G → G ⧸ N) := isOpenMap_quotient_mk'_mul
866876

867877
@[to_additive]
868-
theorem isOpenMap_coe : IsOpenMap ((↑) : G → G ⧸ N) :=
869-
isOpenMap_quotient_mk'_mul
878+
theorem isOpenQuotientMap_mk : IsOpenQuotientMap (mk : G → G ⧸ N) :=
879+
MulAction.isOpenQuotientMap_quotientMk
870880

871881
@[to_additive (attr := simp)]
872882
theorem dense_preimage_mk {s : Set (G ⧸ N)} : Dense ((↑) ⁻¹' s : Set G) ↔ Dense s :=
873-
letI := leftRel N -- `Dense.quotient` assumes `[Setoid G]`
874-
fun h ↦ h.quotient.mono <| image_preimage_subset _ _, fun h ↦ h.preimage <| isOpenMap_coe _⟩
883+
isOpenQuotientMap_mk.dense_preimage_iff
875884

876885
@[to_additive]
877886
theorem dense_image_mk {s : Set G} :
878887
Dense (mk '' s : Set (G ⧸ N)) ↔ Dense (s * (N : Set G)) := by
879888
rw [← dense_preimage_mk, preimage_image_mk_eq_mul]
880889

881890
@[to_additive]
882-
instance instTopologicalGroup [N.Normal] : TopologicalGroup (G ⧸ N) where
883-
continuous_mul := by
884-
have cont : Continuous (((↑) : G → G ⧸ N) ∘ fun p : G × G ↦ p.fst * p.snd) :=
885-
continuous_quot_mk.comp continuous_mul
886-
have quot : QuotientMap fun p : G × G ↦ ((p.1 : G ⧸ N), (p.2 : G ⧸ N)) := by
887-
apply IsOpenMap.to_quotientMap
888-
· exact (QuotientGroup.isOpenMap_coe N).prod (QuotientGroup.isOpenMap_coe N)
889-
· exact continuous_quot_mk.prod_map continuous_quot_mk
890-
· exact (surjective_quot_mk _).prodMap (surjective_quot_mk _)
891-
exact quot.continuous_iff.2 cont
892-
continuous_inv := continuous_inv.quotient_map' _
891+
instance instContinuousSMul : ContinuousSMul G (G ⧸ N) where
892+
continuous_smul := by
893+
rw [← (IsOpenQuotientMap.id.prodMap isOpenQuotientMap_mk).continuous_comp_iff]
894+
exact continuous_mk.comp continuous_mul
893895

894-
@[to_additive (attr := deprecated (since := "2024-08-05"))]
895-
theorem _root_.topologicalGroup_quotient [N.Normal] : TopologicalGroup (G ⧸ N) :=
896-
instTopologicalGroup N
896+
variable (N)
897897

898898
/-- Neighborhoods in the quotient are precisely the map of neighborhoods in the prequotient. -/
899899
@[to_additive
900900
"Neighborhoods in the quotient are precisely the map of neighborhoods in the prequotient."]
901901
theorem nhds_eq (x : G) : 𝓝 (x : G ⧸ N) = Filter.map (↑) (𝓝 x) :=
902-
le_antisymm ((QuotientGroup.isOpenMap_coe N).nhds_le x) continuous_quot_mk.continuousAt
902+
(isOpenQuotientMap_mk.map_nhds_eq _).symm
903903

904904
@[to_additive]
905905
instance instFirstCountableTopology [FirstCountableTopology G] :
@@ -911,6 +911,21 @@ theorem nhds_one_isCountablyGenerated [FirstCountableTopology G] [N.Normal] :
911911
(𝓝 (1 : G ⧸ N)).IsCountablyGenerated :=
912912
inferInstance
913913

914+
end ContinuousMul
915+
916+
variable [TopologicalGroup G] (N : Subgroup G)
917+
918+
@[to_additive]
919+
instance instTopologicalGroup [N.Normal] : TopologicalGroup (G ⧸ N) where
920+
continuous_mul := by
921+
rw [← (isOpenQuotientMap_mk.prodMap isOpenQuotientMap_mk).continuous_comp_iff]
922+
exact continuous_mk.comp continuous_mul
923+
continuous_inv := continuous_inv.quotient_map' _
924+
925+
@[to_additive (attr := deprecated (since := "2024-08-05"))]
926+
theorem _root_.topologicalGroup_quotient [N.Normal] : TopologicalGroup (G ⧸ N) :=
927+
instTopologicalGroup N
928+
914929
end QuotientGroup
915930

916931
/-- A typeclass saying that `p : G × G ↦ p.1 - p.2` is a continuous function. This property
@@ -1612,7 +1627,7 @@ instance [LocallyCompactSpace G] (N : Subgroup G) : LocallyCompactSpace (G ⧸ N
16121627
obtain ⟨y, rfl⟩ : ∃ y, π y = x := Quot.exists_rep x
16131628
have : π ⁻¹' n ∈ 𝓝 y := preimage_nhds_coinduced hn
16141629
rcases local_compact_nhds this with ⟨s, s_mem, hs, s_comp⟩
1615-
exact ⟨π '' s, (QuotientGroup.isOpenMap_coe N).image_mem_nhds s_mem, mapsTo'.mp hs,
1630+
exact ⟨π '' s, QuotientGroup.isOpenMap_coe.image_mem_nhds s_mem, mapsTo'.mp hs,
16161631
s_comp.image C⟩
16171632

16181633
end

Mathlib/Topology/Algebra/Group/Compact.lean

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,18 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Johannes Hölzl, Mario Carneiro, Patrick Massot
55
-/
66
import Mathlib.Topology.Algebra.Group.Basic
7-
import Mathlib.Topology.CompactOpen
87
import Mathlib.Topology.Sets.Compacts
98

109
/-!
1110
# Additional results on topological groups
1211
13-
Two results on topological groups that have been separated out as they require more substantial
14-
imports developing either positive compacts or the compact open topology.
15-
12+
A result on topological groups that has been separated out
13+
as it requires more substantial imports developing positive compacts.
1614
-/
1715

18-
universe u v w x
19-
20-
variable {α : Type u} {β : Type v} {G : Type w} {H : Type x}
2116

22-
section
23-
24-
variable [TopologicalSpace G] [Group G] [TopologicalGroup G]
17+
universe u
18+
variable {G : Type u} [TopologicalSpace G] [Group G] [TopologicalGroup G]
2519

2620
/-- Every topological group in which there exists a compact set with nonempty interior
2721
is locally compact. -/
@@ -32,21 +26,3 @@ theorem TopologicalSpace.PositiveCompacts.locallyCompactSpace_of_group
3226
(K : PositiveCompacts G) : LocallyCompactSpace G :=
3327
let ⟨_x, hx⟩ := K.interior_nonempty
3428
K.isCompact.locallyCompactSpace_of_mem_nhds_of_group (mem_interior_iff_mem_nhds.1 hx)
35-
36-
end
37-
38-
section Quotient
39-
40-
variable [Group G] [TopologicalSpace G] [TopologicalGroup G] {Γ : Subgroup G}
41-
42-
@[to_additive]
43-
instance QuotientGroup.continuousSMul [LocallyCompactSpace G] : ContinuousSMul G (G ⧸ Γ) where
44-
continuous_smul := by
45-
let F : G × G ⧸ Γ → G ⧸ Γ := fun p => p.1 • p.2
46-
change Continuous F
47-
have H : Continuous (F ∘ fun p : G × G => (p.1, QuotientGroup.mk p.2)) := by
48-
change Continuous fun p : G × G => QuotientGroup.mk (p.1 * p.2)
49-
exact continuous_coinduced_rng.comp continuous_mul
50-
exact QuotientMap.continuous_lift_prod_right quotientMap_quotient_mk' H
51-
52-
end Quotient

Mathlib/Topology/Algebra/Module/Basic.lean

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2375,21 +2375,20 @@ variable {R M : Type*} [Ring R] [AddCommGroup M] [Module R M] [TopologicalSpace
23752375
instance _root_.QuotientModule.Quotient.topologicalSpace : TopologicalSpace (M ⧸ S) :=
23762376
inferInstanceAs (TopologicalSpace (Quotient S.quotientRel))
23772377

2378-
theorem isOpenMap_mkQ [TopologicalAddGroup M] : IsOpenMap S.mkQ :=
2379-
QuotientAddGroup.isOpenMap_coe S.toAddSubgroup
2378+
theorem isOpenMap_mkQ [ContinuousAdd M] : IsOpenMap S.mkQ :=
2379+
QuotientAddGroup.isOpenMap_coe
2380+
2381+
theorem isOpenQuotientMap_mkQ [ContinuousAdd M] : IsOpenQuotientMap S.mkQ :=
2382+
QuotientAddGroup.isOpenQuotientMap_mk
23802383

23812384
instance topologicalAddGroup_quotient [TopologicalAddGroup M] : TopologicalAddGroup (M ⧸ S) :=
23822385
inferInstanceAs <| TopologicalAddGroup (M ⧸ S.toAddSubgroup)
23832386

23842387
instance continuousSMul_quotient [TopologicalSpace R] [TopologicalAddGroup M] [ContinuousSMul R M] :
2385-
ContinuousSMul R (M ⧸ S) := by
2386-
constructor
2387-
have quot : QuotientMap fun au : R × M => (au.1, S.mkQ au.2) :=
2388-
IsOpenMap.to_quotientMap (IsOpenMap.id.prod S.isOpenMap_mkQ)
2389-
(continuous_id.prod_map continuous_quot_mk)
2390-
(Function.surjective_id.prodMap <| surjective_quot_mk _)
2391-
rw [quot.continuous_iff]
2392-
exact continuous_quot_mk.comp continuous_smul
2388+
ContinuousSMul R (M ⧸ S) where
2389+
continuous_smul := by
2390+
rw [← (IsOpenQuotientMap.id.prodMap S.isOpenQuotientMap_mkQ).continuous_comp_iff]
2391+
exact continuous_quot_mk.comp continuous_smul
23932392

23942393
instance t3_quotient_of_isClosed [TopologicalAddGroup M] [IsClosed (S : Set M)] :
23952394
T3Space (M ⧸ S) :=

Mathlib/Topology/Algebra/ProperAction.lean

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,9 @@ theorem t2Space_quotient_mulAction_of_properSMul [ProperSMul G X] :
129129
rw [t2_iff_isClosed_diagonal]
130130
set R := MulAction.orbitRel G X
131131
let π : X → Quotient R := Quotient.mk'
132-
have : QuotientMap (Prod.map π π) :=
133-
(isOpenMap_quotient_mk'_mul.prod isOpenMap_quotient_mk'_mul).to_quotientMap
134-
(continuous_quotient_mk'.prod_map continuous_quotient_mk')
135-
((surjective_quotient_mk' _).prodMap (surjective_quotient_mk' _))
136-
rw [← this.isClosed_preimage]
132+
have : IsOpenQuotientMap (Prod.map π π) :=
133+
MulAction.isOpenQuotientMap_quotientMk.prodMap MulAction.isOpenQuotientMap_quotientMk
134+
rw [← this.quotientMap.isClosed_preimage]
137135
convert ProperSMul.isProperMap_smul_pair.isClosedMap.isClosed_range
138136
· ext ⟨x₁, x₂⟩
139137
simp only [mem_preimage, map_apply, mem_diagonal_iff, mem_range, Prod.mk.injEq, Prod.exists,

Mathlib/Topology/Algebra/Ring/Ideal.lean

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -51,26 +51,18 @@ instance topologicalRingQuotientTopology : TopologicalSpace (R ⧸ N) :=
5151
-- note for the reader: in the following, `mk` is `Ideal.Quotient.mk`, the canonical map `R → R/I`.
5252
variable [TopologicalRing R]
5353

54-
theorem QuotientRing.isOpenMap_coe : IsOpenMap (mk N) := by
55-
intro s s_op
56-
change IsOpen (mk N ⁻¹' (mk N '' s))
57-
rw [quotient_ring_saturate]
58-
exact isOpen_iUnion fun ⟨n, _⟩ => isOpenMap_add_left n s s_op
54+
theorem QuotientRing.isOpenMap_coe : IsOpenMap (mk N) :=
55+
QuotientAddGroup.isOpenMap_coe
56+
57+
theorem QuotientRing.isOpenQuotientMap_mk : IsOpenQuotientMap (mk N) :=
58+
QuotientAddGroup.isOpenQuotientMap_mk
5959

6060
theorem QuotientRing.quotientMap_coe_coe : QuotientMap fun p : R × R => (mk N p.1, mk N p.2) :=
61-
IsOpenMap.to_quotientMap ((QuotientRing.isOpenMap_coe N).prod (QuotientRing.isOpenMap_coe N))
62-
((continuous_quot_mk.comp continuous_fst).prod_mk (continuous_quot_mk.comp continuous_snd))
63-
(by rintro ⟨⟨x⟩, ⟨y⟩⟩; exact ⟨(x, y), rfl⟩)
64-
65-
instance topologicalRing_quotient : TopologicalRing (R ⧸ N) :=
66-
TopologicalSemiring.toTopologicalRing
67-
{ continuous_add :=
68-
have cont : Continuous (mk N ∘ fun p : R × R => p.fst + p.snd) :=
69-
continuous_quot_mk.comp continuous_add
70-
(QuotientMap.continuous_iff (QuotientRing.quotientMap_coe_coe N)).mpr cont
71-
continuous_mul :=
72-
have cont : Continuous (mk N ∘ fun p : R × R => p.fst * p.snd) :=
73-
continuous_quot_mk.comp continuous_mul
74-
(QuotientMap.continuous_iff (QuotientRing.quotientMap_coe_coe N)).mpr cont }
61+
((isOpenQuotientMap_mk N).prodMap (isOpenQuotientMap_mk N)).quotientMap
62+
63+
instance topologicalRing_quotient : TopologicalRing (R ⧸ N) where
64+
__ := QuotientAddGroup.instTopologicalAddGroup _
65+
continuous_mul := (QuotientRing.quotientMap_coe_coe N).continuous_iff.2 <|
66+
continuous_quot_mk.comp continuous_mul
7567

7668
end CommRing

Mathlib/Topology/Maps/OpenQuotient.lean

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ Contrary to general quotient maps,
2222
the category of open quotient maps is closed under `Prod.map`.
2323
-/
2424

25-
open Function Filter
25+
open Function Set Filter
2626
open scoped Topology
2727

2828
variable {X Y Z : Type*} [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z] {f : X → Y}
@@ -57,4 +57,8 @@ theorem continuousAt_comp_iff (h : IsOpenQuotientMap f) {g : Y → Z} {x : X} :
5757
ContinuousAt (g ∘ f) x ↔ ContinuousAt g (f x) := by
5858
simp only [ContinuousAt, ← h.map_nhds_eq, tendsto_map'_iff, comp_def]
5959

60+
theorem dense_preimage_iff (h : IsOpenQuotientMap f) {s : Set Y} : Dense (f ⁻¹' s) ↔ Dense s :=
61+
fun hs ↦ h.surjective.denseRange.dense_of_mapsTo h.continuous hs (mapsTo_preimage _ _),
62+
fun hs ↦ hs.preimage h.isOpenMap⟩
63+
6064
end IsOpenQuotientMap

0 commit comments

Comments
 (0)