Skip to content

Commit ed50fee

Browse files
committed
feat: miscellaneous lemmas about local homeomorphisms (#7655)
Co-authored-by: Junyan Xu <junyanxu.math@gmail.com>
1 parent dac8099 commit ed50fee

File tree

2 files changed

+97
-16
lines changed

2 files changed

+97
-16
lines changed

Mathlib/Topology/IsLocallyHomeomorph.lean

Lines changed: 87 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,21 @@ def IsLocallyHomeomorphOn :=
3434
∀ x ∈ s, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ f = e
3535
#align is_locally_homeomorph_on IsLocallyHomeomorphOn
3636

37+
theorem isLocallyHomeomorphOn_iff_openEmbedding_restrict {f : X → Y} :
38+
IsLocallyHomeomorphOn f s ↔ ∀ x ∈ s, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f) := by
39+
refine ⟨fun h x hx ↦ ?_, fun h x hx ↦ ?_⟩
40+
· obtain ⟨e, hxe, rfl⟩ := h x hx
41+
exact ⟨e.source, e.open_source.mem_nhds hxe, e.openEmbedding_restrict⟩
42+
· obtain ⟨U, hU, emb⟩ := h x hx
43+
have : OpenEmbedding ((interior U).restrict f)
44+
· refine emb.comp ⟨embedding_inclusion interior_subset, ?_⟩
45+
rw [Set.range_inclusion]; exact isOpen_induced isOpen_interior
46+
obtain ⟨cont, inj, openMap⟩ := openEmbedding_iff_continuous_injective_open.mp this
47+
haveI : Nonempty X := ⟨x⟩
48+
exact ⟨LocalHomeomorph.ofContinuousOpenRestrict (Set.injOn_iff_injective.mpr inj).toLocalEquiv
49+
(continuousOn_iff_continuous_restrict.mpr cont) openMap isOpen_interior,
50+
mem_interior_iff_mem_nhds.mpr hU, rfl⟩
51+
3752
namespace IsLocallyHomeomorphOn
3853

