topology.is_locally_homeomorphMathlib.Topology.IsLocalHomeomorph

This file has been ported!

Changes since the initial port

The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.

Changes in mathlib3

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(last sync)

Changes in mathlib3port

mathlib3
mathlib3port
Diff
@@ -3,7 +3,7 @@ Copyright (c) 2021 Thomas Browning. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Thomas Browning
 -/
-import Topology.LocalHomeomorph
+import Topology.PartialHomeomorph
 
 #align_import topology.is_locally_homeomorph from "leanprover-community/mathlib"@"23aa88e32dcc9d2a24cca7bc23268567ed4cd7d6"
 
Diff
@@ -31,22 +31,22 @@ open scoped Topology
 variable {X Y Z : Type _} [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z] (g : Y → Z)
   (f : X → Y) (s : Set X) (t : Set Y)
 
-#print IsLocallyHomeomorphOn /-
+#print IsLocalHomeomorphOn /-
 /-- A function `f : X → Y` satisfies `is_locally_homeomorph_on f s` if each `x ∈ s` is contained in
 the source of some `e : local_homeomorph X Y` with `f = e`. -/
-def IsLocallyHomeomorphOn :=
-  ∀ x ∈ s, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ f = e
-#align is_locally_homeomorph_on IsLocallyHomeomorphOn
+def IsLocalHomeomorphOn :=
+  ∀ x ∈ s, ∃ e : PartialHomeomorph X Y, x ∈ e.source ∧ f = e
+#align is_locally_homeomorph_on IsLocalHomeomorphOn
 -/
 
-namespace IsLocallyHomeomorphOn
+namespace IsLocalHomeomorphOn
 
-#print IsLocallyHomeomorphOn.mk /-
+#print IsLocalHomeomorphOn.mk /-
 /-- Proves that `f` satisfies `is_locally_homeomorph_on f s`. The condition `h` is weaker than the
 definition of `is_locally_homeomorph_on f s`, since it only requires `e : local_homeomorph X Y` to
 agree with `f` on its source `e.source`, as opposed to on the whole space `X`. -/
-theorem mk (h : ∀ x ∈ s, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ ∀ y ∈ e.source, f y = e y) :
-    IsLocallyHomeomorphOn f s := by
+theorem mk (h : ∀ x ∈ s, ∃ e : PartialHomeomorph X Y, x ∈ e.source ∧ ∀ y ∈ e.source, f y = e y) :
+    IsLocalHomeomorphOn f s := by
   intro x hx
   obtain ⟨e, hx, he⟩ := h x hx
   exact
@@ -57,110 +57,110 @@ theorem mk (h : ∀ x ∈ s, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ ∀
         right_inv' := fun y hy => by rw [he _ (e.map_target' hy)] <;> exact e.right_inv' hy
         continuous_toFun := (continuousOn_congr he).mpr e.continuous_to_fun },
       hx, rfl⟩
-#align is_locally_homeomorph_on.mk IsLocallyHomeomorphOn.mk
+#align is_locally_homeomorph_on.mk IsLocalHomeomorphOn.mk
 -/
 
 variable {g f s t}
 
-#print IsLocallyHomeomorphOn.map_nhds_eq /-
-theorem map_nhds_eq (hf : IsLocallyHomeomorphOn f s) {x : X} (hx : x ∈ s) : (𝓝 x).map f = 𝓝 (f x) :=
+#print IsLocalHomeomorphOn.map_nhds_eq /-
+theorem map_nhds_eq (hf : IsLocalHomeomorphOn f s) {x : X} (hx : x ∈ s) : (𝓝 x).map f = 𝓝 (f x) :=
   let ⟨e, hx, he⟩ := hf x hx
   he.symm ▸ e.map_nhds_eq hx
-#align is_locally_homeomorph_on.map_nhds_eq IsLocallyHomeomorphOn.map_nhds_eq
+#align is_locally_homeomorph_on.map_nhds_eq IsLocalHomeomorphOn.map_nhds_eq
 -/
 
-#print IsLocallyHomeomorphOn.continuousAt /-
-protected theorem continuousAt (hf : IsLocallyHomeomorphOn f s) {x : X} (hx : x ∈ s) :
+#print IsLocalHomeomorphOn.continuousAt /-
+protected theorem continuousAt (hf : IsLocalHomeomorphOn f s) {x : X} (hx : x ∈ s) :
     ContinuousAt f x :=
   (hf.map_nhds_eq hx).le
-#align is_locally_homeomorph_on.continuous_at IsLocallyHomeomorphOn.continuousAt
+#align is_locally_homeomorph_on.continuous_at IsLocalHomeomorphOn.continuousAt
 -/
 
-#print IsLocallyHomeomorphOn.continuousOn /-
-protected theorem continuousOn (hf : IsLocallyHomeomorphOn f s) : ContinuousOn f s :=
+#print IsLocalHomeomorphOn.continuousOn /-
+protected theorem continuousOn (hf : IsLocalHomeomorphOn f s) : ContinuousOn f s :=
   ContinuousAt.continuousOn fun x => hf.ContinuousAt
-#align is_locally_homeomorph_on.continuous_on IsLocallyHomeomorphOn.continuousOn
+#align is_locally_homeomorph_on.continuous_on IsLocalHomeomorphOn.continuousOn
 -/
 
-#print IsLocallyHomeomorphOn.comp /-
-protected theorem comp (hg : IsLocallyHomeomorphOn g t) (hf : IsLocallyHomeomorphOn f s)
-    (h : Set.MapsTo f s t) : IsLocallyHomeomorphOn (g ∘ f) s :=
+#print IsLocalHomeomorphOn.comp /-
+protected theorem comp (hg : IsLocalHomeomorphOn g t) (hf : IsLocalHomeomorphOn f s)
+    (h : Set.MapsTo f s t) : IsLocalHomeomorphOn (g ∘ f) s :=
   by
   intro x hx
   obtain ⟨eg, hxg, rfl⟩ := hg (f x) (h hx)
   obtain ⟨ef, hxf, rfl⟩ := hf x hx
   exact ⟨ef.trans eg, ⟨hxf, hxg⟩, rfl⟩
-#align is_locally_homeomorph_on.comp IsLocallyHomeomorphOn.comp
+#align is_locally_homeomorph_on.comp IsLocalHomeomorphOn.comp
 -/
 
-end IsLocallyHomeomorphOn
+end IsLocalHomeomorphOn
 
-#print IsLocallyHomeomorph /-
+#print IsLocalHomeomorph /-
 /-- A function `f : X → Y` satisfies `is_locally_homeomorph f` if each `x : x` is contained in
   the source of some `e : local_homeomorph X Y` with `f = e`. -/
-def IsLocallyHomeomorph :=
-  ∀ x : X, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ f = e
-#align is_locally_homeomorph IsLocallyHomeomorph
+def IsLocalHomeomorph :=
+  ∀ x : X, ∃ e : PartialHomeomorph X Y, x ∈ e.source ∧ f = e
+#align is_locally_homeomorph IsLocalHomeomorph
 -/
 
 variable {f}
 
-#print isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ /-
-theorem isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ :
-    IsLocallyHomeomorph f ↔ IsLocallyHomeomorphOn f Set.univ := by
-  simp only [IsLocallyHomeomorph, IsLocallyHomeomorphOn, Set.mem_univ, forall_true_left]
-#align is_locally_homeomorph_iff_is_locally_homeomorph_on_univ isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ
+#print isLocalHomeomorph_iff_isLocalHomeomorphOn_univ /-
+theorem isLocalHomeomorph_iff_isLocalHomeomorphOn_univ :
+    IsLocalHomeomorph f ↔ IsLocalHomeomorphOn f Set.univ := by
+  simp only [IsLocalHomeomorph, IsLocalHomeomorphOn, Set.mem_univ, forall_true_left]
+#align is_locally_homeomorph_iff_is_locally_homeomorph_on_univ isLocalHomeomorph_iff_isLocalHomeomorphOn_univ
 -/
 
-#print IsLocallyHomeomorph.isLocallyHomeomorphOn /-
-protected theorem IsLocallyHomeomorph.isLocallyHomeomorphOn (hf : IsLocallyHomeomorph f) :
-    IsLocallyHomeomorphOn f Set.univ :=
-  isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ.mp hf
-#align is_locally_homeomorph.is_locally_homeomorph_on IsLocallyHomeomorph.isLocallyHomeomorphOn
+#print IsLocalHomeomorph.isLocalHomeomorphOn /-
+protected theorem IsLocalHomeomorph.isLocalHomeomorphOn (hf : IsLocalHomeomorph f) :
+    IsLocalHomeomorphOn f Set.univ :=
+  isLocalHomeomorph_iff_isLocalHomeomorphOn_univ.mp hf
+#align is_locally_homeomorph.is_locally_homeomorph_on IsLocalHomeomorph.isLocalHomeomorphOn
 -/
 
 variable (f)
 
-namespace IsLocallyHomeomorph
+namespace IsLocalHomeomorph
 
-#print IsLocallyHomeomorph.mk /-
+#print IsLocalHomeomorph.mk /-
 /-- Proves that `f` satisfies `is_locally_homeomorph f`. The condition `h` is weaker than the
 definition of `is_locally_homeomorph f`, since it only requires `e : local_homeomorph X Y` to
 agree with `f` on its source `e.source`, as opposed to on the whole space `X`. -/
-theorem mk (h : ∀ x : X, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ ∀ y ∈ e.source, f y = e y) :
-    IsLocallyHomeomorph f :=
-  isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ.mpr
-    (IsLocallyHomeomorphOn.mk f Set.univ fun x hx => h x)
-#align is_locally_homeomorph.mk IsLocallyHomeomorph.mk
+theorem mk (h : ∀ x : X, ∃ e : PartialHomeomorph X Y, x ∈ e.source ∧ ∀ y ∈ e.source, f y = e y) :
+    IsLocalHomeomorph f :=
+  isLocalHomeomorph_iff_isLocalHomeomorphOn_univ.mpr
+    (IsLocalHomeomorphOn.mk f Set.univ fun x hx => h x)
+#align is_locally_homeomorph.mk IsLocalHomeomorph.mk
 -/
 
 variable {g f}
 
-#print IsLocallyHomeomorph.map_nhds_eq /-
-theorem map_nhds_eq (hf : IsLocallyHomeomorph f) (x : X) : (𝓝 x).map f = 𝓝 (f x) :=
-  hf.IsLocallyHomeomorphOn.map_nhds_eq (Set.mem_univ x)
-#align is_locally_homeomorph.map_nhds_eq IsLocallyHomeomorph.map_nhds_eq
+#print IsLocalHomeomorph.map_nhds_eq /-
+theorem map_nhds_eq (hf : IsLocalHomeomorph f) (x : X) : (𝓝 x).map f = 𝓝 (f x) :=
+  hf.IsLocalHomeomorphOn.map_nhds_eq (Set.mem_univ x)
+#align is_locally_homeomorph.map_nhds_eq IsLocalHomeomorph.map_nhds_eq
 -/
 
-#print IsLocallyHomeomorph.continuous /-
-protected theorem continuous (hf : IsLocallyHomeomorph f) : Continuous f :=
-  continuous_iff_continuousOn_univ.mpr hf.IsLocallyHomeomorphOn.ContinuousOn
-#align is_locally_homeomorph.continuous IsLocallyHomeomorph.continuous
+#print IsLocalHomeomorph.continuous /-
+protected theorem continuous (hf : IsLocalHomeomorph f) : Continuous f :=
+  continuous_iff_continuousOn_univ.mpr hf.IsLocalHomeomorphOn.ContinuousOn
+#align is_locally_homeomorph.continuous IsLocalHomeomorph.continuous
 -/
 
-#print IsLocallyHomeomorph.isOpenMap /-
-protected theorem isOpenMap (hf : IsLocallyHomeomorph f) : IsOpenMap f :=
+#print IsLocalHomeomorph.isOpenMap /-
+protected theorem isOpenMap (hf : IsLocalHomeomorph f) : IsOpenMap f :=
   IsOpenMap.of_nhds_le fun x => ge_of_eq (hf.map_nhds_eq x)
-#align is_locally_homeomorph.is_open_map IsLocallyHomeomorph.isOpenMap
+#align is_locally_homeomorph.is_open_map IsLocalHomeomorph.isOpenMap
 -/
 
-#print IsLocallyHomeomorph.comp /-
-protected theorem comp (hg : IsLocallyHomeomorph g) (hf : IsLocallyHomeomorph f) :
-    IsLocallyHomeomorph (g ∘ f) :=
-  isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ.mpr
-    (hg.IsLocallyHomeomorphOn.comp hf.IsLocallyHomeomorphOn (Set.univ.mapsTo_univ f))
-#align is_locally_homeomorph.comp IsLocallyHomeomorph.comp
+#print IsLocalHomeomorph.comp /-
+protected theorem comp (hg : IsLocalHomeomorph g) (hf : IsLocalHomeomorph f) :
+    IsLocalHomeomorph (g ∘ f) :=
+  isLocalHomeomorph_iff_isLocalHomeomorphOn_univ.mpr
+    (hg.IsLocalHomeomorphOn.comp hf.IsLocalHomeomorphOn (Set.univ.mapsTo_univ f))
+#align is_locally_homeomorph.comp IsLocalHomeomorph.comp
 -/
 
