@@ -34,6 +34,21 @@ def IsLocallyHomeomorphOn :=
34
34
∀ x ∈ s, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ f = e
35
35
#align is_locally_homeomorph_on IsLocallyHomeomorphOn
36
36
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
+
37
52
namespace IsLocallyHomeomorphOn
38
53
39
54
/-- 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 ∧ ∀
55
70
56
71
variable {g f s t}
57
72
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
+
58
98
theorem map_nhds_eq (hf : IsLocallyHomeomorphOn f s) {x : X} (hx : x ∈ s) : (𝓝 x).map f = 𝓝 (f x) :=
59
99
let ⟨e, hx, he⟩ := hf x hx
60
100
he.symm ▸ e.map_nhds_eq hx
@@ -85,18 +125,29 @@ def IsLocallyHomeomorph :=
85
125
∀ x : X, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ f = e
86
126
#align is_locally_homeomorph IsLocallyHomeomorph
87
127
88
- variable {f}
128
+ theorem isLocallyHomeomorph_homeomorph (f : X ≃ₜ Y) : IsLocallyHomeomorph f :=
129
+ fun _ ↦ ⟨f.toLocalHomeomorph, trivial, rfl⟩
130
+
131
+ variable {f s}
89
132
90
133
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⟩
93
136
#align is_locally_homeomorph_iff_is_locally_homeomorph_on_univ isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ
94
137
95
138
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
98
140
#align is_locally_homeomorph.is_locally_homeomorph_on IsLocallyHomeomorph.isLocallyHomeomorphOn
99
141
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
+
100
151
variable (f)
101
152
102
153
namespace IsLocallyHomeomorph
@@ -112,6 +163,11 @@ theorem mk (h : ∀ x : X, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ ∀ y
112
163
113
164
variable {g f}
114
165
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
+
115
171
theorem map_nhds_eq (hf : IsLocallyHomeomorph f) (x : X) : (𝓝 x).map f = 𝓝 (f x) :=
116
172
hf.isLocallyHomeomorphOn.map_nhds_eq (Set.mem_univ x)
117
173
#align is_locally_homeomorph.map_nhds_eq IsLocallyHomeomorph.map_nhds_eq
@@ -130,5 +186,30 @@ protected theorem comp (hg : IsLocallyHomeomorph g) (hf : IsLocallyHomeomorph f)
130
186
(hg.isLocallyHomeomorphOn.comp hf.isLocallyHomeomorphOn (Set.univ.mapsTo_univ f))
131
187
#align is_locally_homeomorph.comp IsLocallyHomeomorph.comp
132
188
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]
134
214
215
+ end IsLocallyHomeomorph
0 commit comments