3954
/-- Proves that `f` satisfies `IsLocallyHomeomorphOn f s`. The condition `h` is weaker than the
@@ -55,6 +70,31 @@ theorem mk (h : ∀ x ∈ s, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ ∀
5570

5671
variable {g f s t}
5772

73+
theorem mono {t : Set X} (hf : IsLocallyHomeomorphOn f t) (hst : s ⊆ t) :
74+
IsLocallyHomeomorphOn f s := fun x hx ↦ hf x (hst hx)
75+
76+
theorem of_comp_left (hgf : IsLocallyHomeomorphOn (g ∘ f) s) (hg : IsLocallyHomeomorphOn g (f '' s))
77+
(cont : ∀ x ∈ s, ContinuousAt f x) : IsLocallyHomeomorphOn f s := mk f s fun x hx ↦ by
78+
obtain ⟨g, hxg, rfl⟩ := hg (f x) ⟨x, hx, rfl⟩
79+
obtain ⟨gf, hgf, he⟩ := hgf x hx
80+
refine ⟨(gf.restr <| f ⁻¹' g.source).trans g.symm, ⟨⟨hgf, mem_interior_iff_mem_nhds.mpr
81+
((cont x hx).preimage_mem_nhds <| g.open_source.mem_nhds hxg)⟩, he ▸ g.map_source hxg⟩,
82+
fun y hy ↦ ?_⟩
83+
change f y = g.symm (gf y)
84+
have : f y ∈ g.source := by apply interior_subset hy.1.2
85+
rw [← he, g.eq_symm_apply this (by apply g.map_source this)]
86+
rfl
87+
88+
theorem of_comp_right (hgf : IsLocallyHomeomorphOn (g ∘ f) s) (hf : IsLocallyHomeomorphOn f s) :
89+
IsLocallyHomeomorphOn g (f '' s) := mk g _ <| by
90+
rintro _ ⟨x, hx, rfl⟩
91+
obtain ⟨f, hxf, rfl⟩ := hf x hx
92+
obtain ⟨gf, hgf, he⟩ := hgf x hx
93+
refine ⟨f.symm.trans gf, ⟨f.map_source hxf, ?_⟩, fun y hy ↦ ?_⟩
94+
· apply (f.left_inv hxf).symm ▸ hgf
95+
· change g y = gf (f.symm y)
96+
rw [← he, Function.comp_apply, f.right_inv hy.1]
97+
5898
theorem map_nhds_eq (hf : IsLocallyHomeomorphOn f s) {x : X} (hx : x ∈ s) : (𝓝 x).map f = 𝓝 (f x) :=
5999
let ⟨e, hx, he⟩ := hf x hx
60100
he.symm ▸ e.map_nhds_eq hx
@@ -85,18 +125,29 @@ def IsLocallyHomeomorph :=
85125
∀ x : X, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ f = e
86126
#align is_locally_homeomorph IsLocallyHomeomorph
87127

88-
variable {f}
128+
theorem isLocallyHomeomorph_homeomorph (f : X ≃ₜ Y) : IsLocallyHomeomorph f :=
129+
fun _ ↦ ⟨f.toLocalHomeomorph, trivial, rfl⟩
130+
131+
variable {f s}
89132

90133
theorem isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ :
91-
IsLocallyHomeomorph f ↔ IsLocallyHomeomorphOn f Set.univ := by
92-
simp only [IsLocallyHomeomorph, IsLocallyHomeomorphOn, Set.mem_univ, forall_true_left]
134+
IsLocallyHomeomorph f ↔ IsLocallyHomeomorphOn f Set.univ :=
135+
fun h x _ ↦ h x, fun h x ↦ h x trivial⟩
93136
#align is_locally_homeomorph_iff_is_locally_homeomorph_on_univ isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ
94137

95138
protected theorem IsLocallyHomeomorph.isLocallyHomeomorphOn (hf : IsLocallyHomeomorph f) :
96-
IsLocallyHomeomorphOn f Set.univ :=
97-
isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ.mp hf
139+
IsLocallyHomeomorphOn f s := fun x _ ↦ hf x
98140
#align is_locally_homeomorph.is_locally_homeomorph_on IsLocallyHomeomorph.isLocallyHomeomorphOn
99141

142+
theorem isLocallyHomeomorph_iff_openEmbedding_restrict {f : X → Y} :
143+
IsLocallyHomeomorph f ↔ ∀ x : X, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f) := by
144+
simp_rw [isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ,
145+
isLocallyHomeomorphOn_iff_openEmbedding_restrict, imp_iff_right (Set.mem_univ _)]
146+
147+
theorem OpenEmbedding.isLocallyHomeomorph (hf : OpenEmbedding f) : IsLocallyHomeomorph f :=
148+
isLocallyHomeomorph_iff_openEmbedding_restrict.mpr fun _ ↦
149+
⟨_, Filter.univ_mem, hf.comp (Homeomorph.Set.univ X).openEmbedding⟩
150+
100151
variable (f)
101152

102153
namespace IsLocallyHomeomorph
@@ -112,6 +163,11 @@ theorem mk (h : ∀ x : X, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ ∀ y
112163

113164
variable {g f}
114165

166+
theorem of_comp (hgf : IsLocallyHomeomorph (g ∘ f)) (hg : IsLocallyHomeomorph g)
167+
(cont : Continuous f) : IsLocallyHomeomorph f :=
168+
isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ.mpr <|
169+
hgf.isLocallyHomeomorphOn.of_comp_left hg.isLocallyHomeomorphOn fun _ _ ↦ cont.continuousAt
170+
115171
theorem map_nhds_eq (hf : IsLocallyHomeomorph f) (x : X) : (𝓝 x).map f = 𝓝 (f x) :=
116172
hf.isLocallyHomeomorphOn.map_nhds_eq (Set.mem_univ x)
117173
#align is_locally_homeomorph.map_nhds_eq IsLocallyHomeomorph.map_nhds_eq
@@ -130,5 +186,30 @@ protected theorem comp (hg : IsLocallyHomeomorph g) (hf : IsLocallyHomeomorph f)
130186
(hg.isLocallyHomeomorphOn.comp hf.isLocallyHomeomorphOn (Set.univ.mapsTo_univ f))
131187
#align is_locally_homeomorph.comp IsLocallyHomeomorph.comp
132188

133-
end IsLocallyHomeomorph
189+
theorem openEmbedding_of_injective (hf : IsLocallyHomeomorph f) (hi : f.Injective) :
190+
OpenEmbedding f :=
191+
openEmbedding_of_continuous_injective_open hf.continuous hi hf.isOpenMap
192+
193+
/-- Continuous local sections of a local homeomorphism are open embeddings. -/
194+
theorem openEmbedding_of_comp (hf : IsLocallyHomeomorph g) (hgf : OpenEmbedding (g ∘ f))
195+
(cont : Continuous f) : OpenEmbedding f :=
196+
(hgf.isLocallyHomeomorph.of_comp hf cont).openEmbedding_of_injective hgf.inj.of_comp
197+
198+
open TopologicalSpace in
199+
/-- Ranges of continuous local sections of a local homeomorphism form a basis of the total space. -/
200+
theorem isTopologicalBasis (hf : IsLocallyHomeomorph f) : IsTopologicalBasis
201+
{U : Set X | ∃ V : Set Y, IsOpen V ∧ ∃ s : C(V,X), f ∘ s = (↑) ∧ Set.range s = U} := by
202+
refine isTopologicalBasis_of_open_of_nhds ?_ fun x U hx hU ↦ ?_
203+
· rintro _ ⟨U, hU, s, hs, rfl⟩
204+
refine (openEmbedding_of_comp hf (hs ▸ ⟨embedding_subtype_val, ?_⟩) s.continuous).open_range
205+
rwa [Subtype.range_val]
206+
· obtain ⟨f, hxf, rfl⟩ := hf x
207+
refine ⟨f.source ∩ U, ⟨f.target ∩ f.symm ⁻¹' U, f.symm.preimage_open_of_open hU,
208+
⟨_, continuousOn_iff_continuous_restrict.mp (f.continuous_invFun.mono fun _ h ↦ h.1)⟩,
209+
?_, (Set.range_restrict _ _).trans ?_⟩, ⟨hxf, hx⟩, fun _ h ↦ h.2
210+
· ext y; exact f.right_inv y.2.1
211+
· apply (f.symm_image_target_inter_eq _).trans
212+
rw [Set.preimage_inter, ← Set.inter_assoc, Set.inter_eq_self_of_subset_left
213+
f.source_preimage_target, f.source_inter_preimage_inv_preimage]
134214

215+
end IsLocallyHomeomorph

Mathlib/Topology/LocalHomeomorph.lean

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1266,18 +1266,18 @@ def toHomeomorphOfSourceEqUnivTargetEqUniv (h : e.source = (univ : Set α)) (h'
12661266
simpa only [continuous_iff_continuousOn_univ, h'] using e.continuousOn_symm
12671267
#align local_homeomorph.to_homeomorph_of_source_eq_univ_target_eq_univ LocalHomeomorph.toHomeomorphOfSourceEqUnivTargetEqUniv
12681268

1269+
theorem openEmbedding_restrict : OpenEmbedding (e.source.restrict e) := by
1270+
refine openEmbedding_of_continuous_injective_open (e.continuousOn.comp_continuous
1271+
continuous_subtype_val Subtype.prop) e.injOn.injective fun V hV ↦ ?_
1272+
rw [Set.restrict_eq, Set.image_comp]
1273+
exact e.image_open_of_open (e.open_source.isOpenMap_subtype_val V hV) fun _ ⟨x, _, h⟩ ↦ h ▸ x.2
1274+
12691275
/-- A local homeomorphism whose source is all of `α` defines an open embedding of `α` into `β`. The
12701276
converse is also true; see `OpenEmbedding.toLocalHomeomorph`. -/
1271-
theorem to_openEmbedding (h : e.source = Set.univ) : OpenEmbedding e := by
1272-
apply openEmbedding_of_continuous_injective_open
1273-
· apply continuous_iff_continuousOn_univ.mpr
1274-
rw [← h]
1275-
exact e.continuousOn
1276-
· apply Set.injective_iff_injOn_univ.mpr
1277-
rw [← h]
1278-
exact e.injOn
1279-
· intro U hU
1280-
simpa only [h, subset_univ, mfld_simps] using e.image_open_of_open hU
1277+
theorem to_openEmbedding (h : e.source = Set.univ) : OpenEmbedding e :=
1278+
e.openEmbedding_restrict.comp
1279+
((Homeomorph.setCongr h).trans <| Homeomorph.Set.univ α).symm.openEmbedding
1280+
12811281
#align local_homeomorph.to_open_embedding LocalHomeomorph.to_openEmbedding
12821282

12831283
end LocalHomeomorph

0 commit comments

Comments
 (0)