-end IsLocallyHomeomorph
+end IsLocalHomeomorph
 
Diff
@@ -3,7 +3,7 @@ Copyright (c) 2021 Thomas Browning. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Thomas Browning
 -/
-import Mathbin.Topology.LocalHomeomorph
+import Topology.LocalHomeomorph
 
 #align_import topology.is_locally_homeomorph from "leanprover-community/mathlib"@"23aa88e32dcc9d2a24cca7bc23268567ed4cd7d6"
 
Diff
@@ -2,14 +2,11 @@
 Copyright (c) 2021 Thomas Browning. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Thomas Browning
-
-! This file was ported from Lean 3 source module topology.is_locally_homeomorph
-! leanprover-community/mathlib commit 23aa88e32dcc9d2a24cca7bc23268567ed4cd7d6
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
 -/
 import Mathbin.Topology.LocalHomeomorph
 
+#align_import topology.is_locally_homeomorph from "leanprover-community/mathlib"@"23aa88e32dcc9d2a24cca7bc23268567ed4cd7d6"
+
 /-!
 # Local homeomorphisms
 
Diff
@@ -44,6 +44,7 @@ def IsLocallyHomeomorphOn :=
 
 namespace IsLocallyHomeomorphOn
 
+#print IsLocallyHomeomorphOn.mk /-
 /-- Proves that `f` satisfies `is_locally_homeomorph_on f s`. The condition `h` is weaker than the
 definition of `is_locally_homeomorph_on f s`, since it only requires `e : local_homeomorph X Y` to
 agree with `f` on its source `e.source`, as opposed to on the whole space `X`. -/
@@ -60,23 +61,31 @@ theorem mk (h : ∀ x ∈ s, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ ∀
         continuous_toFun := (continuousOn_congr he).mpr e.continuous_to_fun },
       hx, rfl⟩
 #align is_locally_homeomorph_on.mk IsLocallyHomeomorphOn.mk
+-/
 
 variable {g f s t}
 
+#print IsLocallyHomeomorphOn.map_nhds_eq /-
 theorem map_nhds_eq (hf : IsLocallyHomeomorphOn f s) {x : X} (hx : x ∈ s) : (𝓝 x).map f = 𝓝 (f x) :=
   let ⟨e, hx, he⟩ := hf x hx
   he.symm ▸ e.map_nhds_eq hx
 #align is_locally_homeomorph_on.map_nhds_eq IsLocallyHomeomorphOn.map_nhds_eq
+-/
 
+#print IsLocallyHomeomorphOn.continuousAt /-
 protected theorem continuousAt (hf : IsLocallyHomeomorphOn f s) {x : X} (hx : x ∈ s) :
     ContinuousAt f x :=
   (hf.map_nhds_eq hx).le
 #align is_locally_homeomorph_on.continuous_at IsLocallyHomeomorphOn.continuousAt
+-/
 
+#print IsLocallyHomeomorphOn.continuousOn /-
 protected theorem continuousOn (hf : IsLocallyHomeomorphOn f s) : ContinuousOn f s :=
   ContinuousAt.continuousOn fun x => hf.ContinuousAt
 #align is_locally_homeomorph_on.continuous_on IsLocallyHomeomorphOn.continuousOn
+-/
 
+#print IsLocallyHomeomorphOn.comp /-
 protected theorem comp (hg : IsLocallyHomeomorphOn g t) (hf : IsLocallyHomeomorphOn f s)
     (h : Set.MapsTo f s t) : IsLocallyHomeomorphOn (g ∘ f) s :=
   by
@@ -85,6 +94,7 @@ protected theorem comp (hg : IsLocallyHomeomorphOn g t) (hf : IsLocallyHomeomorp
   obtain ⟨ef, hxf, rfl⟩ := hf x hx
   exact ⟨ef.trans eg, ⟨hxf, hxg⟩, rfl⟩
 #align is_locally_homeomorph_on.comp IsLocallyHomeomorphOn.comp
+-/
 
 end IsLocallyHomeomorphOn
 
@@ -98,20 +108,25 @@ def IsLocallyHomeomorph :=
 
 variable {f}
 
+#print isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ /-
 theorem isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ :
     IsLocallyHomeomorph f ↔ IsLocallyHomeomorphOn f Set.univ := by
   simp only [IsLocallyHomeomorph, IsLocallyHomeomorphOn, Set.mem_univ, forall_true_left]
 #align is_locally_homeomorph_iff_is_locally_homeomorph_on_univ isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ
+-/
 
+#print IsLocallyHomeomorph.isLocallyHomeomorphOn /-
 protected theorem IsLocallyHomeomorph.isLocallyHomeomorphOn (hf : IsLocallyHomeomorph f) :
     IsLocallyHomeomorphOn f Set.univ :=
   isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ.mp hf
 #align is_locally_homeomorph.is_locally_homeomorph_on IsLocallyHomeomorph.isLocallyHomeomorphOn
+-/
 
 variable (f)
 
 namespace IsLocallyHomeomorph
 
+#print IsLocallyHomeomorph.mk /-
 /-- Proves that `f` satisfies `is_locally_homeomorph f`. The condition `h` is weaker than the
 definition of `is_locally_homeomorph f`, since it only requires `e : local_homeomorph X Y` to
 agree with `f` on its source `e.source`, as opposed to on the whole space `X`. -/
@@ -120,26 +135,35 @@ theorem mk (h : ∀ x : X, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ ∀ y
   isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ.mpr
     (IsLocallyHomeomorphOn.mk f Set.univ fun x hx => h x)
 #align is_locally_homeomorph.mk IsLocallyHomeomorph.mk
+-/
 
 variable {g f}
 
+#print IsLocallyHomeomorph.map_nhds_eq /-
 theorem map_nhds_eq (hf : IsLocallyHomeomorph f) (x : X) : (𝓝 x).map f = 𝓝 (f x) :=
   hf.IsLocallyHomeomorphOn.map_nhds_eq (Set.mem_univ x)
 #align is_locally_homeomorph.map_nhds_eq IsLocallyHomeomorph.map_nhds_eq
+-/
 
+#print IsLocallyHomeomorph.continuous /-
 protected theorem continuous (hf : IsLocallyHomeomorph f) : Continuous f :=
   continuous_iff_continuousOn_univ.mpr hf.IsLocallyHomeomorphOn.ContinuousOn
 #align is_locally_homeomorph.continuous IsLocallyHomeomorph.continuous
+-/
 
+#print IsLocallyHomeomorph.isOpenMap /-
 protected theorem isOpenMap (hf : IsLocallyHomeomorph f) : IsOpenMap f :=
   IsOpenMap.of_nhds_le fun x => ge_of_eq (hf.map_nhds_eq x)
 #align is_locally_homeomorph.is_open_map IsLocallyHomeomorph.isOpenMap
+-/
 
+#print IsLocallyHomeomorph.comp /-
 protected theorem comp (hg : IsLocallyHomeomorph g) (hf : IsLocallyHomeomorph f) :
     IsLocallyHomeomorph (g ∘ f) :=
   isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ.mpr
     (hg.IsLocallyHomeomorphOn.comp hf.IsLocallyHomeomorphOn (Set.univ.mapsTo_univ f))
 #align is_locally_homeomorph.comp IsLocallyHomeomorph.comp
+-/
 
 end IsLocallyHomeomorph
 
Diff
@@ -29,7 +29,7 @@ This file defines local homeomorphisms.
 -/
 
 
-open Topology
+open scoped Topology
 
 variable {X Y Z : Type _} [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z] (g : Y → Z)
   (f : X → Y) (s : Set X) (t : Set Y)
Diff
@@ -44,12 +44,6 @@ def IsLocallyHomeomorphOn :=
 
 namespace IsLocallyHomeomorphOn
 
-/- warning: is_locally_homeomorph_on.mk -> IsLocallyHomeomorphOn.mk is a dubious translation:
-lean 3 declaration is
-  forall {X : Type.{u1}} {Y : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} X] [_inst_2 : TopologicalSpace.{u2} Y] (f : X -> Y) (s : Set.{u1} X), (forall (x : X), (Membership.Mem.{u1, u1} X (Set.{u1} X) (Set.hasMem.{u1} X) x s) -> (Exists.{max (succ u1) (succ u2)} (LocalHomeomorph.{u1, u2} X Y _inst_1 _inst_2) (fun (e : LocalHomeomorph.{u1, u2} X Y _inst_1 _inst_2) => And (Membership.Mem.{u1, u1} X (Set.{u1} X) (Set.hasMem.{u1} X) x (LocalEquiv.source.{u1, u2} X Y (LocalHomeomorph.toLocalEquiv.{u1, u2} X Y _inst_1 _inst_2 e))) (forall (y : X), (Membership.Mem.{u1, u1} X (Set.{u1} X) (Set.hasMem.{u1} X) y (LocalEquiv.source.{u1, u2} X Y (LocalHomeomorph.toLocalEquiv.{u1, u2} X Y _inst_1 _inst_2 e))) -> (Eq.{succ u2} Y (f y) (coeFn.{max (succ u1) (succ u2), max (succ u1) (succ u2)} (LocalHomeomorph.{u1, u2} X Y _inst_1 _inst_2) (fun (_x : LocalHomeomorph.{u1, u2} X Y _inst_1 _inst_2) => X -> Y) (LocalHomeomorph.hasCoeToFun.{u1, u2} X Y _inst_1 _inst_2) e y)))))) -> (IsLocallyHomeomorphOn.{u1, u2} X Y _inst_1 _inst_2 f s)
-but is expected to have type
-  forall {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] (f : X -> Y) (s : Set.{u2} X), (forall (x : X), (Membership.mem.{u2, u2} X (Set.{u2} X) (Set.instMembershipSet.{u2} X) x s) -> (Exists.{max (succ u2) (succ u1)} (LocalHomeomorph.{u2, u1} X Y _inst_1 _inst_2) (fun (e : LocalHomeomorph.{u2, u1} X Y _inst_1 _inst_2) => And (Membership.mem.{u2, u2} X (Set.{u2} X) (Set.instMembershipSet.{u2} X) x (LocalEquiv.source.{u2, u1} X Y (LocalHomeomorph.toLocalEquiv.{u2, u1} X Y _inst_1 _inst_2 e))) (forall (y : X), (Membership.mem.{u2, u2} X (Set.{u2} X) (Set.instMembershipSet.{u2} X) y (LocalEquiv.source.{u2, u1} X Y (LocalHomeomorph.toLocalEquiv.{u2, u1} X Y _inst_1 _inst_2 e))) -> (Eq.{succ u1} Y (f y) (LocalHomeomorph.toFun'.{u2, u1} X Y _inst_1 _inst_2 e y)))))) -> (IsLocallyHomeomorphOn.{u2, u1} X Y _inst_1 _inst_2 f s)
-Case conversion may be inaccurate. Consider using '#align is_locally_homeomorph_on.mk IsLocallyHomeomorphOn.mkₓ'. -/
 /-- Proves that `f` satisfies `is_locally_homeomorph_on f s`. The condition `h` is weaker than the
 definition of `is_locally_homeomorph_on f s`, since it only requires `e : local_homeomorph X Y` to
 agree with `f` on its source `e.source`, as opposed to on the whole space `X`. -/
@@ -69,44 +63,20 @@ theorem mk (h : ∀ x ∈ s, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ ∀
 
 variable {g f s t}
 
-/- warning: is_locally_homeomorph_on.map_nhds_eq -> IsLocallyHomeomorphOn.map_nhds_eq is a dubious translation:
-lean 3 declaration is
-  forall {X : Type.{u1}} {Y : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} X] [_inst_2 : TopologicalSpace.{u2} Y] {f : X -> Y} {s : Set.{u1} X}, (IsLocallyHomeomorphOn.{u1, u2} X Y _inst_1 _inst_2 f s) -> (forall {x : X}, (Membership.Mem.{u1, u1} X (Set.{u1} X) (Set.hasMem.{u1} X) x s) -> (Eq.{succ u2} (Filter.{u2} Y) (Filter.map.{u1, u2} X Y f (nhds.{u1} X _inst_1 x)) (nhds.{u2} Y _inst_2 (f x))))
-but is expected to have type
-  forall {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : X -> Y} {s : Set.{u2} X}, (IsLocallyHomeomorphOn.{u2, u1} X Y _inst_1 _inst_2 f s) -> (forall {x : X}, (Membership.mem.{u2, u2} X (Set.{u2} X) (Set.instMembershipSet.{u2} X) x s) -> (Eq.{succ u1} (Filter.{u1} Y) (Filter.map.{u2, u1} X Y f (nhds.{u2} X _inst_1 x)) (nhds.{u1} Y _inst_2 (f x))))
-Case conversion may be inaccurate. Consider using '#align is_locally_homeomorph_on.map_nhds_eq IsLocallyHomeomorphOn.map_nhds_eqₓ'. -/
 theorem map_nhds_eq (hf : IsLocallyHomeomorphOn f s) {x : X} (hx : x ∈ s) : (𝓝 x).map f = 𝓝 (f x) :=
   let ⟨e, hx, he⟩ := hf x hx
   he.symm ▸ e.map_nhds_eq hx
 #align is_locally_homeomorph_on.map_nhds_eq IsLocallyHomeomorphOn.map_nhds_eq
 
-/- warning: is_locally_homeomorph_on.continuous_at -> IsLocallyHomeomorphOn.continuousAt is a dubious translation:
-lean 3 declaration is
-  forall {X : Type.{u1}} {Y : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} X] [_inst_2 : TopologicalSpace.{u2} Y] {f : X -> Y} {s : Set.{u1} X}, (IsLocallyHomeomorphOn.{u1, u2} X Y _inst_1 _inst_2 f s) -> (forall {x : X}, (Membership.Mem.{u1, u1} X (Set.{u1} X) (Set.hasMem.{u1} X) x s) -> (ContinuousAt.{u1, u2} X Y _inst_1 _inst_2 f x))
-but is expected to have type
-  forall {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : X -> Y} {s : Set.{u2} X}, (IsLocallyHomeomorphOn.{u2, u1} X Y _inst_1 _inst_2 f s) -> (forall {x : X}, (Membership.mem.{u2, u2} X (Set.{u2} X) (Set.instMembershipSet.{u2} X) x s) -> (ContinuousAt.{u2, u1} X Y _inst_1 _inst_2 f x))
-Case conversion may be inaccurate. Consider using '#align is_locally_homeomorph_on.continuous_at IsLocallyHomeomorphOn.continuousAtₓ'. -/
 protected theorem continuousAt (hf : IsLocallyHomeomorphOn f s) {x : X} (hx : x ∈ s) :
     ContinuousAt f x :=
   (hf.map_nhds_eq hx).le
 #align is_locally_homeomorph_on.continuous_at IsLocallyHomeomorphOn.continuousAt
 
-/- warning: is_locally_homeomorph_on.continuous_on -> IsLocallyHomeomorphOn.continuousOn is a dubious translation:
-lean 3 declaration is
-  forall {X : Type.{u1}} {Y : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} X] [_inst_2 : TopologicalSpace.{u2} Y] {f : X -> Y} {s : Set.{u1} X}, (IsLocallyHomeomorphOn.{u1, u2} X Y _inst_1 _inst_2 f s) -> (ContinuousOn.{u1, u2} X Y _inst_1 _inst_2 f s)
-but is expected to have type
-  forall {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : X -> Y} {s : Set.{u2} X}, (IsLocallyHomeomorphOn.{u2, u1} X Y _inst_1 _inst_2 f s) -> (ContinuousOn.{u2, u1} X Y _inst_1 _inst_2 f s)
-Case conversion may be inaccurate. Consider using '#align is_locally_homeomorph_on.continuous_on IsLocallyHomeomorphOn.continuousOnₓ'. -/
 protected theorem continuousOn (hf : IsLocallyHomeomorphOn f s) : ContinuousOn f s :=
   ContinuousAt.continuousOn fun x => hf.ContinuousAt
 #align is_locally_homeomorph_on.continuous_on IsLocallyHomeomorphOn.continuousOn
 
-/- warning: is_locally_homeomorph_on.comp -> IsLocallyHomeomorphOn.comp is a dubious translation:
-lean 3 declaration is
-  forall {X : Type.{u1}} {Y : Type.{u2}} {Z : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} X] [_inst_2 : TopologicalSpace.{u2} Y] [_inst_3 : TopologicalSpace.{u3} Z] {g : Y -> Z} {f : X -> Y} {s : Set.{u1} X} {t : Set.{u2} Y}, (IsLocallyHomeomorphOn.{u2, u3} Y Z _inst_2 _inst_3 g t) -> (IsLocallyHomeomorphOn.{u1, u2} X Y _inst_1 _inst_2 f s) -> (Set.MapsTo.{u1, u2} X Y f s t) -> (IsLocallyHomeomorphOn.{u1, u3} X Z _inst_1 _inst_3 (Function.comp.{succ u1, succ u2, succ u3} X Y Z g f) s)
-but is expected to have type
-  forall {X : Type.{u1}} {Y : Type.{u3}} {Z : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} X] [_inst_2 : TopologicalSpace.{u3} Y] [_inst_3 : TopologicalSpace.{u2} Z] {g : Y -> Z} {f : X -> Y} {s : Set.{u1} X} {t : Set.{u3} Y}, (IsLocallyHomeomorphOn.{u3, u2} Y Z _inst_2 _inst_3 g t) -> (IsLocallyHomeomorphOn.{u1, u3} X Y _inst_1 _inst_2 f s) -> (Set.MapsTo.{u1, u3} X Y f s t) -> (IsLocallyHomeomorphOn.{u1, u2} X Z _inst_1 _inst_3 (Function.comp.{succ u1, succ u3, succ u2} X Y Z g f) s)
-Case conversion may be inaccurate. Consider using '#align is_locally_homeomorph_on.comp IsLocallyHomeomorphOn.compₓ'. -/
 protected theorem comp (hg : IsLocallyHomeomorphOn g t) (hf : IsLocallyHomeomorphOn f s)
     (h : Set.MapsTo f s t) : IsLocallyHomeomorphOn (g ∘ f) s :=
   by
@@ -128,23 +98,11 @@ def IsLocallyHomeomorph :=
 
 variable {f}
 
-/- warning: is_locally_homeomorph_iff_is_locally_homeomorph_on_univ -> isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ is a dubious translation:
-lean 3 declaration is
-  forall {X : Type.{u1}} {Y : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} X] [_inst_2 : TopologicalSpace.{u2} Y] {f : X -> Y}, Iff (IsLocallyHomeomorph.{u1, u2} X Y _inst_1 _inst_2 f) (IsLocallyHomeomorphOn.{u1, u2} X Y _inst_1 _inst_2 f (Set.univ.{u1} X))
-but is expected to have type
-  forall {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : X -> Y}, Iff (IsLocallyHomeomorph.{u2, u1} X Y _inst_1 _inst_2 f) (IsLocallyHomeomorphOn.{u2, u1} X Y _inst_1 _inst_2 f (Set.univ.{u2} X))
-Case conversion may be inaccurate. Consider using '#align is_locally_homeomorph_iff_is_locally_homeomorph_on_univ isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univₓ'. -/
 theorem isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ :
     IsLocallyHomeomorph f ↔ IsLocallyHomeomorphOn f Set.univ := by
   simp only [IsLocallyHomeomorph, IsLocallyHomeomorphOn, Set.mem_univ, forall_true_left]
 #align is_locally_homeomorph_iff_is_locally_homeomorph_on_univ isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ
 
-/- warning: is_locally_homeomorph.is_locally_homeomorph_on -> IsLocallyHomeomorph.isLocallyHomeomorphOn is a dubious translation:
-lean 3 declaration is
-  forall {X : Type.{u1}} {Y : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} X] [_inst_2 : TopologicalSpace.{u2} Y] {f : X -> Y}, (IsLocallyHomeomorph.{u1, u2} X Y _inst_1 _inst_2 f) -> (IsLocallyHomeomorphOn.{u1, u2} X Y _inst_1 _inst_2 f (Set.univ.{u1} X))
-but is expected to have type
-  forall {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : X -> Y}, (IsLocallyHomeomorph.{u2, u1} X Y _inst_1 _inst_2 f) -> (IsLocallyHomeomorphOn.{u2, u1} X Y _inst_1 _inst_2 f (Set.univ.{u2} X))
-Case conversion may be inaccurate. Consider using '#align is_locally_homeomorph.is_locally_homeomorph_on IsLocallyHomeomorph.isLocallyHomeomorphOnₓ'. -/
 protected theorem IsLocallyHomeomorph.isLocallyHomeomorphOn (hf : IsLocallyHomeomorph f) :
     IsLocallyHomeomorphOn f Set.univ :=
   isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ.mp hf
@@ -154,12 +112,6 @@ variable (f)
 
 namespace IsLocallyHomeomorph
 
-/- warning: is_locally_homeomorph.mk -> IsLocallyHomeomorph.mk is a dubious translation:
-lean 3 declaration is
-  forall {X : Type.{u1}} {Y : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} X] [_inst_2 : TopologicalSpace.{u2} Y] (f : X -> Y), (forall (x : X), Exists.{max (succ u1) (succ u2)} (LocalHomeomorph.{u1, u2} X Y _inst_1 _inst_2) (fun (e : LocalHomeomorph.{u1, u2} X Y _inst_1 _inst_2) => And (Membership.Mem.{u1, u1} X (Set.{u1} X) (Set.hasMem.{u1} X) x (LocalEquiv.source.{u1, u2} X Y (LocalHomeomorph.toLocalEquiv.{u1, u2} X Y _inst_1 _inst_2 e))) (forall (y : X), (Membership.Mem.{u1, u1} X (Set.{u1} X) (Set.hasMem.{u1} X) y (LocalEquiv.source.{u1, u2} X Y (LocalHomeomorph.toLocalEquiv.{u1, u2} X Y _inst_1 _inst_2 e))) -> (Eq.{succ u2} Y (f y) (coeFn.{max (succ u1) (succ u2), max (succ u1) (succ u2)} (LocalHomeomorph.{u1, u2} X Y _inst_1 _inst_2) (fun (_x : LocalHomeomorph.{u1, u2} X Y _inst_1 _inst_2) => X -> Y) (LocalHomeomorph.hasCoeToFun.{u1, u2} X Y _inst_1 _inst_2) e y))))) -> (IsLocallyHomeomorph.{u1, u2} X Y _inst_1 _inst_2 f)
-but is expected to have type
-  forall {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] (f : X -> Y), (forall (x : X), Exists.{max (succ u2) (succ u1)} (LocalHomeomorph.{u2, u1} X Y _inst_1 _inst_2) (fun (e : LocalHomeomorph.{u2, u1} X Y _inst_1 _inst_2) => And (Membership.mem.{u2, u2} X (Set.{u2} X) (Set.instMembershipSet.{u2} X) x (LocalEquiv.source.{u2, u1} X Y (LocalHomeomorph.toLocalEquiv.{u2, u1} X Y _inst_1 _inst_2 e))) (forall (y : X), (Membership.mem.{u2, u2} X (Set.{u2} X) (Set.instMembershipSet.{u2} X) y (LocalEquiv.source.{u2, u1} X Y (LocalHomeomorph.toLocalEquiv.{u2, u1} X Y _inst_1 _inst_2 e))) -> (Eq.{succ u1} Y (f y) (LocalHomeomorph.toFun'.{u2, u1} X Y _inst_1 _inst_2 e y))))) -> (IsLocallyHomeomorph.{u2, u1} X Y _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align is_locally_homeomorph.mk IsLocallyHomeomorph.mkₓ'. -/
 /-- Proves that `f` satisfies `is_locally_homeomorph f`. The condition `h` is weaker than the
 definition of `is_locally_homeomorph f`, since it only requires `e : local_homeomorph X Y` to
 agree with `f` on its source `e.source`, as opposed to on the whole space `X`. -/
@@ -171,42 +123,18 @@ theorem mk (h : ∀ x : X, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ ∀ y
 
 variable {g f}
 
-/- warning: is_locally_homeomorph.map_nhds_eq -> IsLocallyHomeomorph.map_nhds_eq is a dubious translation:
-lean 3 declaration is
-  forall {X : Type.{u1}} {Y : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} X] [_inst_2 : TopologicalSpace.{u2} Y] {f : X -> Y}, (IsLocallyHomeomorph.{u1, u2} X Y _inst_1 _inst_2 f) -> (forall (x : X), Eq.{succ u2} (Filter.{u2} Y) (Filter.map.{u1, u2} X Y f (nhds.{u1} X _inst_1 x)) (nhds.{u2} Y _inst_2 (f x)))
-but is expected to have type
-  forall {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : X -> Y}, (IsLocallyHomeomorph.{u2, u1} X Y _inst_1 _inst_2 f) -> (forall (x : X), Eq.{succ u1} (Filter.{u1} Y) (Filter.map.{u2, u1} X Y f (nhds.{u2} X _inst_1 x)) (nhds.{u1} Y _inst_2 (f x)))
-Case conversion may be inaccurate. Consider using '#align is_locally_homeomorph.map_nhds_eq IsLocallyHomeomorph.map_nhds_eqₓ'. -/
 theorem map_nhds_eq (hf : IsLocallyHomeomorph f) (x : X) : (𝓝 x).map f = 𝓝 (f x) :=
   hf.IsLocallyHomeomorphOn.map_nhds_eq (Set.mem_univ x)
 #align is_locally_homeomorph.map_nhds_eq IsLocallyHomeomorph.map_nhds_eq
 
-/- warning: is_locally_homeomorph.continuous -> IsLocallyHomeomorph.continuous is a dubious translation:
-lean 3 declaration is
-  forall {X : Type.{u1}} {Y : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} X] [_inst_2 : TopologicalSpace.{u2} Y] {f : X -> Y}, (IsLocallyHomeomorph.{u1, u2} X Y _inst_1 _inst_2 f) -> (Continuous.{u1, u2} X Y _inst_1 _inst_2 f)
-but is expected to have type
-  forall {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : X -> Y}, (IsLocallyHomeomorph.{u2, u1} X Y _inst_1 _inst_2 f) -> (Continuous.{u2, u1} X Y _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align is_locally_homeomorph.continuous IsLocallyHomeomorph.continuousₓ'. -/
 protected theorem continuous (hf : IsLocallyHomeomorph f) : Continuous f :=
   continuous_iff_continuousOn_univ.mpr hf.IsLocallyHomeomorphOn.ContinuousOn
 #align is_locally_homeomorph.continuous IsLocallyHomeomorph.continuous
 
-/- warning: is_locally_homeomorph.is_open_map -> IsLocallyHomeomorph.isOpenMap is a dubious translation:
-lean 3 declaration is
-  forall {X : Type.{u1}} {Y : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} X] [_inst_2 : TopologicalSpace.{u2} Y] {f : X -> Y}, (IsLocallyHomeomorph.{u1, u2} X Y _inst_1 _inst_2 f) -> (IsOpenMap.{u1, u2} X Y _inst_1 _inst_2 f)
-but is expected to have type
-  forall {X : Type.{u2}} {Y : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} X] [_inst_2 : TopologicalSpace.{u1} Y] {f : X -> Y}, (IsLocallyHomeomorph.{u2, u1} X Y _inst_1 _inst_2 f) -> (IsOpenMap.{u2, u1} X Y _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align is_locally_homeomorph.is_open_map IsLocallyHomeomorph.isOpenMapₓ'. -/
 protected theorem isOpenMap (hf : IsLocallyHomeomorph f) : IsOpenMap f :=
   IsOpenMap.of_nhds_le fun x => ge_of_eq (hf.map_nhds_eq x)
 #align is_locally_homeomorph.is_open_map IsLocallyHomeomorph.isOpenMap
 
-/- warning: is_locally_homeomorph.comp -> IsLocallyHomeomorph.comp is a dubious translation:
-lean 3 declaration is
-  forall {X : Type.{u1}} {Y : Type.{u2}} {Z : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} X] [_inst_2 : TopologicalSpace.{u2} Y] [_inst_3 : TopologicalSpace.{u3} Z] {g : Y -> Z} {f : X -> Y}, (IsLocallyHomeomorph.{u2, u3} Y Z _inst_2 _inst_3 g) -> (IsLocallyHomeomorph.{u1, u2} X Y _inst_1 _inst_2 f) -> (IsLocallyHomeomorph.{u1, u3} X Z _inst_1 _inst_3 (Function.comp.{succ u1, succ u2, succ u3} X Y Z g f))
-but is expected to have type
-  forall {X : Type.{u1}} {Y : Type.{u3}} {Z : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} X] [_inst_2 : TopologicalSpace.{u3} Y] [_inst_3 : TopologicalSpace.{u2} Z] {g : Y -> Z} {f : X -> Y}, (IsLocallyHomeomorph.{u3, u2} Y Z _inst_2 _inst_3 g) -> (IsLocallyHomeomorph.{u1, u3} X Y _inst_1 _inst_2 f) -> (IsLocallyHomeomorph.{u1, u2} X Z _inst_1 _inst_3 (Function.comp.{succ u1, succ u3, succ u2} X Y Z g f))
-Case conversion may be inaccurate. Consider using '#align is_locally_homeomorph.comp IsLocallyHomeomorph.compₓ'. -/
 protected theorem comp (hg : IsLocallyHomeomorph g) (hf : IsLocallyHomeomorph f) :
     IsLocallyHomeomorph (g ∘ f) :=
   isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ.mpr
Diff
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Thomas Browning
 
 ! This file was ported from Lean 3 source module topology.is_locally_homeomorph
-! leanprover-community/mathlib commit f2ce6086713c78a7f880485f7917ea547a215982
+! leanprover-community/mathlib commit 23aa88e32dcc9d2a24cca7bc23268567ed4cd7d6
 ! Please do not edit these lines, except to modify the commit id
 ! if you have ported upstream changes.
 -/
@@ -13,6 +13,9 @@ import Mathbin.Topology.LocalHomeomorph
 /-!
 # Local homeomorphisms
 
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
 This file defines local homeomorphisms.
 
 ## Main definitions

Changes in mathlib4

mathlib3
mathlib4
style: replace '.-/' by '. -/' (#11938)

Purely automatic replacement. If this is in any way controversial; I'm happy to just close this PR.

Diff
@@ -231,7 +231,8 @@ theorem openEmbedding_of_comp (hf : IsLocalHomeomorph g) (hgf : OpenEmbedding (g
   (hgf.isLocalHomeomorph.of_comp hf cont).openEmbedding_of_injective hgf.inj.of_comp
 
 open TopologicalSpace in
-/-- Ranges of continuous local sections of a local homeomorphism form a basis of the source space.-/
+/-- Ranges of continuous local sections of a local homeomorphism
+form a basis of the source space. -/
 theorem isTopologicalBasis (hf : IsLocalHomeomorph f) : IsTopologicalBasis
     {U : Set X | ∃ V : Set Y, IsOpen V ∧ ∃ s : C(V,X), f ∘ s = (↑) ∧ Set.range s = U} := by
   refine isTopologicalBasis_of_isOpen_of_nhds ?_ fun x U hx hU ↦ ?_
chore: rename open_range to isOpen_range, closed_range to isClosed_range (#11438)

All these lemmas refer to the range of some function being open/range (i.e. isOpen or isClosed).

Diff
@@ -236,7 +236,7 @@ theorem isTopologicalBasis (hf : IsLocalHomeomorph f) : IsTopologicalBasis
     {U : Set X | ∃ V : Set Y, IsOpen V ∧ ∃ s : C(V,X), f ∘ s = (↑) ∧ Set.range s = U} := by
   refine isTopologicalBasis_of_isOpen_of_nhds ?_ fun x U hx hU ↦ ?_
   · rintro _ ⟨U, hU, s, hs, rfl⟩
-    refine (openEmbedding_of_comp hf (hs ▸ ⟨embedding_subtype_val, ?_⟩) s.continuous).open_range
+    refine (openEmbedding_of_comp hf (hs ▸ ⟨embedding_subtype_val, ?_⟩) s.continuous).isOpen_range
     rwa [Subtype.range_val]
   · obtain ⟨f, hxf, rfl⟩ := hf x
     refine ⟨f.source ∩ U, ⟨f.target ∩ f.symm ⁻¹' U, f.symm.isOpen_inter_preimage hU,
chore: remove stream-of-consciousness uses of have, replace and suffices (#10640)

No changes to tactic file, it's just boring fixes throughout the library.

This follows on from #6964.

Co-authored-by: sgouezel <sebastien.gouezel@univ-rennes1.fr> Co-authored-by: Eric Wieser <wieser.eric@gmail.com>

Diff
@@ -48,8 +48,8 @@ theorem isLocalHomeomorphOn_iff_openEmbedding_restrict {f : X → Y} :
   · obtain ⟨e, hxe, rfl⟩ := h x hx
     exact ⟨e.source, e.open_source.mem_nhds hxe, e.openEmbedding_restrict⟩
   · obtain ⟨U, hU, emb⟩ := h x hx
-    have : OpenEmbedding ((interior U).restrict f)
-    · refine emb.comp ⟨embedding_inclusion interior_subset, ?_⟩
+    have : OpenEmbedding ((interior U).restrict f) := by
+      refine emb.comp ⟨embedding_inclusion interior_subset, ?_⟩
       rw [Set.range_inclusion]; exact isOpen_induced isOpen_interior
     obtain ⟨cont, inj, openMap⟩ := openEmbedding_iff_continuous_injective_open.mp this
     haveI : Nonempty X := ⟨x⟩
feat: bijective local homeomorphisms are homeomorphisms (#9247)

Basis for generalising the result for local diffeomorphism to local structomorphisms.

Co-authored-by: grunweg <grunweg@posteo.de>

Diff
@@ -214,6 +214,17 @@ theorem openEmbedding_of_injective (hf : IsLocalHomeomorph f) (hi : f.Injective)
     OpenEmbedding f :=
   openEmbedding_of_continuous_injective_open hf.continuous hi hf.isOpenMap
 
+/-- A surjective embedding is a homeomorphism. -/
+noncomputable def _root_.Embedding.toHomeomeomorph_of_surjective (hf : Embedding f)
+    (hsurj : Function.Surjective f) : X ≃ₜ Y :=
+  Homeomorph.homeomorphOfContinuousOpen (Equiv.ofBijective f ⟨hf.inj, hsurj⟩)
+    hf.continuous (hf.toOpenEmbedding_of_surjective hsurj).isOpenMap
+
+/-- A bijective local homeomorphism is a homeomorphism. -/
+noncomputable def toHomeomorph_of_bijective (hf : IsLocalHomeomorph f) (hb : f.Bijective) :
+    X ≃ₜ Y :=
+  Homeomorph.homeomorphOfContinuousOpen (Equiv.ofBijective f hb) hf.continuous hf.isOpenMap
+
 /-- Continuous local sections of a local homeomorphism are open embeddings. -/
 theorem openEmbedding_of_comp (hf : IsLocalHomeomorph g) (hgf : OpenEmbedding (g ∘ f))
     (cont : Continuous f) : OpenEmbedding f :=
feat: (partial) homeomorphisms are local homeomorphisms (#9246)

Co-authored-by: grunweg <grunweg@posteo.de>

Diff
@@ -77,6 +77,11 @@ theorem mk (h : ∀ x ∈ s, ∃ e : PartialHomeomorph X Y, x ∈ e.source ∧ S
       hx, rfl⟩
 #align is_locally_homeomorph_on.mk IsLocalHomeomorphOn.mk
 
+/-- A `PartialHomeomorph` is a local homeomorphism on its source. -/
+lemma PartialHomeomorph.isLocalHomeomorphOn (e : PartialHomeomorph X Y) :
+    IsLocalHomeomorphOn e e.source :=
+  fun _ hx ↦ ⟨e, hx, rfl⟩
+
 variable {g f s t}
 
 theorem mono {t : Set X} (hf : IsLocalHomeomorphOn f t) (hst : s ⊆ t) : IsLocalHomeomorphOn f s :=
@@ -169,6 +174,10 @@ theorem mk (h : ∀ x : X, ∃ e : PartialHomeomorph X Y, x ∈ e.source ∧ Set
     (IsLocalHomeomorphOn.mk f Set.univ fun x _hx ↦ h x)
 #align is_locally_homeomorph.mk IsLocalHomeomorph.mk
 
+/-- A homeomorphism is a local homeomorphism. -/
+lemma Homeomorph.isLocalHomeomorph (h : X ≃ₜ Y) : IsLocalHomeomorph h :=
+  fun _ ↦ ⟨h.toPartialHomeomorph, trivial, rfl⟩
+
 variable {g f}
 
 lemma isLocallyInjective (hf : IsLocalHomeomorph f) : IsLocallyInjective f :=
refactor(Topology/IsLocalHomeomorph): various small clean-ups (#9150)
  • revamp and extend the module docstring
  • add some lemma docstrings
  • use EqOn where possible
  • use \mapsto instead of =>
  • replace one terminal rfl by the explicit lemma invoked
Diff
@@ -15,12 +15,19 @@ This file defines local homeomorphisms.
 
 ## Main definitions
 
-* `IsLocalHomeomorph`: A function `f : X → Y` satisfies `IsLocalHomeomorph` if for each
-  point `x : X`, the restriction of `f` to some open neighborhood `U` of `x` gives a homeomorphism
+For a function `f : X → Y ` between topological spaces, we say
+* `IsLocalHomeomorphOn f s` if `f` is a local homeomorphism around each point of `s`: for each
+  `x : X`, the restriction of `f` to some open neighborhood `U` of `x` gives a homeomorphism
   between `U` and an open subset of `Y`.
+* `IsLocalHomeomorph f`: `f` is a local homeomorphism, i.e. it's a local homeomorphism on `univ`.
+
+Note that `IsLocalHomeomorph` is a global condition. This is in contrast to
+`PartialHomeomorph`, which is a homeomorphism between specific open subsets.
+
+## Main results
+* local homeomorphisms are locally injective open maps
+* more!
 
-  Note that `IsLocalHomeomorph` is a global condition. This is in contrast to
-  `PartialHomeomorph`, which is a homeomorphism between specific open subsets.
 -/
 
 
@@ -56,24 +63,24 @@ namespace IsLocalHomeomorphOn
 /-- Proves that `f` satisfies `IsLocalHomeomorphOn f s`. The condition `h` is weaker than the
 definition of `IsLocalHomeomorphOn f s`, since it only requires `e : PartialHomeomorph X Y` to
 agree with `f` on its source `e.source`, as opposed to on the whole space `X`. -/
-theorem mk (h : ∀ x ∈ s, ∃ e : PartialHomeomorph X Y, x ∈ e.source ∧ ∀ y ∈ e.source, f y = e y) :
+theorem mk (h : ∀ x ∈ s, ∃ e : PartialHomeomorph X Y, x ∈ e.source ∧ Set.EqOn f e e.source) :
     IsLocalHomeomorphOn f s := by
   intro x hx
   obtain ⟨e, hx, he⟩ := h x hx
   exact
     ⟨{ e with
         toFun := f
-        map_source' := fun x hx => by rw [he x hx]; exact e.map_source' hx
-        left_inv' := fun x hx => by rw [he x hx]; exact e.left_inv' hx
-        right_inv' := fun y hy => by rw [he _ (e.map_target' hy)]; exact e.right_inv' hy
+        map_source' := fun _x hx ↦ by rw [he hx]; exact e.map_source' hx
+        left_inv' := fun _x hx ↦ by rw [he hx]; exact e.left_inv' hx
+        right_inv' := fun _y hy ↦ by rw [he (e.map_target' hy)]; exact e.right_inv' hy
         continuousOn_toFun := (continuousOn_congr he).mpr e.continuousOn_toFun },
       hx, rfl⟩
 #align is_locally_homeomorph_on.mk IsLocalHomeomorphOn.mk
 
 variable {g f s t}
 
-theorem mono {t : Set X} (hf : IsLocalHomeomorphOn f t) (hst : s ⊆ t) :
-    IsLocalHomeomorphOn f s := fun x hx ↦ hf x (hst hx)
+theorem mono {t : Set X} (hf : IsLocalHomeomorphOn f t) (hst : s ⊆ t) : IsLocalHomeomorphOn f s :=
+  fun x hx ↦ hf x (hst hx)
 
 theorem of_comp_left (hgf : IsLocalHomeomorphOn (g ∘ f) s) (hg : IsLocalHomeomorphOn g (f '' s))
     (cont : ∀ x ∈ s, ContinuousAt f x) : IsLocalHomeomorphOn f s := mk f s fun x hx ↦ by
@@ -84,8 +91,7 @@ theorem of_comp_left (hgf : IsLocalHomeomorphOn (g ∘ f) s) (hg : IsLocalHomeom
     fun y hy ↦ ?_⟩
   change f y = g.symm (gf y)
   have : f y ∈ g.source := by apply interior_subset hy.1.2
-  rw [← he, g.eq_symm_apply this (by apply g.map_source this)]
-  rfl
+  rw [← he, g.eq_symm_apply this (by apply g.map_source this), Function.comp_apply]
 
 theorem of_comp_right (hgf : IsLocalHomeomorphOn (g ∘ f) s) (hf : IsLocalHomeomorphOn f s) :
     IsLocalHomeomorphOn g (f '' s) := mk g _ <| by
@@ -108,7 +114,7 @@ protected theorem continuousAt (hf : IsLocalHomeomorphOn f s) {x : X} (hx : x 
 #align is_locally_homeomorph_on.continuous_at IsLocalHomeomorphOn.continuousAt
 
 protected theorem continuousOn (hf : IsLocalHomeomorphOn f s) : ContinuousOn f s :=
-  ContinuousAt.continuousOn fun _x => hf.continuousAt
+  ContinuousAt.continuousOn fun _x ↦ hf.continuousAt
 #align is_locally_homeomorph_on.continuous_on IsLocalHomeomorphOn.continuousOn
 
 protected theorem comp (hg : IsLocalHomeomorphOn g t) (hf : IsLocalHomeomorphOn f s)
@@ -157,10 +163,10 @@ namespace IsLocalHomeomorph
 /-- Proves that `f` satisfies `IsLocalHomeomorph f`. The condition `h` is weaker than the
 definition of `IsLocalHomeomorph f`, since it only requires `e : PartialHomeomorph X Y` to
 agree with `f` on its source `e.source`, as opposed to on the whole space `X`. -/
-theorem mk (h : ∀ x : X, ∃ e : PartialHomeomorph X Y, x ∈ e.source ∧ ∀ y ∈ e.source, f y = e y) :
+theorem mk (h : ∀ x : X, ∃ e : PartialHomeomorph X Y, x ∈ e.source ∧ Set.EqOn f e e.source) :
     IsLocalHomeomorph f :=
   isLocalHomeomorph_iff_isLocalHomeomorphOn_univ.mpr
-    (IsLocalHomeomorphOn.mk f Set.univ fun x _hx => h x)
+    (IsLocalHomeomorphOn.mk f Set.univ fun x _hx ↦ h x)
 #align is_locally_homeomorph.mk IsLocalHomeomorph.mk
 
 variable {g f}
@@ -177,20 +183,24 @@ theorem map_nhds_eq (hf : IsLocalHomeomorph f) (x : X) : (𝓝 x).map f = 𝓝 (
   hf.isLocalHomeomorphOn.map_nhds_eq (Set.mem_univ x)
 #align is_locally_homeomorph.map_nhds_eq IsLocalHomeomorph.map_nhds_eq
 
+/-- A local homeomorphism is continuous. -/
 protected theorem continuous (hf : IsLocalHomeomorph f) : Continuous f :=
   continuous_iff_continuousOn_univ.mpr hf.isLocalHomeomorphOn.continuousOn
 #align is_locally_homeomorph.continuous IsLocalHomeomorph.continuous
 
+/-- A local homeomorphism is an open map. -/
 protected theorem isOpenMap (hf : IsLocalHomeomorph f) : IsOpenMap f :=
-  IsOpenMap.of_nhds_le fun x => ge_of_eq (hf.map_nhds_eq x)
+  IsOpenMap.of_nhds_le fun x ↦ ge_of_eq (hf.map_nhds_eq x)
 #align is_locally_homeomorph.is_open_map IsLocalHomeomorph.isOpenMap
 
+/-- The composition of local homeomorphisms is a local homeomorphism. -/
 protected theorem comp (hg : IsLocalHomeomorph g) (hf : IsLocalHomeomorph f) :
     IsLocalHomeomorph (g ∘ f) :=
   isLocalHomeomorph_iff_isLocalHomeomorphOn_univ.mpr
     (hg.isLocalHomeomorphOn.comp hf.isLocalHomeomorphOn (Set.univ.mapsTo_univ f))
 #align is_locally_homeomorph.comp IsLocalHomeomorph.comp
 
+/-- An injective local homeomorphism is an open embedding. -/
 theorem openEmbedding_of_injective (hf : IsLocalHomeomorph f) (hi : f.Injective) :
     OpenEmbedding f :=
   openEmbedding_of_continuous_injective_open hf.continuous hi hf.isOpenMap
chore: rename LocalEquiv to PartialEquiv (#8984)

The current name is misleading: there's no open set involved; it's just an equivalence between subsets of domain and target. zulip discussion

PEquiv is similarly named: this is fine, as they're different designs for the same concept.

Co-authored-by: Michael Rothgang <rothgami@math.hu-berlin.de>

Diff
@@ -46,7 +46,8 @@ theorem isLocalHomeomorphOn_iff_openEmbedding_restrict {f : X → Y} :
       rw [Set.range_inclusion]; exact isOpen_induced isOpen_interior
     obtain ⟨cont, inj, openMap⟩ := openEmbedding_iff_continuous_injective_open.mp this
     haveI : Nonempty X := ⟨x⟩
-    exact ⟨PartialHomeomorph.ofContinuousOpenRestrict (Set.injOn_iff_injective.mpr inj).toLocalEquiv
+    exact ⟨PartialHomeomorph.ofContinuousOpenRestrict
+      (Set.injOn_iff_injective.mpr inj).toPartialEquiv
       (continuousOn_iff_continuous_restrict.mpr cont) openMap isOpen_interior,
       mem_interior_iff_mem_nhds.mpr hU, rfl⟩
 
chore: rename LocalHomeomorph to PartialHomeomorph (#8982)

LocalHomeomorph evokes a "local homeomorphism": this is not what this means. Instead, this is a homeomorphism on an open set of the domain (extended to the whole space, by the junk value pattern). Hence, partial homeomorphism is more appropriate, and avoids confusion with IsLocallyHomeomorph.

A future PR will rename LocalEquiv to PartialEquiv.

Zulip discussion

Diff
@@ -3,7 +3,7 @@ Copyright (c) 2021 Thomas Browning. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Thomas Browning
 -/
-import Mathlib.Topology.LocalHomeomorph
+import Mathlib.Topology.PartialHomeomorph
 import Mathlib.Topology.SeparatedMap
 
 #align_import topology.is_locally_homeomorph from "leanprover-community/mathlib"@"e97cf15cd1aec9bd5c193b2ffac5a6dc9118912b"
@@ -20,7 +20,7 @@ This file defines local homeomorphisms.
   between `U` and an open subset of `Y`.
 
   Note that `IsLocalHomeomorph` is a global condition. This is in contrast to
-  `LocalHomeomorph`, which is a homeomorphism between specific open subsets.
+  `PartialHomeomorph`, which is a homeomorphism between specific open subsets.
 -/
 
 
@@ -30,9 +30,9 @@ variable {X Y Z : Type*} [TopologicalSpace X] [TopologicalSpace Y] [TopologicalS
   (f : X → Y) (s : Set X) (t : Set Y)
 
 /-- A function `f : X → Y` satisfies `IsLocalHomeomorphOn f s` if each `x ∈ s` is contained in
-the source of some `e : LocalHomeomorph X Y` with `f = e`. -/
+the source of some `e : PartialHomeomorph X Y` with `f = e`. -/
 def IsLocalHomeomorphOn :=
-  ∀ x ∈ s, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ f = e
+  ∀ x ∈ s, ∃ e : PartialHomeomorph X Y, x ∈ e.source ∧ f = e
 #align is_locally_homeomorph_on IsLocalHomeomorphOn
 
 theorem isLocalHomeomorphOn_iff_openEmbedding_restrict {f : X → Y} :
@@ -46,16 +46,16 @@ theorem isLocalHomeomorphOn_iff_openEmbedding_restrict {f : X → Y} :
       rw [Set.range_inclusion]; exact isOpen_induced isOpen_interior
     obtain ⟨cont, inj, openMap⟩ := openEmbedding_iff_continuous_injective_open.mp this
     haveI : Nonempty X := ⟨x⟩
-    exact ⟨LocalHomeomorph.ofContinuousOpenRestrict (Set.injOn_iff_injective.mpr inj).toLocalEquiv
+    exact ⟨PartialHomeomorph.ofContinuousOpenRestrict (Set.injOn_iff_injective.mpr inj).toLocalEquiv
       (continuousOn_iff_continuous_restrict.mpr cont) openMap isOpen_interior,
       mem_interior_iff_mem_nhds.mpr hU, rfl⟩
 
 namespace IsLocalHomeomorphOn
 
 /-- Proves that `f` satisfies `IsLocalHomeomorphOn f s`. The condition `h` is weaker than the
-definition of `IsLocalHomeomorphOn f s`, since it only requires `e : LocalHomeomorph X Y` to
+definition of `IsLocalHomeomorphOn f s`, since it only requires `e : PartialHomeomorph X Y` to
 agree with `f` on its source `e.source`, as opposed to on the whole space `X`. -/
-theorem mk (h : ∀ x ∈ s, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ ∀ y ∈ e.source, f y = e y) :
+theorem mk (h : ∀ x ∈ s, ∃ e : PartialHomeomorph X Y, x ∈ e.source ∧ ∀ y ∈ e.source, f y = e y) :
     IsLocalHomeomorphOn f s := by
   intro x hx
   obtain ⟨e, hx, he⟩ := h x hx
@@ -121,13 +121,13 @@ protected theorem comp (hg : IsLocalHomeomorphOn g t) (hf : IsLocalHomeomorphOn
 end IsLocalHomeomorphOn
 
 /-- A function `f : X → Y` satisfies `IsLocalHomeomorph f` if each `x : x` is contained in
-  the source of some `e : LocalHomeomorph X Y` with `f = e`. -/
+  the source of some `e : PartialHomeomorph X Y` with `f = e`. -/
 def IsLocalHomeomorph :=
-  ∀ x : X, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ f = e
+  ∀ x : X, ∃ e : PartialHomeomorph X Y, x ∈ e.source ∧ f = e
 #align is_locally_homeomorph IsLocalHomeomorph
 
 theorem Homeomorph.isLocalHomeomorph (f : X ≃ₜ Y) : IsLocalHomeomorph f :=
-  fun _ ↦ ⟨f.toLocalHomeomorph, trivial, rfl⟩
+  fun _ ↦ ⟨f.toPartialHomeomorph, trivial, rfl⟩
 
 variable {f s}
 
@@ -154,9 +154,9 @@ variable (f)
 namespace IsLocalHomeomorph
 
 /-- Proves that `f` satisfies `IsLocalHomeomorph f`. The condition `h` is weaker than the
-definition of `IsLocalHomeomorph f`, since it only requires `e : LocalHomeomorph X Y` to
+definition of `IsLocalHomeomorph f`, since it only requires `e : PartialHomeomorph X Y` to
 agree with `f` on its source `e.source`, as opposed to on the whole space `X`. -/
-theorem mk (h : ∀ x : X, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ ∀ y ∈ e.source, f y = e y) :
+theorem mk (h : ∀ x : X, ∃ e : PartialHomeomorph X Y, x ∈ e.source ∧ ∀ y ∈ e.source, f y = e y) :
     IsLocalHomeomorph f :=
   isLocalHomeomorph_iff_isLocalHomeomorphOn_univ.mpr
     (IsLocalHomeomorphOn.mk f Set.univ fun x _hx => h x)
chore: rename IsLocallyHomeomorph{On} to IsLocalHomeomorph{On} (#8983)

This matches informal math terminology: IsLocallyHomeomorph f means "f is a local homeomorphism".

zulip discussion

Diff
@@ -15,11 +15,11 @@ This file defines local homeomorphisms.
 
 ## Main definitions
 
-* `IsLocallyHomeomorph`: A function `f : X → Y` satisfies `IsLocallyHomeomorph` if for each
+* `IsLocalHomeomorph`: A function `f : X → Y` satisfies `IsLocalHomeomorph` if for each
   point `x : X`, the restriction of `f` to some open neighborhood `U` of `x` gives a homeomorphism
   between `U` and an open subset of `Y`.
 
-  Note that `IsLocallyHomeomorph` is a global condition. This is in contrast to
+  Note that `IsLocalHomeomorph` is a global condition. This is in contrast to
   `LocalHomeomorph`, which is a homeomorphism between specific open subsets.
 -/
 
@@ -29,14 +29,14 @@ open Topology
 variable {X Y Z : Type*} [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z] (g : Y → Z)
   (f : X → Y) (s : Set X) (t : Set Y)
 
-/-- A function `f : X → Y` satisfies `IsLocallyHomeomorphOn f s` if each `x ∈ s` is contained in
+/-- A function `f : X → Y` satisfies `IsLocalHomeomorphOn f s` if each `x ∈ s` is contained in
 the source of some `e : LocalHomeomorph X Y` with `f = e`. -/
-def IsLocallyHomeomorphOn :=
+def IsLocalHomeomorphOn :=
   ∀ x ∈ s, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ f = e
-#align is_locally_homeomorph_on IsLocallyHomeomorphOn
+#align is_locally_homeomorph_on IsLocalHomeomorphOn
 
-theorem isLocallyHomeomorphOn_iff_openEmbedding_restrict {f : X → Y} :
-    IsLocallyHomeomorphOn f s ↔ ∀ x ∈ s, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f) := by
+theorem isLocalHomeomorphOn_iff_openEmbedding_restrict {f : X → Y} :
+    IsLocalHomeomorphOn f s ↔ ∀ x ∈ s, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f) := by
   refine ⟨fun h x hx ↦ ?_, fun h x hx ↦ ?_⟩
   · obtain ⟨e, hxe, rfl⟩ := h x hx
     exact ⟨e.source, e.open_source.mem_nhds hxe, e.openEmbedding_restrict⟩
@@ -50,13 +50,13 @@ theorem isLocallyHomeomorphOn_iff_openEmbedding_restrict {f : X → Y} :
       (continuousOn_iff_continuous_restrict.mpr cont) openMap isOpen_interior,
       mem_interior_iff_mem_nhds.mpr hU, rfl⟩
 
-namespace IsLocallyHomeomorphOn
+namespace IsLocalHomeomorphOn
 
-/-- Proves that `f` satisfies `IsLocallyHomeomorphOn f s`. The condition `h` is weaker than the
-definition of `IsLocallyHomeomorphOn f s`, since it only requires `e : LocalHomeomorph X Y` to
+/-- Proves that `f` satisfies `IsLocalHomeomorphOn f s`. The condition `h` is weaker than the
+definition of `IsLocalHomeomorphOn f s`, since it only requires `e : LocalHomeomorph X Y` to
 agree with `f` on its source `e.source`, as opposed to on the whole space `X`. -/
 theorem mk (h : ∀ x ∈ s, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ ∀ y ∈ e.source, f y = e y) :
-    IsLocallyHomeomorphOn f s := by
+    IsLocalHomeomorphOn f s := by
   intro x hx
   obtain ⟨e, hx, he⟩ := h x hx
   exact
@@ -67,15 +67,15 @@ theorem mk (h : ∀ x ∈ s, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ ∀
         right_inv' := fun y hy => by rw [he _ (e.map_target' hy)]; exact e.right_inv' hy
         continuousOn_toFun := (continuousOn_congr he).mpr e.continuousOn_toFun },
       hx, rfl⟩
-#align is_locally_homeomorph_on.mk IsLocallyHomeomorphOn.mk
+#align is_locally_homeomorph_on.mk IsLocalHomeomorphOn.mk
 
 variable {g f s t}
 
-theorem mono {t : Set X} (hf : IsLocallyHomeomorphOn f t) (hst : s ⊆ t) :
-    IsLocallyHomeomorphOn f s := fun x hx ↦ hf x (hst hx)
+theorem mono {t : Set X} (hf : IsLocalHomeomorphOn f t) (hst : s ⊆ t) :
+    IsLocalHomeomorphOn f s := fun x hx ↦ hf x (hst hx)
 
-theorem of_comp_left (hgf : IsLocallyHomeomorphOn (g ∘ f) s) (hg : IsLocallyHomeomorphOn g (f '' s))
-    (cont : ∀ x ∈ s, ContinuousAt f x) : IsLocallyHomeomorphOn f s := mk f s fun x hx ↦ by
+theorem of_comp_left (hgf : IsLocalHomeomorphOn (g ∘ f) s) (hg : IsLocalHomeomorphOn g (f '' s))
+    (cont : ∀ x ∈ s, ContinuousAt f x) : IsLocalHomeomorphOn f s := mk f s fun x hx ↦ by
   obtain ⟨g, hxg, rfl⟩ := hg (f x) ⟨x, hx, rfl⟩
   obtain ⟨gf, hgf, he⟩ := hgf x hx
   refine ⟨(gf.restr <| f ⁻¹' g.source).trans g.symm, ⟨⟨hgf, mem_interior_iff_mem_nhds.mpr
@@ -86,8 +86,8 @@ theorem of_comp_left (hgf : IsLocallyHomeomorphOn (g ∘ f) s) (hg : IsLocallyHo
   rw [← he, g.eq_symm_apply this (by apply g.map_source this)]
   rfl
 
-theorem of_comp_right (hgf : IsLocallyHomeomorphOn (g ∘ f) s) (hf : IsLocallyHomeomorphOn f s) :
-    IsLocallyHomeomorphOn g (f '' s) := mk g _ <| by
+theorem of_comp_right (hgf : IsLocalHomeomorphOn (g ∘ f) s) (hf : IsLocalHomeomorphOn f s) :
+    IsLocalHomeomorphOn g (f '' s) := mk g _ <| by
   rintro _ ⟨x, hx, rfl⟩
   obtain ⟨f, hxf, rfl⟩ := hf x hx
   obtain ⟨gf, hgf, he⟩ := hgf x hx
@@ -96,112 +96,112 @@ theorem of_comp_right (hgf : IsLocallyHomeomorphOn (g ∘ f) s) (hf : IsLocallyH
   · change g y = gf (f.symm y)
     rw [← he, Function.comp_apply, f.right_inv hy.1]
 
-theorem map_nhds_eq (hf : IsLocallyHomeomorphOn f s) {x : X} (hx : x ∈ s) : (𝓝 x).map f = 𝓝 (f x) :=
+theorem map_nhds_eq (hf : IsLocalHomeomorphOn f s) {x : X} (hx : x ∈ s) : (𝓝 x).map f = 𝓝 (f x) :=
   let ⟨e, hx, he⟩ := hf x hx
   he.symm ▸ e.map_nhds_eq hx
-#align is_locally_homeomorph_on.map_nhds_eq IsLocallyHomeomorphOn.map_nhds_eq
+#align is_locally_homeomorph_on.map_nhds_eq IsLocalHomeomorphOn.map_nhds_eq
 
-protected theorem continuousAt (hf : IsLocallyHomeomorphOn f s) {x : X} (hx : x ∈ s) :
+protected theorem continuousAt (hf : IsLocalHomeomorphOn f s) {x : X} (hx : x ∈ s) :
     ContinuousAt f x :=
   (hf.map_nhds_eq hx).le
-#align is_locally_homeomorph_on.continuous_at IsLocallyHomeomorphOn.continuousAt
+#align is_locally_homeomorph_on.continuous_at IsLocalHomeomorphOn.continuousAt
 
-protected theorem continuousOn (hf : IsLocallyHomeomorphOn f s) : ContinuousOn f s :=
+protected theorem continuousOn (hf : IsLocalHomeomorphOn f s) : ContinuousOn f s :=
   ContinuousAt.continuousOn fun _x => hf.continuousAt
-#align is_locally_homeomorph_on.continuous_on IsLocallyHomeomorphOn.continuousOn
+#align is_locally_homeomorph_on.continuous_on IsLocalHomeomorphOn.continuousOn
 
-protected theorem comp (hg : IsLocallyHomeomorphOn g t) (hf : IsLocallyHomeomorphOn f s)
-    (h : Set.MapsTo f s t) : IsLocallyHomeomorphOn (g ∘ f) s := by
+protected theorem comp (hg : IsLocalHomeomorphOn g t) (hf : IsLocalHomeomorphOn f s)
+    (h : Set.MapsTo f s t) : IsLocalHomeomorphOn (g ∘ f) s := by
   intro x hx
   obtain ⟨eg, hxg, rfl⟩ := hg (f x) (h hx)
   obtain ⟨ef, hxf, rfl⟩ := hf x hx
   exact ⟨ef.trans eg, ⟨hxf, hxg⟩, rfl⟩
-#align is_locally_homeomorph_on.comp IsLocallyHomeomorphOn.comp
+#align is_locally_homeomorph_on.comp IsLocalHomeomorphOn.comp
 
-end IsLocallyHomeomorphOn
+end IsLocalHomeomorphOn
 
-/-- A function `f : X → Y` satisfies `IsLocallyHomeomorph f` if each `x : x` is contained in
+/-- A function `f : X → Y` satisfies `IsLocalHomeomorph f` if each `x : x` is contained in
   the source of some `e : LocalHomeomorph X Y` with `f = e`. -/
-def IsLocallyHomeomorph :=
+def IsLocalHomeomorph :=
   ∀ x : X, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ f = e
-#align is_locally_homeomorph IsLocallyHomeomorph
+#align is_locally_homeomorph IsLocalHomeomorph
 
-theorem Homeomorph.isLocallyHomeomorph (f : X ≃ₜ Y) : IsLocallyHomeomorph f :=
+theorem Homeomorph.isLocalHomeomorph (f : X ≃ₜ Y) : IsLocalHomeomorph f :=
   fun _ ↦ ⟨f.toLocalHomeomorph, trivial, rfl⟩
 
 variable {f s}
 
-theorem isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ :
-    IsLocallyHomeomorph f ↔ IsLocallyHomeomorphOn f Set.univ :=
+theorem isLocalHomeomorph_iff_isLocalHomeomorphOn_univ :
+    IsLocalHomeomorph f ↔ IsLocalHomeomorphOn f Set.univ :=
   ⟨fun h x _ ↦ h x, fun h x ↦ h x trivial⟩
-#align is_locally_homeomorph_iff_is_locally_homeomorph_on_univ isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ
+#align is_locally_homeomorph_iff_is_locally_homeomorph_on_univ isLocalHomeomorph_iff_isLocalHomeomorphOn_univ
 
-protected theorem IsLocallyHomeomorph.isLocallyHomeomorphOn (hf : IsLocallyHomeomorph f) :
-    IsLocallyHomeomorphOn f s := fun x _ ↦ hf x
-#align is_locally_homeomorph.is_locally_homeomorph_on IsLocallyHomeomorph.isLocallyHomeomorphOn
+protected theorem IsLocalHomeomorph.isLocalHomeomorphOn (hf : IsLocalHomeomorph f) :
+    IsLocalHomeomorphOn f s := fun x _ ↦ hf x
+#align is_locally_homeomorph.is_locally_homeomorph_on IsLocalHomeomorph.isLocalHomeomorphOn
 
-theorem isLocallyHomeomorph_iff_openEmbedding_restrict {f : X → Y} :
-    IsLocallyHomeomorph f ↔ ∀ x : X, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f) := by
-  simp_rw [isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ,
-    isLocallyHomeomorphOn_iff_openEmbedding_restrict, imp_iff_right (Set.mem_univ _)]
+theorem isLocalHomeomorph_iff_openEmbedding_restrict {f : X → Y} :
+    IsLocalHomeomorph f ↔ ∀ x : X, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f) := by
+  simp_rw [isLocalHomeomorph_iff_isLocalHomeomorphOn_univ,
+    isLocalHomeomorphOn_iff_openEmbedding_restrict, imp_iff_right (Set.mem_univ _)]
 
-theorem OpenEmbedding.isLocallyHomeomorph (hf : OpenEmbedding f) : IsLocallyHomeomorph f :=
-  isLocallyHomeomorph_iff_openEmbedding_restrict.mpr fun _ ↦
+theorem OpenEmbedding.isLocalHomeomorph (hf : OpenEmbedding f) : IsLocalHomeomorph f :=
+  isLocalHomeomorph_iff_openEmbedding_restrict.mpr fun _ ↦
     ⟨_, Filter.univ_mem, hf.comp (Homeomorph.Set.univ X).openEmbedding⟩
 
 variable (f)
 
-namespace IsLocallyHomeomorph
+namespace IsLocalHomeomorph
 
-/-- Proves that `f` satisfies `IsLocallyHomeomorph f`. The condition `h` is weaker than the
-definition of `IsLocallyHomeomorph f`, since it only requires `e : LocalHomeomorph X Y` to
+/-- Proves that `f` satisfies `IsLocalHomeomorph f`. The condition `h` is weaker than the
+definition of `IsLocalHomeomorph f`, since it only requires `e : LocalHomeomorph X Y` to
 agree with `f` on its source `e.source`, as opposed to on the whole space `X`. -/
 theorem mk (h : ∀ x : X, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ ∀ y ∈ e.source, f y = e y) :
-    IsLocallyHomeomorph f :=
-  isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ.mpr
-    (IsLocallyHomeomorphOn.mk f Set.univ fun x _hx => h x)
-#align is_locally_homeomorph.mk IsLocallyHomeomorph.mk
+    IsLocalHomeomorph f :=
+  isLocalHomeomorph_iff_isLocalHomeomorphOn_univ.mpr
+    (IsLocalHomeomorphOn.mk f Set.univ fun x _hx => h x)
+#align is_locally_homeomorph.mk IsLocalHomeomorph.mk
 
 variable {g f}
 
-lemma isLocallyInjective (hf : IsLocallyHomeomorph f) : IsLocallyInjective f :=
+lemma isLocallyInjective (hf : IsLocalHomeomorph f) : IsLocallyInjective f :=
   fun x ↦ by obtain ⟨f, hx, rfl⟩ := hf x; exact ⟨f.source, f.open_source, hx, f.injOn⟩
 
-theorem of_comp (hgf : IsLocallyHomeomorph (g ∘ f)) (hg : IsLocallyHomeomorph g)
-    (cont : Continuous f) : IsLocallyHomeomorph f :=
-  isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ.mpr <|
-    hgf.isLocallyHomeomorphOn.of_comp_left hg.isLocallyHomeomorphOn fun _ _ ↦ cont.continuousAt
+theorem of_comp (hgf : IsLocalHomeomorph (g ∘ f)) (hg : IsLocalHomeomorph g)
+    (cont : Continuous f) : IsLocalHomeomorph f :=
+  isLocalHomeomorph_iff_isLocalHomeomorphOn_univ.mpr <|
+    hgf.isLocalHomeomorphOn.of_comp_left hg.isLocalHomeomorphOn fun _ _ ↦ cont.continuousAt
 
-theorem map_nhds_eq (hf : IsLocallyHomeomorph f) (x : X) : (𝓝 x).map f = 𝓝 (f x) :=
-  hf.isLocallyHomeomorphOn.map_nhds_eq (Set.mem_univ x)
-#align is_locally_homeomorph.map_nhds_eq IsLocallyHomeomorph.map_nhds_eq
+theorem map_nhds_eq (hf : IsLocalHomeomorph f) (x : X) : (𝓝 x).map f = 𝓝 (f x) :=
+  hf.isLocalHomeomorphOn.map_nhds_eq (Set.mem_univ x)
+#align is_locally_homeomorph.map_nhds_eq IsLocalHomeomorph.map_nhds_eq
 
-protected theorem continuous (hf : IsLocallyHomeomorph f) : Continuous f :=
-  continuous_iff_continuousOn_univ.mpr hf.isLocallyHomeomorphOn.continuousOn
-#align is_locally_homeomorph.continuous IsLocallyHomeomorph.continuous
+protected theorem continuous (hf : IsLocalHomeomorph f) : Continuous f :=
+  continuous_iff_continuousOn_univ.mpr hf.isLocalHomeomorphOn.continuousOn
+#align is_locally_homeomorph.continuous IsLocalHomeomorph.continuous
 
-protected theorem isOpenMap (hf : IsLocallyHomeomorph f) : IsOpenMap f :=
+protected theorem isOpenMap (hf : IsLocalHomeomorph f) : IsOpenMap f :=
   IsOpenMap.of_nhds_le fun x => ge_of_eq (hf.map_nhds_eq x)
-#align is_locally_homeomorph.is_open_map IsLocallyHomeomorph.isOpenMap
+#align is_locally_homeomorph.is_open_map IsLocalHomeomorph.isOpenMap
 
-protected theorem comp (hg : IsLocallyHomeomorph g) (hf : IsLocallyHomeomorph f) :
-    IsLocallyHomeomorph (g ∘ f) :=
-  isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ.mpr
-    (hg.isLocallyHomeomorphOn.comp hf.isLocallyHomeomorphOn (Set.univ.mapsTo_univ f))
-#align is_locally_homeomorph.comp IsLocallyHomeomorph.comp
+protected theorem comp (hg : IsLocalHomeomorph g) (hf : IsLocalHomeomorph f) :
+    IsLocalHomeomorph (g ∘ f) :=
+  isLocalHomeomorph_iff_isLocalHomeomorphOn_univ.mpr
+    (hg.isLocalHomeomorphOn.comp hf.isLocalHomeomorphOn (Set.univ.mapsTo_univ f))
+#align is_locally_homeomorph.comp IsLocalHomeomorph.comp
 
-theorem openEmbedding_of_injective (hf : IsLocallyHomeomorph f) (hi : f.Injective) :
+theorem openEmbedding_of_injective (hf : IsLocalHomeomorph f) (hi : f.Injective) :
     OpenEmbedding f :=
   openEmbedding_of_continuous_injective_open hf.continuous hi hf.isOpenMap
 
 /-- Continuous local sections of a local homeomorphism are open embeddings. -/
-theorem openEmbedding_of_comp (hf : IsLocallyHomeomorph g) (hgf : OpenEmbedding (g ∘ f))
+theorem openEmbedding_of_comp (hf : IsLocalHomeomorph g) (hgf : OpenEmbedding (g ∘ f))
     (cont : Continuous f) : OpenEmbedding f :=
-  (hgf.isLocallyHomeomorph.of_comp hf cont).openEmbedding_of_injective hgf.inj.of_comp
+  (hgf.isLocalHomeomorph.of_comp hf cont).openEmbedding_of_injective hgf.inj.of_comp
 
 open TopologicalSpace in
 /-- Ranges of continuous local sections of a local homeomorphism form a basis of the source space.-/
-theorem isTopologicalBasis (hf : IsLocallyHomeomorph f) : IsTopologicalBasis
+theorem isTopologicalBasis (hf : IsLocalHomeomorph f) : IsTopologicalBasis
     {U : Set X | ∃ V : Set Y, IsOpen V ∧ ∃ s : C(V,X), f ∘ s = (↑) ∧ Set.range s = U} := by
   refine isTopologicalBasis_of_isOpen_of_nhds ?_ fun x U hx hU ↦ ?_
   · rintro _ ⟨U, hU, s, hs, rfl⟩
@@ -216,4 +216,4 @@ theorem isTopologicalBasis (hf : IsLocallyHomeomorph f) : IsTopologicalBasis
       rw [Set.preimage_inter, ← Set.inter_assoc, Set.inter_eq_self_of_subset_left
         f.source_preimage_target, f.source_inter_preimage_inv_preimage]
 
-end IsLocallyHomeomorph
+end IsLocalHomeomorph
chore: rename {LocalHomeomorph,ChartedSpace}.continuous_{to,inv}Fun fields to continuousOn_{to,inv}Fun (#8848)

They have type ContinuousOn ..., hence should be named accordingly. Suggested by @fpvandoorn in #8736.

Diff
@@ -65,7 +65,7 @@ theorem mk (h : ∀ x ∈ s, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ ∀
         map_source' := fun x hx => by rw [he x hx]; exact e.map_source' hx
         left_inv' := fun x hx => by rw [he x hx]; exact e.left_inv' hx
         right_inv' := fun y hy => by rw [he _ (e.map_target' hy)]; exact e.right_inv' hy
-        continuous_toFun := (continuousOn_congr he).mpr e.continuous_toFun },
+        continuousOn_toFun := (continuousOn_congr he).mpr e.continuousOn_toFun },
       hx, rfl⟩
 #align is_locally_homeomorph_on.mk IsLocallyHomeomorphOn.mk
 
@@ -209,7 +209,7 @@ theorem isTopologicalBasis (hf : IsLocallyHomeomorph f) : IsTopologicalBasis
     rwa [Subtype.range_val]
   · obtain ⟨f, hxf, rfl⟩ := hf x
     refine ⟨f.source ∩ U, ⟨f.target ∩ f.symm ⁻¹' U, f.symm.isOpen_inter_preimage hU,
-      ⟨_, continuousOn_iff_continuous_restrict.mp (f.continuous_invFun.mono fun _ h ↦ h.1)⟩,
+      ⟨_, continuousOn_iff_continuous_restrict.mp (f.continuousOn_invFun.mono fun _ h ↦ h.1)⟩,
       ?_, (Set.range_restrict _ _).trans ?_⟩, ⟨hxf, hx⟩, fun _ h ↦ h.2⟩
     · ext y; exact f.right_inv y.2.1
     · apply (f.symm_image_target_inter_eq _).trans
chore: rename lemmas containing "of_open" to match the naming convention (#8229)

Mostly, this means replacing "of_open" by "of_isOpen". A few lemmas names were misleading and are corrected differently. Zulip discussion.

Diff
@@ -203,12 +203,12 @@ open TopologicalSpace in
 /-- Ranges of continuous local sections of a local homeomorphism form a basis of the source space.-/
 theorem isTopologicalBasis (hf : IsLocallyHomeomorph f) : IsTopologicalBasis
     {U : Set X | ∃ V : Set Y, IsOpen V ∧ ∃ s : C(V,X), f ∘ s = (↑) ∧ Set.range s = U} := by
-  refine isTopologicalBasis_of_open_of_nhds ?_ fun x U hx hU ↦ ?_
+  refine isTopologicalBasis_of_isOpen_of_nhds ?_ fun x U hx hU ↦ ?_
   · rintro _ ⟨U, hU, s, hs, rfl⟩
     refine (openEmbedding_of_comp hf (hs ▸ ⟨embedding_subtype_val, ?_⟩) s.continuous).open_range
     rwa [Subtype.range_val]
   · obtain ⟨f, hxf, rfl⟩ := hf x
-    refine ⟨f.source ∩ U, ⟨f.target ∩ f.symm ⁻¹' U, f.symm.preimage_open_of_open hU,
+    refine ⟨f.source ∩ U, ⟨f.target ∩ f.symm ⁻¹' U, f.symm.isOpen_inter_preimage hU,
       ⟨_, continuousOn_iff_continuous_restrict.mp (f.continuous_invFun.mono fun _ h ↦ h.1)⟩,
       ?_, (Set.range_restrict _ _).trans ?_⟩, ⟨hxf, hx⟩, fun _ h ↦ h.2⟩
     · ext y; exact f.right_inv y.2.1
feat: separated and locally injective maps (#7911)

A function from a topological space X to a type Y is a separated map if any two distinct points in X with the same image in Y can be separated by open neighborhoods. A constant function is a separated map if and only if X is a T2Space.

A function from a topological space X is locally injective if every point of X has a neighborhood on which f is injective. A constant function is locally injective if and only if X is discrete.

Given f : X → Y one can form the pullback $X \times_Y X$; the diagonal map $\Delta: X \to X \times_Y X$ is always an embedding. It is a closed embedding iff f is a separated map, iff the equal locus of any two continuous maps equalized by f is closed. It is an open embedding iff f is locally injective, iff any such equal locus is open. Therefore, if f is a locally injective separated map (e.g. a covering map), the equal locus of two continuous maps equalized by f is clopen, so if the two maps agree on a point, then they agree on the whole connected component. This is crucial to showing the uniqueness of path lifting and the uniqueness and continuity of homotopy lifting for covering spaces.

The analogue of separated maps and locally injective maps in algebraic geometry are separated morphisms and unramified morphisms, respectively.

Diff
@@ -4,6 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Thomas Browning
 -/
 import Mathlib.Topology.LocalHomeomorph
+import Mathlib.Topology.SeparatedMap
 
 #align_import topology.is_locally_homeomorph from "leanprover-community/mathlib"@"e97cf15cd1aec9bd5c193b2ffac5a6dc9118912b"
 
@@ -125,7 +126,7 @@ def IsLocallyHomeomorph :=
   ∀ x : X, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ f = e
 #align is_locally_homeomorph IsLocallyHomeomorph
 
-theorem isLocallyHomeomorph_homeomorph (f : X ≃ₜ Y) : IsLocallyHomeomorph f :=
+theorem Homeomorph.isLocallyHomeomorph (f : X ≃ₜ Y) : IsLocallyHomeomorph f :=
   fun _ ↦ ⟨f.toLocalHomeomorph, trivial, rfl⟩
 
 variable {f s}
@@ -163,6 +164,9 @@ theorem mk (h : ∀ x : X, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ ∀ y
 
 variable {g f}
 
+lemma isLocallyInjective (hf : IsLocallyHomeomorph f) : IsLocallyInjective f :=
+  fun x ↦ by obtain ⟨f, hx, rfl⟩ := hf x; exact ⟨f.source, f.open_source, hx, f.injOn⟩
+
 theorem of_comp (hgf : IsLocallyHomeomorph (g ∘ f)) (hg : IsLocallyHomeomorph g)
     (cont : Continuous f) : IsLocallyHomeomorph f :=
   isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ.mpr <|
@@ -196,7 +200,7 @@ theorem openEmbedding_of_comp (hf : IsLocallyHomeomorph g) (hgf : OpenEmbedding
   (hgf.isLocallyHomeomorph.of_comp hf cont).openEmbedding_of_injective hgf.inj.of_comp
 
 open TopologicalSpace in
-/-- Ranges of continuous local sections of a local homeomorphism form a basis of the total space. -/
+/-- Ranges of continuous local sections of a local homeomorphism form a basis of the source space.-/
 theorem isTopologicalBasis (hf : IsLocallyHomeomorph f) : IsTopologicalBasis
     {U : Set X | ∃ V : Set Y, IsOpen V ∧ ∃ s : C(V,X), f ∘ s = (↑) ∧ Set.range s = U} := by
   refine isTopologicalBasis_of_open_of_nhds ?_ fun x U hx hU ↦ ?_
feat: miscellaneous lemmas about local homeomorphisms (#7655)

Co-authored-by: Junyan Xu <junyanxu.math@gmail.com>

Diff
@@ -34,6 +34,21 @@ def IsLocallyHomeomorphOn :=
   ∀ x ∈ s, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ f = e
 #align is_locally_homeomorph_on IsLocallyHomeomorphOn
 
+theorem isLocallyHomeomorphOn_iff_openEmbedding_restrict {f : X → Y} :
+    IsLocallyHomeomorphOn f s ↔ ∀ x ∈ s, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f) := by
+  refine ⟨fun h x hx ↦ ?_, fun h x hx ↦ ?_⟩
+  · obtain ⟨e, hxe, rfl⟩ := h x hx
+    exact ⟨e.source, e.open_source.mem_nhds hxe, e.openEmbedding_restrict⟩
+  · obtain ⟨U, hU, emb⟩ := h x hx
+    have : OpenEmbedding ((interior U).restrict f)
+    · refine emb.comp ⟨embedding_inclusion interior_subset, ?_⟩
+      rw [Set.range_inclusion]; exact isOpen_induced isOpen_interior
+    obtain ⟨cont, inj, openMap⟩ := openEmbedding_iff_continuous_injective_open.mp this
+    haveI : Nonempty X := ⟨x⟩
+    exact ⟨LocalHomeomorph.ofContinuousOpenRestrict (Set.injOn_iff_injective.mpr inj).toLocalEquiv
+      (continuousOn_iff_continuous_restrict.mpr cont) openMap isOpen_interior,
+      mem_interior_iff_mem_nhds.mpr hU, rfl⟩
+
 namespace IsLocallyHomeomorphOn
 
 /-- 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 ∧ ∀
 
 variable {g f s t}
 
+theorem mono {t : Set X} (hf : IsLocallyHomeomorphOn f t) (hst : s ⊆ t) :
+    IsLocallyHomeomorphOn f s := fun x hx ↦ hf x (hst hx)
+
+theorem of_comp_left (hgf : IsLocallyHomeomorphOn (g ∘ f) s) (hg : IsLocallyHomeomorphOn g (f '' s))
+    (cont : ∀ x ∈ s, ContinuousAt f x) : IsLocallyHomeomorphOn f s := mk f s fun x hx ↦ by
+  obtain ⟨g, hxg, rfl⟩ := hg (f x) ⟨x, hx, rfl⟩
+  obtain ⟨gf, hgf, he⟩ := hgf x hx
+  refine ⟨(gf.restr <| f ⁻¹' g.source).trans g.symm, ⟨⟨hgf, mem_interior_iff_mem_nhds.mpr
+    ((cont x hx).preimage_mem_nhds <| g.open_source.mem_nhds hxg)⟩, he ▸ g.map_source hxg⟩,
+    fun y hy ↦ ?_⟩
+  change f y = g.symm (gf y)
+  have : f y ∈ g.source := by apply interior_subset hy.1.2
+  rw [← he, g.eq_symm_apply this (by apply g.map_source this)]
+  rfl
+
+theorem of_comp_right (hgf : IsLocallyHomeomorphOn (g ∘ f) s) (hf : IsLocallyHomeomorphOn f s) :
+    IsLocallyHomeomorphOn g (f '' s) := mk g _ <| by
+  rintro _ ⟨x, hx, rfl⟩
+  obtain ⟨f, hxf, rfl⟩ := hf x hx
+  obtain ⟨gf, hgf, he⟩ := hgf x hx
+  refine ⟨f.symm.trans gf, ⟨f.map_source hxf, ?_⟩, fun y hy ↦ ?_⟩
+  · apply (f.left_inv hxf).symm ▸ hgf
+  · change g y = gf (f.symm y)
+    rw [← he, Function.comp_apply, f.right_inv hy.1]
+
 theorem map_nhds_eq (hf : IsLocallyHomeomorphOn f s) {x : X} (hx : x ∈ s) : (𝓝 x).map f = 𝓝 (f x) :=
   let ⟨e, hx, he⟩ := hf x hx
   he.symm ▸ e.map_nhds_eq hx
@@ -85,18 +125,29 @@ def IsLocallyHomeomorph :=
   ∀ x : X, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ f = e
 #align is_locally_homeomorph IsLocallyHomeomorph
 
-variable {f}
+theorem isLocallyHomeomorph_homeomorph (f : X ≃ₜ Y) : IsLocallyHomeomorph f :=
+  fun _ ↦ ⟨f.toLocalHomeomorph, trivial, rfl⟩
+
+variable {f s}
 
 theorem isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ :
-    IsLocallyHomeomorph f ↔ IsLocallyHomeomorphOn f Set.univ := by
-  simp only [IsLocallyHomeomorph, IsLocallyHomeomorphOn, Set.mem_univ, forall_true_left]
+    IsLocallyHomeomorph f ↔ IsLocallyHomeomorphOn f Set.univ :=
+  ⟨fun h x _ ↦ h x, fun h x ↦ h x trivial⟩
 #align is_locally_homeomorph_iff_is_locally_homeomorph_on_univ isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ
 
 protected theorem IsLocallyHomeomorph.isLocallyHomeomorphOn (hf : IsLocallyHomeomorph f) :
-    IsLocallyHomeomorphOn f Set.univ :=
-  isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ.mp hf
+    IsLocallyHomeomorphOn f s := fun x _ ↦ hf x
 #align is_locally_homeomorph.is_locally_homeomorph_on IsLocallyHomeomorph.isLocallyHomeomorphOn
 
+theorem isLocallyHomeomorph_iff_openEmbedding_restrict {f : X → Y} :
+    IsLocallyHomeomorph f ↔ ∀ x : X, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f) := by
+  simp_rw [isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ,
+    isLocallyHomeomorphOn_iff_openEmbedding_restrict, imp_iff_right (Set.mem_univ _)]
+
+theorem OpenEmbedding.isLocallyHomeomorph (hf : OpenEmbedding f) : IsLocallyHomeomorph f :=
+  isLocallyHomeomorph_iff_openEmbedding_restrict.mpr fun _ ↦
+    ⟨_, Filter.univ_mem, hf.comp (Homeomorph.Set.univ X).openEmbedding⟩
+
 variable (f)
 
 namespace IsLocallyHomeomorph
@@ -112,6 +163,11 @@ theorem mk (h : ∀ x : X, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ ∀ y
 
 variable {g f}
 
+theorem of_comp (hgf : IsLocallyHomeomorph (g ∘ f)) (hg : IsLocallyHomeomorph g)
+    (cont : Continuous f) : IsLocallyHomeomorph f :=
+  isLocallyHomeomorph_iff_isLocallyHomeomorphOn_univ.mpr <|
+    hgf.isLocallyHomeomorphOn.of_comp_left hg.isLocallyHomeomorphOn fun _ _ ↦ cont.continuousAt
+
 theorem map_nhds_eq (hf : IsLocallyHomeomorph f) (x : X) : (𝓝 x).map f = 𝓝 (f x) :=
   hf.isLocallyHomeomorphOn.map_nhds_eq (Set.mem_univ x)
 #align is_locally_homeomorph.map_nhds_eq IsLocallyHomeomorph.map_nhds_eq
@@ -130,5 +186,30 @@ protected theorem comp (hg : IsLocallyHomeomorph g) (hf : IsLocallyHomeomorph f)
     (hg.isLocallyHomeomorphOn.comp hf.isLocallyHomeomorphOn (Set.univ.mapsTo_univ f))
 #align is_locally_homeomorph.comp IsLocallyHomeomorph.comp
 
-end IsLocallyHomeomorph
+theorem openEmbedding_of_injective (hf : IsLocallyHomeomorph f) (hi : f.Injective) :
+    OpenEmbedding f :=
+  openEmbedding_of_continuous_injective_open hf.continuous hi hf.isOpenMap
+
+/-- Continuous local sections of a local homeomorphism are open embeddings. -/
+theorem openEmbedding_of_comp (hf : IsLocallyHomeomorph g) (hgf : OpenEmbedding (g ∘ f))
+    (cont : Continuous f) : OpenEmbedding f :=
+  (hgf.isLocallyHomeomorph.of_comp hf cont).openEmbedding_of_injective hgf.inj.of_comp
+
+open TopologicalSpace in
+/-- Ranges of continuous local sections of a local homeomorphism form a basis of the total space. -/
+theorem isTopologicalBasis (hf : IsLocallyHomeomorph f) : IsTopologicalBasis
+    {U : Set X | ∃ V : Set Y, IsOpen V ∧ ∃ s : C(V,X), f ∘ s = (↑) ∧ Set.range s = U} := by
+  refine isTopologicalBasis_of_open_of_nhds ?_ fun x U hx hU ↦ ?_
+  · rintro _ ⟨U, hU, s, hs, rfl⟩
+    refine (openEmbedding_of_comp hf (hs ▸ ⟨embedding_subtype_val, ?_⟩) s.continuous).open_range
+    rwa [Subtype.range_val]
+  · obtain ⟨f, hxf, rfl⟩ := hf x
+    refine ⟨f.source ∩ U, ⟨f.target ∩ f.symm ⁻¹' U, f.symm.preimage_open_of_open hU,
+      ⟨_, continuousOn_iff_continuous_restrict.mp (f.continuous_invFun.mono fun _ h ↦ h.1)⟩,
+      ?_, (Set.range_restrict _ _).trans ?_⟩, ⟨hxf, hx⟩, fun _ h ↦ h.2⟩
+    · ext y; exact f.right_inv y.2.1
+    · apply (f.symm_image_target_inter_eq _).trans
+      rw [Set.preimage_inter, ← Set.inter_assoc, Set.inter_eq_self_of_subset_left
+        f.source_preimage_target, f.source_inter_preimage_inv_preimage]
 
+end IsLocallyHomeomorph
chore: banish Type _ and Sort _ (#6499)

We remove all possible occurences of Type _ and Sort _ in favor of Type* and Sort*.

This has nice performance benefits.

Diff
@@ -25,7 +25,7 @@ This file defines local homeomorphisms.
 
 open Topology
 
-variable {X Y Z : Type _} [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z] (g : Y → Z)
+variable {X Y Z : Type*} [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z] (g : Y → Z)
   (f : X → Y) (s : Set X) (t : Set Y)
 
 /-- A function `f : X → Y` satisfies `IsLocallyHomeomorphOn f s` if each `x ∈ s` is contained in
chore: script to replace headers with #align_import statements (#5979)

Open in Gitpod

Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com>

Diff
@@ -2,14 +2,11 @@
 Copyright (c) 2021 Thomas Browning. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Thomas Browning
-
-! This file was ported from Lean 3 source module topology.is_locally_homeomorph
-! leanprover-community/mathlib commit e97cf15cd1aec9bd5c193b2ffac5a6dc9118912b
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
 -/
 import Mathlib.Topology.LocalHomeomorph
 
+#align_import topology.is_locally_homeomorph from "leanprover-community/mathlib"@"e97cf15cd1aec9bd5c193b2ffac5a6dc9118912b"
+
 /-!
 # Local homeomorphisms
 
chore: remove occurrences of semicolon after space (#5713)

This is the second half of the changes originally in #5699, removing all occurrences of ; after a space and implementing a linter rule to enforce it.

In most cases this 2-character substring has a space after it, so the following command was run first:

find . -type f -name "*.lean" -exec sed -i -E 's/ ; /; /g' {} \;

The remaining cases were few enough in number that they were done manually.

Diff
@@ -49,9 +49,9 @@ theorem mk (h : ∀ x ∈ s, ∃ e : LocalHomeomorph X Y, x ∈ e.source ∧ ∀
   exact
     ⟨{ e with
         toFun := f
-        map_source' := fun x hx => by rw [he x hx] ; exact e.map_source' hx
-        left_inv' := fun x hx => by rw [he x hx] ; exact e.left_inv' hx
-        right_inv' := fun y hy => by rw [he _ (e.map_target' hy)] ; exact e.right_inv' hy
+        map_source' := fun x hx => by rw [he x hx]; exact e.map_source' hx
+        left_inv' := fun x hx => by rw [he x hx]; exact e.left_inv' hx
+        right_inv' := fun y hy => by rw [he _ (e.map_target' hy)]; exact e.right_inv' hy
         continuous_toFun := (continuousOn_congr he).mpr e.continuous_toFun },
       hx, rfl⟩
 #align is_locally_homeomorph_on.mk IsLocallyHomeomorphOn.mk
feat: Port Topology.IsLocallyHomeomorph (#2382)

Renaming only.

Dependencies 8 + 323

324 files ported (97.6%)
141766 lines ported (96.6%)
Show graph

The unported dependencies are