topology.maps
⟷
Mathlib.Topology.Maps
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.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(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)
Lemma statements are from Shamrock-Frost/BrouwerFixedPoint
Co-authored-by: @Shamrock-Frost
@@ -228,10 +228,15 @@ def quotient_map {α : Type*} {β : Type*} [tα : topological_space α] [tβ : t
(f : α → β) : Prop :=
surjective f ∧ tβ = tα.coinduced f
-lemma quotient_map_iff {α β : Type*} [topological_space α] [topological_space β] {f : α → β} :
+lemma quotient_map_iff [topological_space α] [topological_space β] {f : α → β} :
quotient_map f ↔ surjective f ∧ ∀ s : set β, is_open s ↔ is_open (f ⁻¹' s) :=
and_congr iff.rfl topological_space_eq_iff
+lemma quotient_map_iff_closed [topological_space α] [topological_space β] {f : α → β} :
+ quotient_map f ↔ surjective f ∧ ∀ s : set β, is_closed s ↔ is_closed (f ⁻¹' s) :=
+quotient_map_iff.trans $ iff.rfl.and $ compl_surjective.forall.trans $
+ by simp only [is_open_compl_iff, preimage_compl]
+
namespace quotient_map
variables [topological_space α] [topological_space β] [topological_space γ] [topological_space δ]
@@ -270,7 +275,7 @@ protected lemma is_open_preimage (hf : quotient_map f) {s : set β} :
protected lemma is_closed_preimage (hf : quotient_map f) {s : set β} :
is_closed (f ⁻¹' s) ↔ is_closed s :=
-by simp only [← is_open_compl_iff, ← preimage_compl, hf.is_open_preimage]
+((quotient_map_iff_closed.1 hf).2 s).symm
end quotient_map
@@ -427,6 +432,11 @@ end
lemma closed_range {f : α → β} (hf : is_closed_map f) : is_closed (range f) :=
@image_univ _ _ f ▸ hf _ is_closed_univ
+lemma to_quotient_map {f : α → β} (hcl : is_closed_map f) (hcont : continuous f)
+ (hsurj : surjective f) : quotient_map f :=
+quotient_map_iff_closed.2
+ ⟨hsurj, λ s, ⟨λ hs, hs.preimage hcont, λ hs, hsurj.image_preimage s ▸ hcl _ hs⟩⟩
+
end is_closed_map
lemma inducing.is_closed_map [topological_space α] [topological_space β]
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(first ported)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -643,10 +643,10 @@ theorem of_nonempty {f : α → β} (h : ∀ s, IsClosed s → s.Nonempty → Is
#align is_closed_map.of_nonempty IsClosedMap.of_nonempty
-/
-#print IsClosedMap.closed_range /-
-theorem closed_range {f : α → β} (hf : IsClosedMap f) : IsClosed (range f) :=
+#print IsClosedMap.isClosed_range /-
+theorem isClosed_range {f : α → β} (hf : IsClosedMap f) : IsClosed (range f) :=
@image_univ _ _ f ▸ hf _ isClosed_univ
-#align is_closed_map.closed_range IsClosedMap.closed_range
+#align is_closed_map.closed_range IsClosedMap.isClosed_range
-/
#print IsClosedMap.to_quotientMap /-
@@ -815,7 +815,7 @@ variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ]
/-- A closed embedding is an embedding with closed image. -/
@[mk_iff]
structure ClosedEmbedding (f : α → β) extends Embedding f : Prop where
- closed_range : IsClosed <| range f
+ isClosed_range : IsClosed <| range f
#align closed_embedding ClosedEmbedding
-/
@@ -836,7 +836,7 @@ theorem ClosedEmbedding.continuous (hf : ClosedEmbedding f) : Continuous f :=
#print ClosedEmbedding.isClosedMap /-
theorem ClosedEmbedding.isClosedMap (hf : ClosedEmbedding f) : IsClosedMap f :=
- hf.toEmbedding.to_inducing.IsClosedMap hf.closed_range
+ hf.toEmbedding.to_inducing.IsClosedMap hf.isClosed_range
#align closed_embedding.is_closed_map ClosedEmbedding.isClosedMap
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,8 +3,8 @@ Copyright (c) 2017 Johannes Hölzl. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl, Mario Carneiro, Patrick Massot
-/
-import Mathbin.Topology.Order
-import Mathbin.Topology.NhdsSet
+import Topology.Order
+import Topology.NhdsSet
#align_import topology.maps from "leanprover-community/mathlib"@"d91e7f7a7f1c7e9f0e18fdb6bde4f652004c735d"
mathlib commit https://github.com/leanprover-community/mathlib/commit/32a7e535287f9c73f2e4d2aef306a39190f0b504
@@ -336,7 +336,7 @@ def QuotientMap {α : Type _} {β : Type _} [tα : TopologicalSpace α] [tβ : T
#print quotientMap_iff /-
theorem quotientMap_iff [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
QuotientMap f ↔ Surjective f ∧ ∀ s : Set β, IsOpen s ↔ IsOpen (f ⁻¹' s) :=
- and_congr Iff.rfl topologicalSpace_eq_iff
+ and_congr Iff.rfl TopologicalSpace.ext_iff
#align quotient_map_iff quotientMap_iff
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,15 +2,12 @@
Copyright (c) 2017 Johannes Hölzl. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl, Mario Carneiro, Patrick Massot
-
-! This file was ported from Lean 3 source module topology.maps
-! leanprover-community/mathlib commit d91e7f7a7f1c7e9f0e18fdb6bde4f652004c735d
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Topology.Order
import Mathbin.Topology.NhdsSet
+#align_import topology.maps from "leanprover-community/mathlib"@"d91e7f7a7f1c7e9f0e18fdb6bde4f652004c735d"
+
/-!
# Specific classes of maps between topological spaces
mathlib commit https://github.com/leanprover-community/mathlib/commit/2a0ce625dbb0ffbc7d1316597de0b25c1ec75303
@@ -511,7 +511,7 @@ theorem of_inverse {f : α → β} {f' : β → α} (h : Continuous f') (l_inv :
theorem to_quotientMap {f : α → β} (open_map : IsOpenMap f) (cont : Continuous f)
(surj : Surjective f) : QuotientMap f :=
quotientMap_iff.2
- ⟨surj, fun s => ⟨fun h => h.Preimage cont, fun h => surj.image_preimage s ▸ open_map _ h⟩⟩
+ ⟨surj, fun s => ⟨fun h => h.Preimage Cont, fun h => surj.image_preimage s ▸ open_map _ h⟩⟩
#align is_open_map.to_quotient_map IsOpenMap.to_quotientMap
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -77,68 +77,95 @@ theorem inducing_id : Inducing (@id α) :=
#align inducing_id inducing_id
-/
+#print Inducing.comp /-
protected theorem Inducing.comp {g : β → γ} {f : α → β} (hg : Inducing g) (hf : Inducing f) :
Inducing (g ∘ f) :=
⟨by rw [hf.induced, hg.induced, induced_compose]⟩
#align inducing.comp Inducing.comp
+-/
+#print inducing_of_inducing_compose /-
theorem inducing_of_inducing_compose {f : α → β} {g : β → γ} (hf : Continuous f) (hg : Continuous g)
(hgf : Inducing (g ∘ f)) : Inducing f :=
⟨le_antisymm (by rwa [← continuous_iff_le_induced])
(by rw [hgf.induced, ← continuous_iff_le_induced]; apply hg.comp continuous_induced_dom)⟩
#align inducing_of_inducing_compose inducing_of_inducing_compose
+-/
+#print inducing_iff_nhds /-
theorem inducing_iff_nhds {f : α → β} : Inducing f ↔ ∀ a, 𝓝 a = comap f (𝓝 (f a)) :=
(inducing_iff _).trans (induced_iff_nhds_eq f)
#align inducing_iff_nhds inducing_iff_nhds
+-/
+#print Inducing.nhds_eq_comap /-
theorem Inducing.nhds_eq_comap {f : α → β} (hf : Inducing f) : ∀ a : α, 𝓝 a = comap f (𝓝 <| f a) :=
inducing_iff_nhds.1 hf
#align inducing.nhds_eq_comap Inducing.nhds_eq_comap
+-/
+#print Inducing.nhdsSet_eq_comap /-
theorem Inducing.nhdsSet_eq_comap {f : α → β} (hf : Inducing f) (s : Set α) :
𝓝ˢ s = comap f (𝓝ˢ (f '' s)) := by
simp only [nhdsSet, sSup_image, comap_supr, hf.nhds_eq_comap, iSup_image]
#align inducing.nhds_set_eq_comap Inducing.nhdsSet_eq_comap
+-/
+#print Inducing.map_nhds_eq /-
theorem Inducing.map_nhds_eq {f : α → β} (hf : Inducing f) (a : α) : (𝓝 a).map f = 𝓝[range f] f a :=
hf.induced.symm ▸ map_nhds_induced_eq a
#align inducing.map_nhds_eq Inducing.map_nhds_eq
+-/
+#print Inducing.map_nhds_of_mem /-
theorem Inducing.map_nhds_of_mem {f : α → β} (hf : Inducing f) (a : α) (h : range f ∈ 𝓝 (f a)) :
(𝓝 a).map f = 𝓝 (f a) :=
hf.induced.symm ▸ map_nhds_induced_of_mem h
#align inducing.map_nhds_of_mem Inducing.map_nhds_of_mem
+-/
+#print Inducing.image_mem_nhdsWithin /-
theorem Inducing.image_mem_nhdsWithin {f : α → β} (hf : Inducing f) {a : α} {s : Set α}
(hs : s ∈ 𝓝 a) : f '' s ∈ 𝓝[range f] f a :=
hf.map_nhds_eq a ▸ image_mem_map hs
#align inducing.image_mem_nhds_within Inducing.image_mem_nhdsWithin
+-/
+#print Inducing.tendsto_nhds_iff /-
theorem Inducing.tendsto_nhds_iff {ι : Type _} {f : ι → β} {g : β → γ} {a : Filter ι} {b : β}
(hg : Inducing g) : Tendsto f a (𝓝 b) ↔ Tendsto (g ∘ f) a (𝓝 (g b)) := by
rw [hg.nhds_eq_comap, tendsto_comap_iff]
#align inducing.tendsto_nhds_iff Inducing.tendsto_nhds_iff
+-/
+#print Inducing.continuousAt_iff /-
theorem Inducing.continuousAt_iff {f : α → β} {g : β → γ} (hg : Inducing g) {x : α} :
ContinuousAt f x ↔ ContinuousAt (g ∘ f) x := by
simp_rw [ContinuousAt, Inducing.tendsto_nhds_iff hg]
#align inducing.continuous_at_iff Inducing.continuousAt_iff
+-/
+#print Inducing.continuous_iff /-
theorem Inducing.continuous_iff {f : α → β} {g : β → γ} (hg : Inducing g) :
Continuous f ↔ Continuous (g ∘ f) := by
simp_rw [continuous_iff_continuousAt, hg.continuous_at_iff]
#align inducing.continuous_iff Inducing.continuous_iff
+-/
+#print Inducing.continuousAt_iff' /-
theorem Inducing.continuousAt_iff' {f : α → β} {g : β → γ} (hf : Inducing f) {x : α}
(h : range f ∈ 𝓝 (f x)) : ContinuousAt (g ∘ f) x ↔ ContinuousAt g (f x) := by
simp_rw [ContinuousAt, Filter.Tendsto, ← hf.map_nhds_of_mem _ h, Filter.map_map]
#align inducing.continuous_at_iff' Inducing.continuousAt_iff'
+-/
+#print Inducing.continuous /-
protected theorem Inducing.continuous {f : α → β} (hf : Inducing f) : Continuous f :=
hf.continuous_iff.mp continuous_id
#align inducing.continuous Inducing.continuous
+-/
+#print Inducing.inducing_iff /-
protected theorem Inducing.inducing_iff {f : α → β} {g : β → γ} (hg : Inducing g) :
Inducing f ↔ Inducing (g ∘ f) :=
by
@@ -146,33 +173,46 @@ protected theorem Inducing.inducing_iff {f : α → β} {g : β → γ} (hg : In
rw [hg.continuous_iff]
exact hgf.continuous
#align inducing.inducing_iff Inducing.inducing_iff
+-/
+#print Inducing.closure_eq_preimage_closure_image /-
theorem Inducing.closure_eq_preimage_closure_image {f : α → β} (hf : Inducing f) (s : Set α) :
closure s = f ⁻¹' closure (f '' s) := by ext x;
rw [Set.mem_preimage, ← closure_induced, hf.induced]
#align inducing.closure_eq_preimage_closure_image Inducing.closure_eq_preimage_closure_image
+-/
+#print Inducing.isClosed_iff /-
theorem Inducing.isClosed_iff {f : α → β} (hf : Inducing f) {s : Set α} :
IsClosed s ↔ ∃ t, IsClosed t ∧ f ⁻¹' t = s := by rw [hf.induced, isClosed_induced_iff]
#align inducing.is_closed_iff Inducing.isClosed_iff
+-/
+#print Inducing.isClosed_iff' /-
theorem Inducing.isClosed_iff' {f : α → β} (hf : Inducing f) {s : Set α} :
IsClosed s ↔ ∀ x, f x ∈ closure (f '' s) → x ∈ s := by rw [hf.induced, isClosed_induced_iff']
#align inducing.is_closed_iff' Inducing.isClosed_iff'
+-/
+#print Inducing.isClosed_preimage /-
theorem Inducing.isClosed_preimage {f : α → β} (h : Inducing f) (s : Set β) (hs : IsClosed s) :
IsClosed (f ⁻¹' s) :=
(Inducing.isClosed_iff h).mpr ⟨s, hs, rfl⟩
#align inducing.is_closed_preimage Inducing.isClosed_preimage
+-/
+#print Inducing.isOpen_iff /-
theorem Inducing.isOpen_iff {f : α → β} (hf : Inducing f) {s : Set α} :
IsOpen s ↔ ∃ t, IsOpen t ∧ f ⁻¹' t = s := by rw [hf.induced, isOpen_induced_iff]
#align inducing.is_open_iff Inducing.isOpen_iff
+-/
+#print Inducing.dense_iff /-
theorem Inducing.dense_iff {f : α → β} (hf : Inducing f) {s : Set α} :
Dense s ↔ ∀ x, f x ∈ closure (f '' s) := by
simp only [Dense, hf.closure_eq_preimage_closure_image, mem_preimage]
#align inducing.dense_iff Inducing.dense_iff
+-/
end Inducing
@@ -198,10 +238,12 @@ theorem Function.Injective.embedding_induced [t : TopologicalSpace β] {f : α
variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ]
+#print Embedding.mk' /-
theorem Embedding.mk' (f : α → β) (inj : Injective f) (induced : ∀ a, comap f (𝓝 (f a)) = 𝓝 a) :
Embedding f :=
⟨inducing_iff_nhds.2 fun a => (induced a).symm, inj⟩
#align embedding.mk' Embedding.mk'
+-/
#print embedding_id /-
theorem embedding_id : Embedding (@id α) :=
@@ -209,16 +251,20 @@ theorem embedding_id : Embedding (@id α) :=
#align embedding_id embedding_id
-/
+#print Embedding.comp /-
theorem Embedding.comp {g : β → γ} {f : α → β} (hg : Embedding g) (hf : Embedding f) :
Embedding (g ∘ f) :=
{ hg.to_inducing.comp hf.to_inducing with inj := fun a₁ a₂ h => hf.inj <| hg.inj h }
#align embedding.comp Embedding.comp
+-/
+#print embedding_of_embedding_compose /-
theorem embedding_of_embedding_compose {f : α → β} {g : β → γ} (hf : Continuous f)
(hg : Continuous g) (hgf : Embedding (g ∘ f)) : Embedding f :=
{ induced := (inducing_of_inducing_compose hf hg hgf.to_inducing).induced
inj := fun a₁ a₂ h => hgf.inj <| by simp [h, (· ∘ ·)] }
#align embedding_of_embedding_compose embedding_of_embedding_compose
+-/
#print Function.LeftInverse.embedding /-
protected theorem Function.LeftInverse.embedding {f : α → β} {g : β → α} (h : LeftInverse f g)
@@ -227,35 +273,48 @@ protected theorem Function.LeftInverse.embedding {f : α → β} {g : β → α}
#align function.left_inverse.embedding Function.LeftInverse.embedding
-/
+#print Embedding.map_nhds_eq /-
theorem Embedding.map_nhds_eq {f : α → β} (hf : Embedding f) (a : α) :
(𝓝 a).map f = 𝓝[range f] f a :=
hf.1.map_nhds_eq a
#align embedding.map_nhds_eq Embedding.map_nhds_eq
+-/
+#print Embedding.map_nhds_of_mem /-
theorem Embedding.map_nhds_of_mem {f : α → β} (hf : Embedding f) (a : α) (h : range f ∈ 𝓝 (f a)) :
(𝓝 a).map f = 𝓝 (f a) :=
hf.1.map_nhds_of_mem a h
#align embedding.map_nhds_of_mem Embedding.map_nhds_of_mem
+-/
+#print Embedding.tendsto_nhds_iff /-
theorem Embedding.tendsto_nhds_iff {ι : Type _} {f : ι → β} {g : β → γ} {a : Filter ι} {b : β}
(hg : Embedding g) : Tendsto f a (𝓝 b) ↔ Tendsto (g ∘ f) a (𝓝 (g b)) :=
hg.to_inducing.tendsto_nhds_iff
#align embedding.tendsto_nhds_iff Embedding.tendsto_nhds_iff
+-/
+#print Embedding.continuous_iff /-
theorem Embedding.continuous_iff {f : α → β} {g : β → γ} (hg : Embedding g) :
Continuous f ↔ Continuous (g ∘ f) :=
Inducing.continuous_iff hg.1
#align embedding.continuous_iff Embedding.continuous_iff
+-/
+#print Embedding.continuous /-
theorem Embedding.continuous {f : α → β} (hf : Embedding f) : Continuous f :=
Inducing.continuous hf.1
#align embedding.continuous Embedding.continuous
+-/
+#print Embedding.closure_eq_preimage_closure_image /-
theorem Embedding.closure_eq_preimage_closure_image {e : α → β} (he : Embedding e) (s : Set α) :
closure s = e ⁻¹' closure (e '' s) :=
he.1.closure_eq_preimage_closure_image s
#align embedding.closure_eq_preimage_closure_image Embedding.closure_eq_preimage_closure_image
+-/
+#print Embedding.discreteTopology /-
/-- The topology induced under an inclusion `f : X → Y` from the discrete topological space `Y`
is the discrete topology on `X`. -/
theorem Embedding.discreteTopology {X Y : Type _} [TopologicalSpace X] [tY : TopologicalSpace Y]
@@ -264,6 +323,7 @@ theorem Embedding.discreteTopology {X Y : Type _} [TopologicalSpace X] [tY : Top
rw [hf.nhds_eq_comap, nhds_discrete, comap_pure, ← image_singleton, hf.inj.preimage_image,
principal_singleton]
#align embedding.discrete_topology Embedding.discreteTopology
+-/
end Embedding
@@ -276,16 +336,20 @@ def QuotientMap {α : Type _} {β : Type _} [tα : TopologicalSpace α] [tβ : T
#align quotient_map QuotientMap
-/
+#print quotientMap_iff /-
theorem quotientMap_iff [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
QuotientMap f ↔ Surjective f ∧ ∀ s : Set β, IsOpen s ↔ IsOpen (f ⁻¹' s) :=
and_congr Iff.rfl topologicalSpace_eq_iff
#align quotient_map_iff quotientMap_iff
+-/
+#print quotientMap_iff_closed /-
theorem quotientMap_iff_closed [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
QuotientMap f ↔ Surjective f ∧ ∀ s : Set β, IsClosed s ↔ IsClosed (f ⁻¹' s) :=
quotientMap_iff.trans <|
Iff.rfl.And <| compl_surjective.forall.trans <| by simp only [isOpen_compl_iff, preimage_compl]
#align quotient_map_iff_closed quotientMap_iff_closed
+-/
namespace QuotientMap
@@ -298,10 +362,13 @@ protected theorem id : QuotientMap (@id α) :=
#align quotient_map.id QuotientMap.id
-/
+#print QuotientMap.comp /-
protected theorem comp (hg : QuotientMap g) (hf : QuotientMap f) : QuotientMap (g ∘ f) :=
⟨hg.left.comp hf.left, by rw [hg.right, hf.right, coinduced_compose]⟩
#align quotient_map.comp QuotientMap.comp
+-/
+#print QuotientMap.of_quotientMap_compose /-
protected theorem of_quotientMap_compose (hf : Continuous f) (hg : Continuous g)
(hgf : QuotientMap (g ∘ f)) : QuotientMap g :=
⟨hgf.1.of_comp,
@@ -309,32 +376,45 @@ protected theorem of_quotientMap_compose (hf : Continuous f) (hg : Continuous g)
(by rw [hgf.right, ← continuous_iff_coinduced_le]; apply continuous_coinduced_rng.comp hf)
(by rwa [← continuous_iff_coinduced_le])⟩
#align quotient_map.of_quotient_map_compose QuotientMap.of_quotientMap_compose
+-/
+#print QuotientMap.of_inverse /-
theorem of_inverse {g : β → α} (hf : Continuous f) (hg : Continuous g) (h : LeftInverse g f) :
QuotientMap g :=
QuotientMap.of_quotientMap_compose hf hg <| h.comp_eq_id.symm ▸ QuotientMap.id
#align quotient_map.of_inverse QuotientMap.of_inverse
+-/
+#print QuotientMap.continuous_iff /-
protected theorem continuous_iff (hf : QuotientMap f) : Continuous g ↔ Continuous (g ∘ f) := by
rw [continuous_iff_coinduced_le, continuous_iff_coinduced_le, hf.right, coinduced_compose]
#align quotient_map.continuous_iff QuotientMap.continuous_iff
+-/
+#print QuotientMap.continuous /-
protected theorem continuous (hf : QuotientMap f) : Continuous f :=
hf.continuous_iff.mp continuous_id
#align quotient_map.continuous QuotientMap.continuous
+-/
+#print QuotientMap.surjective /-
protected theorem surjective (hf : QuotientMap f) : Surjective f :=
hf.1
#align quotient_map.surjective QuotientMap.surjective
+-/
+#print QuotientMap.isOpen_preimage /-
protected theorem isOpen_preimage (hf : QuotientMap f) {s : Set β} : IsOpen (f ⁻¹' s) ↔ IsOpen s :=
((quotientMap_iff.1 hf).2 s).symm
#align quotient_map.is_open_preimage QuotientMap.isOpen_preimage
+-/
+#print QuotientMap.isClosed_preimage /-
protected theorem isClosed_preimage (hf : QuotientMap f) {s : Set β} :
IsClosed (f ⁻¹' s) ↔ IsClosed s :=
((quotientMap_iff_closed.1 hf).2 s).symm
#align quotient_map.is_closed_preimage QuotientMap.isClosed_preimage
+-/
end QuotientMap
@@ -355,42 +435,59 @@ protected theorem id : IsOpenMap (@id α) := fun s hs => by rwa [image_id]
#align is_open_map.id IsOpenMap.id
-/
+#print IsOpenMap.comp /-
protected theorem comp {g : β → γ} {f : α → β} (hg : IsOpenMap g) (hf : IsOpenMap f) :
IsOpenMap (g ∘ f) := by intro s hs <;> rw [image_comp] <;> exact hg _ (hf _ hs)
#align is_open_map.comp IsOpenMap.comp
+-/
+#print IsOpenMap.isOpen_range /-
theorem isOpen_range (hf : IsOpenMap f) : IsOpen (range f) := by rw [← image_univ];
exact hf _ isOpen_univ
#align is_open_map.is_open_range IsOpenMap.isOpen_range
+-/
+#print IsOpenMap.image_mem_nhds /-
theorem image_mem_nhds (hf : IsOpenMap f) {x : α} {s : Set α} (hx : s ∈ 𝓝 x) : f '' s ∈ 𝓝 (f x) :=
let ⟨t, hts, ht, hxt⟩ := mem_nhds_iff.1 hx
mem_of_superset (IsOpen.mem_nhds (hf t ht) (mem_image_of_mem _ hxt)) (image_subset _ hts)
#align is_open_map.image_mem_nhds IsOpenMap.image_mem_nhds
+-/
+#print IsOpenMap.range_mem_nhds /-
theorem range_mem_nhds (hf : IsOpenMap f) (x : α) : range f ∈ 𝓝 (f x) :=
hf.isOpen_range.mem_nhds <| mem_range_self _
#align is_open_map.range_mem_nhds IsOpenMap.range_mem_nhds
+-/
+#print IsOpenMap.mapsTo_interior /-
theorem mapsTo_interior (hf : IsOpenMap f) {s : Set α} {t : Set β} (h : MapsTo f s t) :
MapsTo f (interior s) (interior t) :=
mapsTo'.2 <|
interior_maximal (h.mono interior_subset Subset.rfl).image_subset (hf _ isOpen_interior)
#align is_open_map.maps_to_interior IsOpenMap.mapsTo_interior
+-/
+#print IsOpenMap.image_interior_subset /-
theorem image_interior_subset (hf : IsOpenMap f) (s : Set α) :
f '' interior s ⊆ interior (f '' s) :=
(hf.mapsTo_interior (mapsTo_image f s)).image_subset
#align is_open_map.image_interior_subset IsOpenMap.image_interior_subset
+-/
+#print IsOpenMap.nhds_le /-
theorem nhds_le (hf : IsOpenMap f) (a : α) : 𝓝 (f a) ≤ (𝓝 a).map f :=
le_map fun s => hf.image_mem_nhds
#align is_open_map.nhds_le IsOpenMap.nhds_le
+-/
+#print IsOpenMap.of_nhds_le /-
theorem of_nhds_le (hf : ∀ a, 𝓝 (f a) ≤ map f (𝓝 a)) : IsOpenMap f := fun s hs =>
isOpen_iff_mem_nhds.2 fun b ⟨a, has, hab⟩ => hab ▸ hf _ (image_mem_map <| IsOpen.mem_nhds hs has)
#align is_open_map.of_nhds_le IsOpenMap.of_nhds_le
+-/
+#print IsOpenMap.of_sections /-
theorem of_sections {f : α → β}
(h : ∀ x, ∃ g : β → α, ContinuousAt g (f x) ∧ g (f x) = x ∧ RightInverse g f) : IsOpenMap f :=
of_nhds_le fun x =>
@@ -400,6 +497,7 @@ theorem of_sections {f : α → β}
_ ≤ map f (𝓝 (g (f x))) := (map_mono hgc)
_ = map f (𝓝 x) := by rw [hgx]
#align is_open_map.of_sections IsOpenMap.of_sections
+-/
#print IsOpenMap.of_inverse /-
theorem of_inverse {f : α → β} {f' : β → α} (h : Continuous f') (l_inv : LeftInverse f f')
@@ -408,56 +506,73 @@ theorem of_inverse {f : α → β} {f' : β → α} (h : Continuous f') (l_inv :
#align is_open_map.of_inverse IsOpenMap.of_inverse
-/
+#print IsOpenMap.to_quotientMap /-
/-- A continuous surjective open map is a quotient map. -/
theorem to_quotientMap {f : α → β} (open_map : IsOpenMap f) (cont : Continuous f)
(surj : Surjective f) : QuotientMap f :=
quotientMap_iff.2
⟨surj, fun s => ⟨fun h => h.Preimage cont, fun h => surj.image_preimage s ▸ open_map _ h⟩⟩
#align is_open_map.to_quotient_map IsOpenMap.to_quotientMap
+-/
+#print IsOpenMap.interior_preimage_subset_preimage_interior /-
theorem interior_preimage_subset_preimage_interior (hf : IsOpenMap f) {s : Set β} :
interior (f ⁻¹' s) ⊆ f ⁻¹' interior s :=
hf.mapsTo_interior (mapsTo_preimage _ _)
#align is_open_map.interior_preimage_subset_preimage_interior IsOpenMap.interior_preimage_subset_preimage_interior
+-/
+#print IsOpenMap.preimage_interior_eq_interior_preimage /-
theorem preimage_interior_eq_interior_preimage (hf₁ : IsOpenMap f) (hf₂ : Continuous f)
(s : Set β) : f ⁻¹' interior s = interior (f ⁻¹' s) :=
Subset.antisymm (preimage_interior_subset_interior_preimage hf₂)
(interior_preimage_subset_preimage_interior hf₁)
#align is_open_map.preimage_interior_eq_interior_preimage IsOpenMap.preimage_interior_eq_interior_preimage
+-/
+#print IsOpenMap.preimage_closure_subset_closure_preimage /-
theorem preimage_closure_subset_closure_preimage (hf : IsOpenMap f) {s : Set β} :
f ⁻¹' closure s ⊆ closure (f ⁻¹' s) :=
by
rw [← compl_subset_compl]
simp only [← interior_compl, ← preimage_compl, hf.interior_preimage_subset_preimage_interior]
#align is_open_map.preimage_closure_subset_closure_preimage IsOpenMap.preimage_closure_subset_closure_preimage
+-/
+#print IsOpenMap.preimage_closure_eq_closure_preimage /-
theorem preimage_closure_eq_closure_preimage (hf : IsOpenMap f) (hfc : Continuous f) (s : Set β) :
f ⁻¹' closure s = closure (f ⁻¹' s) :=
hf.preimage_closure_subset_closure_preimage.antisymm (hfc.closure_preimage_subset s)
#align is_open_map.preimage_closure_eq_closure_preimage IsOpenMap.preimage_closure_eq_closure_preimage
+-/
+#print IsOpenMap.preimage_frontier_subset_frontier_preimage /-
theorem preimage_frontier_subset_frontier_preimage (hf : IsOpenMap f) {s : Set β} :
f ⁻¹' frontier s ⊆ frontier (f ⁻¹' s) := by
simpa only [frontier_eq_closure_inter_closure, preimage_inter] using
inter_subset_inter hf.preimage_closure_subset_closure_preimage
hf.preimage_closure_subset_closure_preimage
#align is_open_map.preimage_frontier_subset_frontier_preimage IsOpenMap.preimage_frontier_subset_frontier_preimage
+-/
+#print IsOpenMap.preimage_frontier_eq_frontier_preimage /-
theorem preimage_frontier_eq_frontier_preimage (hf : IsOpenMap f) (hfc : Continuous f) (s : Set β) :
f ⁻¹' frontier s = frontier (f ⁻¹' s) := by
simp only [frontier_eq_closure_inter_closure, preimage_inter, preimage_compl,
hf.preimage_closure_eq_closure_preimage hfc]
#align is_open_map.preimage_frontier_eq_frontier_preimage IsOpenMap.preimage_frontier_eq_frontier_preimage
+-/
end IsOpenMap
+#print isOpenMap_iff_nhds_le /-
theorem isOpenMap_iff_nhds_le [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
IsOpenMap f ↔ ∀ a : α, 𝓝 (f a) ≤ (𝓝 a).map f :=
⟨fun hf => hf.nhds_le, IsOpenMap.of_nhds_le⟩
#align is_open_map_iff_nhds_le isOpenMap_iff_nhds_le
+-/
+#print isOpenMap_iff_interior /-
theorem isOpenMap_iff_interior [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
IsOpenMap f ↔ ∀ s, f '' interior s ⊆ interior (f '' s) :=
⟨IsOpenMap.image_interior_subset, fun hs u hu =>
@@ -466,12 +581,15 @@ theorem isOpenMap_iff_interior [TopologicalSpace α] [TopologicalSpace β] {f :
f '' u = f '' interior u := by rw [hu.interior_eq]
_ ⊆ interior (f '' u) := hs u⟩
#align is_open_map_iff_interior isOpenMap_iff_interior
+-/
+#print Inducing.isOpenMap /-
/-- An inducing map with an open range is an open map. -/
protected theorem Inducing.isOpenMap [TopologicalSpace α] [TopologicalSpace β] {f : α → β}
(hi : Inducing f) (ho : IsOpen (range f)) : IsOpenMap f :=
IsOpenMap.of_nhds_le fun x => (hi.map_nhds_of_mem _ <| IsOpen.mem_nhds ho <| mem_range_self _).ge
#align inducing.is_open_map Inducing.isOpenMap
+-/
section IsClosedMap
@@ -498,14 +616,18 @@ protected theorem id : IsClosedMap (@id α) := fun s hs => by rwa [image_id]
#align is_closed_map.id IsClosedMap.id
-/
+#print IsClosedMap.comp /-
protected theorem comp {g : β → γ} {f : α → β} (hg : IsClosedMap g) (hf : IsClosedMap f) :
IsClosedMap (g ∘ f) := by intro s hs; rw [image_comp]; exact hg _ (hf _ hs)
#align is_closed_map.comp IsClosedMap.comp
+-/
+#print IsClosedMap.closure_image_subset /-
theorem closure_image_subset {f : α → β} (hf : IsClosedMap f) (s : Set α) :
closure (f '' s) ⊆ f '' closure s :=
closure_minimal (image_subset _ subset_closure) (hf _ isClosed_closure)
#align is_closed_map.closure_image_subset IsClosedMap.closure_image_subset
+-/
#print IsClosedMap.of_inverse /-
theorem of_inverse {f : α → β} {f' : β → α} (h : Continuous f') (l_inv : LeftInverse f f')
@@ -515,25 +637,32 @@ theorem of_inverse {f : α → β} {f' : β → α} (h : Continuous f') (l_inv :
#align is_closed_map.of_inverse IsClosedMap.of_inverse
-/
+#print IsClosedMap.of_nonempty /-
theorem of_nonempty {f : α → β} (h : ∀ s, IsClosed s → s.Nonempty → IsClosed (f '' s)) :
IsClosedMap f := by
intro s hs; cases' eq_empty_or_nonempty s with h2s h2s
· simp_rw [h2s, image_empty, isClosed_empty]
· exact h s hs h2s
#align is_closed_map.of_nonempty IsClosedMap.of_nonempty
+-/
+#print IsClosedMap.closed_range /-
theorem closed_range {f : α → β} (hf : IsClosedMap f) : IsClosed (range f) :=
@image_univ _ _ f ▸ hf _ isClosed_univ
#align is_closed_map.closed_range IsClosedMap.closed_range
+-/
+#print IsClosedMap.to_quotientMap /-
theorem to_quotientMap {f : α → β} (hcl : IsClosedMap f) (hcont : Continuous f)
(hsurj : Surjective f) : QuotientMap f :=
quotientMap_iff_closed.2
⟨hsurj, fun s => ⟨fun hs => hs.Preimage hcont, fun hs => hsurj.image_preimage s ▸ hcl _ hs⟩⟩
#align is_closed_map.to_quotient_map IsClosedMap.to_quotientMap
+-/
end IsClosedMap
+#print Inducing.isClosedMap /-
theorem Inducing.isClosedMap [TopologicalSpace α] [TopologicalSpace β] {f : α → β} (hf : Inducing f)
(h : IsClosed (range f)) : IsClosedMap f :=
by
@@ -542,7 +671,9 @@ theorem Inducing.isClosedMap [TopologicalSpace α] [TopologicalSpace β] {f : α
rw [image_preimage_eq_inter_range]
exact ht.inter h
#align inducing.is_closed_map Inducing.isClosedMap
+-/
+#print isClosedMap_iff_closure_image /-
theorem isClosedMap_iff_closure_image [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
IsClosedMap f ↔ ∀ s, closure (f '' s) ⊆ f '' closure s :=
⟨IsClosedMap.closure_image_subset, fun hs c hc =>
@@ -551,6 +682,7 @@ theorem isClosedMap_iff_closure_image [TopologicalSpace α] [TopologicalSpace β
closure (f '' c) ⊆ f '' closure c := hs c
_ = f '' c := by rw [hc.closure_eq]⟩
#align is_closed_map_iff_closure_image isClosedMap_iff_closure_image
+-/
section OpenEmbedding
@@ -564,15 +696,20 @@ structure OpenEmbedding (f : α → β) extends Embedding f : Prop where
#align open_embedding OpenEmbedding
-/
+#print OpenEmbedding.isOpenMap /-
theorem OpenEmbedding.isOpenMap {f : α → β} (hf : OpenEmbedding f) : IsOpenMap f :=
hf.toEmbedding.to_inducing.IsOpenMap hf.open_range
#align open_embedding.is_open_map OpenEmbedding.isOpenMap
+-/
+#print OpenEmbedding.map_nhds_eq /-
theorem OpenEmbedding.map_nhds_eq {f : α → β} (hf : OpenEmbedding f) (a : α) :
map f (𝓝 a) = 𝓝 (f a) :=
hf.toEmbedding.map_nhds_of_mem _ <| hf.open_range.mem_nhds <| mem_range_self _
#align open_embedding.map_nhds_eq OpenEmbedding.map_nhds_eq
+-/
+#print OpenEmbedding.open_iff_image_open /-
theorem OpenEmbedding.open_iff_image_open {f : α → β} (hf : OpenEmbedding f) {s : Set α} :
IsOpen s ↔ IsOpen (f '' s) :=
⟨hf.IsOpenMap s, fun h =>
@@ -580,33 +717,45 @@ theorem OpenEmbedding.open_iff_image_open {f : α → β} (hf : OpenEmbedding f)
convert ← h.preimage hf.to_embedding.continuous
apply preimage_image_eq _ hf.inj⟩
#align open_embedding.open_iff_image_open OpenEmbedding.open_iff_image_open
+-/
+#print OpenEmbedding.tendsto_nhds_iff /-
theorem OpenEmbedding.tendsto_nhds_iff {ι : Type _} {f : ι → β} {g : β → γ} {a : Filter ι} {b : β}
(hg : OpenEmbedding g) : Tendsto f a (𝓝 b) ↔ Tendsto (g ∘ f) a (𝓝 (g b)) :=
hg.toEmbedding.tendsto_nhds_iff
#align open_embedding.tendsto_nhds_iff OpenEmbedding.tendsto_nhds_iff
+-/
+#print OpenEmbedding.continuous /-
theorem OpenEmbedding.continuous {f : α → β} (hf : OpenEmbedding f) : Continuous f :=
hf.toEmbedding.Continuous
#align open_embedding.continuous OpenEmbedding.continuous
+-/
+#print OpenEmbedding.open_iff_preimage_open /-
theorem OpenEmbedding.open_iff_preimage_open {f : α → β} (hf : OpenEmbedding f) {s : Set β}
(hs : s ⊆ range f) : IsOpen s ↔ IsOpen (f ⁻¹' s) :=
by
convert ← hf.open_iff_image_open.symm
rwa [image_preimage_eq_inter_range, inter_eq_self_of_subset_left]
#align open_embedding.open_iff_preimage_open OpenEmbedding.open_iff_preimage_open
+-/
+#print openEmbedding_of_embedding_open /-
theorem openEmbedding_of_embedding_open {f : α → β} (h₁ : Embedding f) (h₂ : IsOpenMap f) :
OpenEmbedding f :=
⟨h₁, h₂.isOpen_range⟩
#align open_embedding_of_embedding_open openEmbedding_of_embedding_open
+-/
+#print openEmbedding_iff_embedding_open /-
theorem openEmbedding_iff_embedding_open {f : α → β} :
OpenEmbedding f ↔ Embedding f ∧ IsOpenMap f :=
⟨fun h => ⟨h.1, h.IsOpenMap⟩, fun h => openEmbedding_of_embedding_open h.1 h.2⟩
#align open_embedding_iff_embedding_open openEmbedding_iff_embedding_open
+-/
+#print openEmbedding_of_continuous_injective_open /-
theorem openEmbedding_of_continuous_injective_open {f : α → β} (h₁ : Continuous f)
(h₂ : Injective f) (h₃ : IsOpenMap f) : OpenEmbedding f :=
by
@@ -614,12 +763,15 @@ theorem openEmbedding_of_continuous_injective_open {f : α → β} (h₁ : Conti
exact fun a =>
le_antisymm (h₁.tendsto _).le_comap (@comap_map _ _ (𝓝 a) _ h₂ ▸ comap_mono (h₃.nhds_le _))
#align open_embedding_of_continuous_injective_open openEmbedding_of_continuous_injective_open
+-/
+#print openEmbedding_iff_continuous_injective_open /-
theorem openEmbedding_iff_continuous_injective_open {f : α → β} :
OpenEmbedding f ↔ Continuous f ∧ Injective f ∧ IsOpenMap f :=
⟨fun h => ⟨h.Continuous, h.inj, h.IsOpenMap⟩, fun h =>
openEmbedding_of_continuous_injective_open h.1 h.2.1 h.2.2⟩
#align open_embedding_iff_continuous_injective_open openEmbedding_iff_continuous_injective_open
+-/
#print openEmbedding_id /-
theorem openEmbedding_id : OpenEmbedding (@id α) :=
@@ -627,26 +779,34 @@ theorem openEmbedding_id : OpenEmbedding (@id α) :=
#align open_embedding_id openEmbedding_id
-/
+#print OpenEmbedding.comp /-
theorem OpenEmbedding.comp {g : β → γ} {f : α → β} (hg : OpenEmbedding g) (hf : OpenEmbedding f) :
OpenEmbedding (g ∘ f) :=
⟨hg.1.comp hf.1, (hg.IsOpenMap.comp hf.IsOpenMap).isOpen_range⟩
#align open_embedding.comp OpenEmbedding.comp
+-/
+#print OpenEmbedding.isOpenMap_iff /-
theorem OpenEmbedding.isOpenMap_iff {g : β → γ} {f : α → β} (hg : OpenEmbedding g) :
IsOpenMap f ↔ IsOpenMap (g ∘ f) := by
simp only [isOpenMap_iff_nhds_le, ← @map_map _ _ _ _ f g, ← hg.map_nhds_eq, map_le_map_iff hg.inj]
#align open_embedding.is_open_map_iff OpenEmbedding.isOpenMap_iff
+-/
+#print OpenEmbedding.of_comp_iff /-
theorem OpenEmbedding.of_comp_iff (f : α → β) {g : β → γ} (hg : OpenEmbedding g) :
OpenEmbedding (g ∘ f) ↔ OpenEmbedding f := by
simp only [openEmbedding_iff_continuous_injective_open, ← hg.is_open_map_iff, ←
hg.1.continuous_iff, hg.inj.of_comp_iff]
#align open_embedding.of_comp_iff OpenEmbedding.of_comp_iff
+-/
+#print OpenEmbedding.of_comp /-
theorem OpenEmbedding.of_comp (f : α → β) {g : β → γ} (hg : OpenEmbedding g)
(h : OpenEmbedding (g ∘ f)) : OpenEmbedding f :=
(OpenEmbedding.of_comp_iff f hg).1 h
#align open_embedding.of_comp OpenEmbedding.of_comp
+-/
end OpenEmbedding
@@ -664,19 +824,26 @@ structure ClosedEmbedding (f : α → β) extends Embedding f : Prop where
variable {f : α → β}
+#print ClosedEmbedding.tendsto_nhds_iff /-
theorem ClosedEmbedding.tendsto_nhds_iff {ι : Type _} {g : ι → α} {a : Filter ι} {b : α}
(hf : ClosedEmbedding f) : Tendsto g a (𝓝 b) ↔ Tendsto (f ∘ g) a (𝓝 (f b)) :=
hf.toEmbedding.tendsto_nhds_iff
#align closed_embedding.tendsto_nhds_iff ClosedEmbedding.tendsto_nhds_iff
+-/
+#print ClosedEmbedding.continuous /-
theorem ClosedEmbedding.continuous (hf : ClosedEmbedding f) : Continuous f :=
hf.toEmbedding.Continuous
#align closed_embedding.continuous ClosedEmbedding.continuous
+-/
+#print ClosedEmbedding.isClosedMap /-
theorem ClosedEmbedding.isClosedMap (hf : ClosedEmbedding f) : IsClosedMap f :=
hf.toEmbedding.to_inducing.IsClosedMap hf.closed_range
#align closed_embedding.is_closed_map ClosedEmbedding.isClosedMap
+-/
+#print ClosedEmbedding.closed_iff_image_closed /-
theorem ClosedEmbedding.closed_iff_image_closed (hf : ClosedEmbedding f) {s : Set α} :
IsClosed s ↔ IsClosed (f '' s) :=
⟨hf.IsClosedMap s, fun h =>
@@ -684,19 +851,25 @@ theorem ClosedEmbedding.closed_iff_image_closed (hf : ClosedEmbedding f) {s : Se
convert ← continuous_iff_is_closed.mp hf.continuous _ h
apply preimage_image_eq _ hf.inj⟩
#align closed_embedding.closed_iff_image_closed ClosedEmbedding.closed_iff_image_closed
+-/
+#print ClosedEmbedding.closed_iff_preimage_closed /-
theorem ClosedEmbedding.closed_iff_preimage_closed (hf : ClosedEmbedding f) {s : Set β}
(hs : s ⊆ range f) : IsClosed s ↔ IsClosed (f ⁻¹' s) :=
by
convert ← hf.closed_iff_image_closed.symm
rwa [image_preimage_eq_inter_range, inter_eq_self_of_subset_left]
#align closed_embedding.closed_iff_preimage_closed ClosedEmbedding.closed_iff_preimage_closed
+-/
+#print closedEmbedding_of_embedding_closed /-
theorem closedEmbedding_of_embedding_closed (h₁ : Embedding f) (h₂ : IsClosedMap f) :
ClosedEmbedding f :=
⟨h₁, by convert h₂ univ isClosed_univ <;> simp⟩
#align closed_embedding_of_embedding_closed closedEmbedding_of_embedding_closed
+-/
+#print closedEmbedding_of_continuous_injective_closed /-
theorem closedEmbedding_of_continuous_injective_closed (h₁ : Continuous f) (h₂ : Injective f)
(h₃ : IsClosedMap f) : ClosedEmbedding f :=
by
@@ -710,6 +883,7 @@ theorem closedEmbedding_of_continuous_injective_closed (h₁ : Continuous f) (h
refine' fun hs => ⟨f '' s, h₃ s hs, _⟩
rw [preimage_image_eq _ h₂]
#align closed_embedding_of_continuous_injective_closed closedEmbedding_of_continuous_injective_closed
+-/
#print closedEmbedding_id /-
theorem closedEmbedding_id : ClosedEmbedding (@id α) :=
@@ -717,18 +891,22 @@ theorem closedEmbedding_id : ClosedEmbedding (@id α) :=
#align closed_embedding_id closedEmbedding_id
-/
+#print ClosedEmbedding.comp /-
theorem ClosedEmbedding.comp {g : β → γ} {f : α → β} (hg : ClosedEmbedding g)
(hf : ClosedEmbedding f) : ClosedEmbedding (g ∘ f) :=
⟨hg.toEmbedding.comp hf.toEmbedding,
show IsClosed (range (g ∘ f)) by
rw [range_comp, ← hg.closed_iff_image_closed] <;> exact hf.closed_range⟩
#align closed_embedding.comp ClosedEmbedding.comp
+-/
+#print ClosedEmbedding.closure_image_eq /-
theorem ClosedEmbedding.closure_image_eq {f : α → β} (hf : ClosedEmbedding f) (s : Set α) :
closure (f '' s) = f '' closure s :=
(hf.IsClosedMap.closure_image_subset _).antisymm
(image_closure_subset_closure_image hf.Continuous)
#align closed_embedding.closure_image_eq ClosedEmbedding.closure_image_eq
+-/
end ClosedEmbedding
mathlib commit https://github.com/leanprover-community/mathlib/commit/7e5137f579de09a059a5ce98f364a04e221aabf0
@@ -399,7 +399,6 @@ theorem of_sections {f : α → β}
𝓝 (f x) = map f (map g (𝓝 (f x))) := by rw [map_map, hgf.comp_eq_id, map_id]
_ ≤ map f (𝓝 (g (f x))) := (map_mono hgc)
_ = map f (𝓝 x) := by rw [hgx]
-
#align is_open_map.of_sections IsOpenMap.of_sections
#print IsOpenMap.of_inverse /-
@@ -465,8 +464,7 @@ theorem isOpenMap_iff_interior [TopologicalSpace α] [TopologicalSpace β] {f :
subset_interior_iff_isOpen.mp <|
calc
f '' u = f '' interior u := by rw [hu.interior_eq]
- _ ⊆ interior (f '' u) := hs u
- ⟩
+ _ ⊆ interior (f '' u) := hs u⟩
#align is_open_map_iff_interior isOpenMap_iff_interior
/-- An inducing map with an open range is an open map. -/
@@ -551,8 +549,7 @@ theorem isClosedMap_iff_closure_image [TopologicalSpace α] [TopologicalSpace β
isClosed_of_closure_subset <|
calc
closure (f '' c) ⊆ f '' closure c := hs c
- _ = f '' c := by rw [hc.closure_eq]
- ⟩
+ _ = f '' c := by rw [hc.closure_eq]⟩
#align is_closed_map_iff_closure_image isClosedMap_iff_closure_image
section OpenEmbedding
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -580,7 +580,7 @@ theorem OpenEmbedding.open_iff_image_open {f : α → β} (hf : OpenEmbedding f)
IsOpen s ↔ IsOpen (f '' s) :=
⟨hf.IsOpenMap s, fun h =>
by
- convert← h.preimage hf.to_embedding.continuous
+ convert ← h.preimage hf.to_embedding.continuous
apply preimage_image_eq _ hf.inj⟩
#align open_embedding.open_iff_image_open OpenEmbedding.open_iff_image_open
@@ -596,7 +596,7 @@ theorem OpenEmbedding.continuous {f : α → β} (hf : OpenEmbedding f) : Contin
theorem OpenEmbedding.open_iff_preimage_open {f : α → β} (hf : OpenEmbedding f) {s : Set β}
(hs : s ⊆ range f) : IsOpen s ↔ IsOpen (f ⁻¹' s) :=
by
- convert← hf.open_iff_image_open.symm
+ convert ← hf.open_iff_image_open.symm
rwa [image_preimage_eq_inter_range, inter_eq_self_of_subset_left]
#align open_embedding.open_iff_preimage_open OpenEmbedding.open_iff_preimage_open
@@ -684,14 +684,14 @@ theorem ClosedEmbedding.closed_iff_image_closed (hf : ClosedEmbedding f) {s : Se
IsClosed s ↔ IsClosed (f '' s) :=
⟨hf.IsClosedMap s, fun h =>
by
- convert← continuous_iff_is_closed.mp hf.continuous _ h
+ convert ← continuous_iff_is_closed.mp hf.continuous _ h
apply preimage_image_eq _ hf.inj⟩
#align closed_embedding.closed_iff_image_closed ClosedEmbedding.closed_iff_image_closed
theorem ClosedEmbedding.closed_iff_preimage_closed (hf : ClosedEmbedding f) {s : Set β}
(hs : s ⊆ range f) : IsClosed s ↔ IsClosed (f ⁻¹' s) :=
by
- convert← hf.closed_iff_image_closed.symm
+ convert ← hf.closed_iff_image_closed.symm
rwa [image_preimage_eq_inter_range, inter_eq_self_of_subset_left]
#align closed_embedding.closed_iff_preimage_closed ClosedEmbedding.closed_iff_preimage_closed
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -183,7 +183,7 @@ section Embedding
and for all `s : set α`, `s` is open iff it is the preimage of an open set. -/
@[mk_iff]
structure Embedding [tα : TopologicalSpace α] [tβ : TopologicalSpace β] (f : α → β) extends
- Inducing f : Prop where
+ Inducing f : Prop where
inj : Injective f
#align embedding Embedding
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -53,7 +53,7 @@ open map, closed map, embedding, quotient map, identification map
open Set Filter Function
-open Topology Filter
+open scoped Topology Filter
variable {α : Type _} {β : Type _} {γ : Type _} {δ : Type _}
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -77,152 +77,68 @@ theorem inducing_id : Inducing (@id α) :=
#align inducing_id inducing_id
-/
-/- warning: inducing.comp -> Inducing.comp is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] {g : β -> γ} {f : α -> β}, (Inducing.{u2, u3} β γ _inst_2 _inst_3 g) -> (Inducing.{u1, u2} α β _inst_1 _inst_2 f) -> (Inducing.{u1, u3} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u2, succ u3} α β γ g f))
-but is expected to have type
- forall {α : Type.{u1}} {β : Type.{u3}} {γ : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u3} β] [_inst_3 : TopologicalSpace.{u2} γ] {g : β -> γ} {f : α -> β}, (Inducing.{u3, u2} β γ _inst_2 _inst_3 g) -> (Inducing.{u1, u3} α β _inst_1 _inst_2 f) -> (Inducing.{u1, u2} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u3, succ u2} α β γ g f))
-Case conversion may be inaccurate. Consider using '#align inducing.comp Inducing.compₓ'. -/
protected theorem Inducing.comp {g : β → γ} {f : α → β} (hg : Inducing g) (hf : Inducing f) :
Inducing (g ∘ f) :=
⟨by rw [hf.induced, hg.induced, induced_compose]⟩
#align inducing.comp Inducing.comp
-/- warning: inducing_of_inducing_compose -> inducing_of_inducing_compose is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] {f : α -> β} {g : β -> γ}, (Continuous.{u1, u2} α β _inst_1 _inst_2 f) -> (Continuous.{u2, u3} β γ _inst_2 _inst_3 g) -> (Inducing.{u1, u3} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u2, succ u3} α β γ g f)) -> (Inducing.{u1, u2} α β _inst_1 _inst_2 f)
-but is expected to have type
- forall {α : Type.{u3}} {β : Type.{u2}} {γ : Type.{u1}} [_inst_1 : TopologicalSpace.{u3} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u1} γ] {f : α -> β} {g : β -> γ}, (Continuous.{u3, u2} α β _inst_1 _inst_2 f) -> (Continuous.{u2, u1} β γ _inst_2 _inst_3 g) -> (Inducing.{u3, u1} α γ _inst_1 _inst_3 (Function.comp.{succ u3, succ u2, succ u1} α β γ g f)) -> (Inducing.{u3, u2} α β _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align inducing_of_inducing_compose inducing_of_inducing_composeₓ'. -/
theorem inducing_of_inducing_compose {f : α → β} {g : β → γ} (hf : Continuous f) (hg : Continuous g)
(hgf : Inducing (g ∘ f)) : Inducing f :=
⟨le_antisymm (by rwa [← continuous_iff_le_induced])
(by rw [hgf.induced, ← continuous_iff_le_induced]; apply hg.comp continuous_induced_dom)⟩
#align inducing_of_inducing_compose inducing_of_inducing_compose
-/- warning: inducing_iff_nhds -> inducing_iff_nhds is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, Iff (Inducing.{u1, u2} α β _inst_1 _inst_2 f) (forall (a : α), Eq.{succ u1} (Filter.{u1} α) (nhds.{u1} α _inst_1 a) (Filter.comap.{u1, u2} α β f (nhds.{u2} β _inst_2 (f a))))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, Iff (Inducing.{u2, u1} α β _inst_1 _inst_2 f) (forall (a : α), Eq.{succ u2} (Filter.{u2} α) (nhds.{u2} α _inst_1 a) (Filter.comap.{u2, u1} α β f (nhds.{u1} β _inst_2 (f a))))
-Case conversion may be inaccurate. Consider using '#align inducing_iff_nhds inducing_iff_nhdsₓ'. -/
theorem inducing_iff_nhds {f : α → β} : Inducing f ↔ ∀ a, 𝓝 a = comap f (𝓝 (f a)) :=
(inducing_iff _).trans (induced_iff_nhds_eq f)
#align inducing_iff_nhds inducing_iff_nhds
-/- warning: inducing.nhds_eq_comap -> Inducing.nhds_eq_comap is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (Inducing.{u1, u2} α β _inst_1 _inst_2 f) -> (forall (a : α), Eq.{succ u1} (Filter.{u1} α) (nhds.{u1} α _inst_1 a) (Filter.comap.{u1, u2} α β f (nhds.{u2} β _inst_2 (f a))))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (Inducing.{u2, u1} α β _inst_1 _inst_2 f) -> (forall (a : α), Eq.{succ u2} (Filter.{u2} α) (nhds.{u2} α _inst_1 a) (Filter.comap.{u2, u1} α β f (nhds.{u1} β _inst_2 (f a))))
-Case conversion may be inaccurate. Consider using '#align inducing.nhds_eq_comap Inducing.nhds_eq_comapₓ'. -/
theorem Inducing.nhds_eq_comap {f : α → β} (hf : Inducing f) : ∀ a : α, 𝓝 a = comap f (𝓝 <| f a) :=
inducing_iff_nhds.1 hf
#align inducing.nhds_eq_comap Inducing.nhds_eq_comap
-/- warning: inducing.nhds_set_eq_comap -> Inducing.nhdsSet_eq_comap is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (Inducing.{u1, u2} α β _inst_1 _inst_2 f) -> (forall (s : Set.{u1} α), Eq.{succ u1} (Filter.{u1} α) (nhdsSet.{u1} α _inst_1 s) (Filter.comap.{u1, u2} α β f (nhdsSet.{u2} β _inst_2 (Set.image.{u1, u2} α β f s))))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (Inducing.{u2, u1} α β _inst_1 _inst_2 f) -> (forall (s : Set.{u2} α), Eq.{succ u2} (Filter.{u2} α) (nhdsSet.{u2} α _inst_1 s) (Filter.comap.{u2, u1} α β f (nhdsSet.{u1} β _inst_2 (Set.image.{u2, u1} α β f s))))
-Case conversion may be inaccurate. Consider using '#align inducing.nhds_set_eq_comap Inducing.nhdsSet_eq_comapₓ'. -/
theorem Inducing.nhdsSet_eq_comap {f : α → β} (hf : Inducing f) (s : Set α) :
𝓝ˢ s = comap f (𝓝ˢ (f '' s)) := by
simp only [nhdsSet, sSup_image, comap_supr, hf.nhds_eq_comap, iSup_image]
#align inducing.nhds_set_eq_comap Inducing.nhdsSet_eq_comap
-/- warning: inducing.map_nhds_eq -> Inducing.map_nhds_eq is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (Inducing.{u1, u2} α β _inst_1 _inst_2 f) -> (forall (a : α), Eq.{succ u2} (Filter.{u2} β) (Filter.map.{u1, u2} α β f (nhds.{u1} α _inst_1 a)) (nhdsWithin.{u2} β _inst_2 (f a) (Set.range.{u2, succ u1} β α f)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (Inducing.{u2, u1} α β _inst_1 _inst_2 f) -> (forall (a : α), Eq.{succ u1} (Filter.{u1} β) (Filter.map.{u2, u1} α β f (nhds.{u2} α _inst_1 a)) (nhdsWithin.{u1} β _inst_2 (f a) (Set.range.{u1, succ u2} β α f)))
-Case conversion may be inaccurate. Consider using '#align inducing.map_nhds_eq Inducing.map_nhds_eqₓ'. -/
theorem Inducing.map_nhds_eq {f : α → β} (hf : Inducing f) (a : α) : (𝓝 a).map f = 𝓝[range f] f a :=
hf.induced.symm ▸ map_nhds_induced_eq a
#align inducing.map_nhds_eq Inducing.map_nhds_eq
-/- warning: inducing.map_nhds_of_mem -> Inducing.map_nhds_of_mem is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (Inducing.{u1, u2} α β _inst_1 _inst_2 f) -> (forall (a : α), (Membership.Mem.{u2, u2} (Set.{u2} β) (Filter.{u2} β) (Filter.hasMem.{u2} β) (Set.range.{u2, succ u1} β α f) (nhds.{u2} β _inst_2 (f a))) -> (Eq.{succ u2} (Filter.{u2} β) (Filter.map.{u1, u2} α β f (nhds.{u1} α _inst_1 a)) (nhds.{u2} β _inst_2 (f a))))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (Inducing.{u2, u1} α β _inst_1 _inst_2 f) -> (forall (a : α), (Membership.mem.{u1, u1} (Set.{u1} β) (Filter.{u1} β) (instMembershipSetFilter.{u1} β) (Set.range.{u1, succ u2} β α f) (nhds.{u1} β _inst_2 (f a))) -> (Eq.{succ u1} (Filter.{u1} β) (Filter.map.{u2, u1} α β f (nhds.{u2} α _inst_1 a)) (nhds.{u1} β _inst_2 (f a))))
-Case conversion may be inaccurate. Consider using '#align inducing.map_nhds_of_mem Inducing.map_nhds_of_memₓ'. -/
theorem Inducing.map_nhds_of_mem {f : α → β} (hf : Inducing f) (a : α) (h : range f ∈ 𝓝 (f a)) :
(𝓝 a).map f = 𝓝 (f a) :=
hf.induced.symm ▸ map_nhds_induced_of_mem h
#align inducing.map_nhds_of_mem Inducing.map_nhds_of_mem
-/- warning: inducing.image_mem_nhds_within -> Inducing.image_mem_nhdsWithin is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (Inducing.{u1, u2} α β _inst_1 _inst_2 f) -> (forall {a : α} {s : Set.{u1} α}, (Membership.Mem.{u1, u1} (Set.{u1} α) (Filter.{u1} α) (Filter.hasMem.{u1} α) s (nhds.{u1} α _inst_1 a)) -> (Membership.Mem.{u2, u2} (Set.{u2} β) (Filter.{u2} β) (Filter.hasMem.{u2} β) (Set.image.{u1, u2} α β f s) (nhdsWithin.{u2} β _inst_2 (f a) (Set.range.{u2, succ u1} β α f))))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (Inducing.{u2, u1} α β _inst_1 _inst_2 f) -> (forall {a : α} {s : Set.{u2} α}, (Membership.mem.{u2, u2} (Set.{u2} α) (Filter.{u2} α) (instMembershipSetFilter.{u2} α) s (nhds.{u2} α _inst_1 a)) -> (Membership.mem.{u1, u1} (Set.{u1} β) (Filter.{u1} β) (instMembershipSetFilter.{u1} β) (Set.image.{u2, u1} α β f s) (nhdsWithin.{u1} β _inst_2 (f a) (Set.range.{u1, succ u2} β α f))))
-Case conversion may be inaccurate. Consider using '#align inducing.image_mem_nhds_within Inducing.image_mem_nhdsWithinₓ'. -/
theorem Inducing.image_mem_nhdsWithin {f : α → β} (hf : Inducing f) {a : α} {s : Set α}
(hs : s ∈ 𝓝 a) : f '' s ∈ 𝓝[range f] f a :=
hf.map_nhds_eq a ▸ image_mem_map hs
#align inducing.image_mem_nhds_within Inducing.image_mem_nhdsWithin
-/- warning: inducing.tendsto_nhds_iff -> Inducing.tendsto_nhds_iff is a dubious translation:
-lean 3 declaration is
- forall {β : Type.{u1}} {γ : Type.{u2}} [_inst_2 : TopologicalSpace.{u1} β] [_inst_3 : TopologicalSpace.{u2} γ] {ι : Type.{u3}} {f : ι -> β} {g : β -> γ} {a : Filter.{u3} ι} {b : β}, (Inducing.{u1, u2} β γ _inst_2 _inst_3 g) -> (Iff (Filter.Tendsto.{u3, u1} ι β f a (nhds.{u1} β _inst_2 b)) (Filter.Tendsto.{u3, u2} ι γ (Function.comp.{succ u3, succ u1, succ u2} ι β γ g f) a (nhds.{u2} γ _inst_3 (g b))))
-but is expected to have type
- forall {β : Type.{u2}} {γ : Type.{u1}} [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u1} γ] {ι : Type.{u3}} {f : ι -> β} {g : β -> γ} {a : Filter.{u3} ι} {b : β}, (Inducing.{u2, u1} β γ _inst_2 _inst_3 g) -> (Iff (Filter.Tendsto.{u3, u2} ι β f a (nhds.{u2} β _inst_2 b)) (Filter.Tendsto.{u3, u1} ι γ (Function.comp.{succ u3, succ u2, succ u1} ι β γ g f) a (nhds.{u1} γ _inst_3 (g b))))
-Case conversion may be inaccurate. Consider using '#align inducing.tendsto_nhds_iff Inducing.tendsto_nhds_iffₓ'. -/
theorem Inducing.tendsto_nhds_iff {ι : Type _} {f : ι → β} {g : β → γ} {a : Filter ι} {b : β}
(hg : Inducing g) : Tendsto f a (𝓝 b) ↔ Tendsto (g ∘ f) a (𝓝 (g b)) := by
rw [hg.nhds_eq_comap, tendsto_comap_iff]
#align inducing.tendsto_nhds_iff Inducing.tendsto_nhds_iff
-/- warning: inducing.continuous_at_iff -> Inducing.continuousAt_iff is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] {f : α -> β} {g : β -> γ}, (Inducing.{u2, u3} β γ _inst_2 _inst_3 g) -> (forall {x : α}, Iff (ContinuousAt.{u1, u2} α β _inst_1 _inst_2 f x) (ContinuousAt.{u1, u3} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u2, succ u3} α β γ g f) x))
-but is expected to have type
- forall {α : Type.{u1}} {β : Type.{u3}} {γ : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u3} β] [_inst_3 : TopologicalSpace.{u2} γ] {f : α -> β} {g : β -> γ}, (Inducing.{u3, u2} β γ _inst_2 _inst_3 g) -> (forall {x : α}, Iff (ContinuousAt.{u1, u3} α β _inst_1 _inst_2 f x) (ContinuousAt.{u1, u2} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u3, succ u2} α β γ g f) x))
-Case conversion may be inaccurate. Consider using '#align inducing.continuous_at_iff Inducing.continuousAt_iffₓ'. -/
theorem Inducing.continuousAt_iff {f : α → β} {g : β → γ} (hg : Inducing g) {x : α} :
ContinuousAt f x ↔ ContinuousAt (g ∘ f) x := by
simp_rw [ContinuousAt, Inducing.tendsto_nhds_iff hg]
#align inducing.continuous_at_iff Inducing.continuousAt_iff
-/- warning: inducing.continuous_iff -> Inducing.continuous_iff is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] {f : α -> β} {g : β -> γ}, (Inducing.{u2, u3} β γ _inst_2 _inst_3 g) -> (Iff (Continuous.{u1, u2} α β _inst_1 _inst_2 f) (Continuous.{u1, u3} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u2, succ u3} α β γ g f)))
-but is expected to have type
- forall {α : Type.{u1}} {β : Type.{u3}} {γ : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u3} β] [_inst_3 : TopologicalSpace.{u2} γ] {f : α -> β} {g : β -> γ}, (Inducing.{u3, u2} β γ _inst_2 _inst_3 g) -> (Iff (Continuous.{u1, u3} α β _inst_1 _inst_2 f) (Continuous.{u1, u2} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u3, succ u2} α β γ g f)))
-Case conversion may be inaccurate. Consider using '#align inducing.continuous_iff Inducing.continuous_iffₓ'. -/
theorem Inducing.continuous_iff {f : α → β} {g : β → γ} (hg : Inducing g) :
Continuous f ↔ Continuous (g ∘ f) := by
simp_rw [continuous_iff_continuousAt, hg.continuous_at_iff]
#align inducing.continuous_iff Inducing.continuous_iff
-/- warning: inducing.continuous_at_iff' -> Inducing.continuousAt_iff' is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] {f : α -> β} {g : β -> γ}, (Inducing.{u1, u2} α β _inst_1 _inst_2 f) -> (forall {x : α}, (Membership.Mem.{u2, u2} (Set.{u2} β) (Filter.{u2} β) (Filter.hasMem.{u2} β) (Set.range.{u2, succ u1} β α f) (nhds.{u2} β _inst_2 (f x))) -> (Iff (ContinuousAt.{u1, u3} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u2, succ u3} α β γ g f) x) (ContinuousAt.{u2, u3} β γ _inst_2 _inst_3 g (f x))))
-but is expected to have type
- forall {α : Type.{u3}} {β : Type.{u2}} {γ : Type.{u1}} [_inst_1 : TopologicalSpace.{u3} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u1} γ] {f : α -> β} {g : β -> γ}, (Inducing.{u3, u2} α β _inst_1 _inst_2 f) -> (forall {x : α}, (Membership.mem.{u2, u2} (Set.{u2} β) (Filter.{u2} β) (instMembershipSetFilter.{u2} β) (Set.range.{u2, succ u3} β α f) (nhds.{u2} β _inst_2 (f x))) -> (Iff (ContinuousAt.{u3, u1} α γ _inst_1 _inst_3 (Function.comp.{succ u3, succ u2, succ u1} α β γ g f) x) (ContinuousAt.{u2, u1} β γ _inst_2 _inst_3 g (f x))))
-Case conversion may be inaccurate. Consider using '#align inducing.continuous_at_iff' Inducing.continuousAt_iff'ₓ'. -/
theorem Inducing.continuousAt_iff' {f : α → β} {g : β → γ} (hf : Inducing f) {x : α}
(h : range f ∈ 𝓝 (f x)) : ContinuousAt (g ∘ f) x ↔ ContinuousAt g (f x) := by
simp_rw [ContinuousAt, Filter.Tendsto, ← hf.map_nhds_of_mem _ h, Filter.map_map]
#align inducing.continuous_at_iff' Inducing.continuousAt_iff'
-/- warning: inducing.continuous -> Inducing.continuous is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (Inducing.{u1, u2} α β _inst_1 _inst_2 f) -> (Continuous.{u1, u2} α β _inst_1 _inst_2 f)
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (Inducing.{u2, u1} α β _inst_1 _inst_2 f) -> (Continuous.{u2, u1} α β _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align inducing.continuous Inducing.continuousₓ'. -/
protected theorem Inducing.continuous {f : α → β} (hf : Inducing f) : Continuous f :=
hf.continuous_iff.mp continuous_id
#align inducing.continuous Inducing.continuous
-/- warning: inducing.inducing_iff -> Inducing.inducing_iff is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] {f : α -> β} {g : β -> γ}, (Inducing.{u2, u3} β γ _inst_2 _inst_3 g) -> (Iff (Inducing.{u1, u2} α β _inst_1 _inst_2 f) (Inducing.{u1, u3} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u2, succ u3} α β γ g f)))
-but is expected to have type
- forall {α : Type.{u1}} {β : Type.{u3}} {γ : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u3} β] [_inst_3 : TopologicalSpace.{u2} γ] {f : α -> β} {g : β -> γ}, (Inducing.{u3, u2} β γ _inst_2 _inst_3 g) -> (Iff (Inducing.{u1, u3} α β _inst_1 _inst_2 f) (Inducing.{u1, u2} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u3, succ u2} α β γ g f)))
-Case conversion may be inaccurate. Consider using '#align inducing.inducing_iff Inducing.inducing_iffₓ'. -/
protected theorem Inducing.inducing_iff {f : α → β} {g : β → γ} (hg : Inducing g) :
Inducing f ↔ Inducing (g ∘ f) :=
by
@@ -231,64 +147,28 @@ protected theorem Inducing.inducing_iff {f : α → β} {g : β → γ} (hg : In
exact hgf.continuous
#align inducing.inducing_iff Inducing.inducing_iff
-/- warning: inducing.closure_eq_preimage_closure_image -> Inducing.closure_eq_preimage_closure_image is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (Inducing.{u1, u2} α β _inst_1 _inst_2 f) -> (forall (s : Set.{u1} α), Eq.{succ u1} (Set.{u1} α) (closure.{u1} α _inst_1 s) (Set.preimage.{u1, u2} α β f (closure.{u2} β _inst_2 (Set.image.{u1, u2} α β f s))))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (Inducing.{u2, u1} α β _inst_1 _inst_2 f) -> (forall (s : Set.{u2} α), Eq.{succ u2} (Set.{u2} α) (closure.{u2} α _inst_1 s) (Set.preimage.{u2, u1} α β f (closure.{u1} β _inst_2 (Set.image.{u2, u1} α β f s))))
-Case conversion may be inaccurate. Consider using '#align inducing.closure_eq_preimage_closure_image Inducing.closure_eq_preimage_closure_imageₓ'. -/
theorem Inducing.closure_eq_preimage_closure_image {f : α → β} (hf : Inducing f) (s : Set α) :
closure s = f ⁻¹' closure (f '' s) := by ext x;
rw [Set.mem_preimage, ← closure_induced, hf.induced]
#align inducing.closure_eq_preimage_closure_image Inducing.closure_eq_preimage_closure_image
-/- warning: inducing.is_closed_iff -> Inducing.isClosed_iff is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (Inducing.{u1, u2} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u1} α}, Iff (IsClosed.{u1} α _inst_1 s) (Exists.{succ u2} (Set.{u2} β) (fun (t : Set.{u2} β) => And (IsClosed.{u2} β _inst_2 t) (Eq.{succ u1} (Set.{u1} α) (Set.preimage.{u1, u2} α β f t) s))))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (Inducing.{u2, u1} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u2} α}, Iff (IsClosed.{u2} α _inst_1 s) (Exists.{succ u1} (Set.{u1} β) (fun (t : Set.{u1} β) => And (IsClosed.{u1} β _inst_2 t) (Eq.{succ u2} (Set.{u2} α) (Set.preimage.{u2, u1} α β f t) s))))
-Case conversion may be inaccurate. Consider using '#align inducing.is_closed_iff Inducing.isClosed_iffₓ'. -/
theorem Inducing.isClosed_iff {f : α → β} (hf : Inducing f) {s : Set α} :
IsClosed s ↔ ∃ t, IsClosed t ∧ f ⁻¹' t = s := by rw [hf.induced, isClosed_induced_iff]
#align inducing.is_closed_iff Inducing.isClosed_iff
-/- warning: inducing.is_closed_iff' -> Inducing.isClosed_iff' is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (Inducing.{u1, u2} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u1} α}, Iff (IsClosed.{u1} α _inst_1 s) (forall (x : α), (Membership.Mem.{u2, u2} β (Set.{u2} β) (Set.hasMem.{u2} β) (f x) (closure.{u2} β _inst_2 (Set.image.{u1, u2} α β f s))) -> (Membership.Mem.{u1, u1} α (Set.{u1} α) (Set.hasMem.{u1} α) x s)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (Inducing.{u2, u1} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u2} α}, Iff (IsClosed.{u2} α _inst_1 s) (forall (x : α), (Membership.mem.{u1, u1} β (Set.{u1} β) (Set.instMembershipSet.{u1} β) (f x) (closure.{u1} β _inst_2 (Set.image.{u2, u1} α β f s))) -> (Membership.mem.{u2, u2} α (Set.{u2} α) (Set.instMembershipSet.{u2} α) x s)))
-Case conversion may be inaccurate. Consider using '#align inducing.is_closed_iff' Inducing.isClosed_iff'ₓ'. -/
theorem Inducing.isClosed_iff' {f : α → β} (hf : Inducing f) {s : Set α} :
IsClosed s ↔ ∀ x, f x ∈ closure (f '' s) → x ∈ s := by rw [hf.induced, isClosed_induced_iff']
#align inducing.is_closed_iff' Inducing.isClosed_iff'
-/- warning: inducing.is_closed_preimage -> Inducing.isClosed_preimage is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (Inducing.{u1, u2} α β _inst_1 _inst_2 f) -> (forall (s : Set.{u2} β), (IsClosed.{u2} β _inst_2 s) -> (IsClosed.{u1} α _inst_1 (Set.preimage.{u1, u2} α β f s)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (Inducing.{u2, u1} α β _inst_1 _inst_2 f) -> (forall (s : Set.{u1} β), (IsClosed.{u1} β _inst_2 s) -> (IsClosed.{u2} α _inst_1 (Set.preimage.{u2, u1} α β f s)))
-Case conversion may be inaccurate. Consider using '#align inducing.is_closed_preimage Inducing.isClosed_preimageₓ'. -/
theorem Inducing.isClosed_preimage {f : α → β} (h : Inducing f) (s : Set β) (hs : IsClosed s) :
IsClosed (f ⁻¹' s) :=
(Inducing.isClosed_iff h).mpr ⟨s, hs, rfl⟩
#align inducing.is_closed_preimage Inducing.isClosed_preimage
-/- warning: inducing.is_open_iff -> Inducing.isOpen_iff is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (Inducing.{u1, u2} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u1} α}, Iff (IsOpen.{u1} α _inst_1 s) (Exists.{succ u2} (Set.{u2} β) (fun (t : Set.{u2} β) => And (IsOpen.{u2} β _inst_2 t) (Eq.{succ u1} (Set.{u1} α) (Set.preimage.{u1, u2} α β f t) s))))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (Inducing.{u2, u1} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u2} α}, Iff (IsOpen.{u2} α _inst_1 s) (Exists.{succ u1} (Set.{u1} β) (fun (t : Set.{u1} β) => And (IsOpen.{u1} β _inst_2 t) (Eq.{succ u2} (Set.{u2} α) (Set.preimage.{u2, u1} α β f t) s))))
-Case conversion may be inaccurate. Consider using '#align inducing.is_open_iff Inducing.isOpen_iffₓ'. -/
theorem Inducing.isOpen_iff {f : α → β} (hf : Inducing f) {s : Set α} :
IsOpen s ↔ ∃ t, IsOpen t ∧ f ⁻¹' t = s := by rw [hf.induced, isOpen_induced_iff]
#align inducing.is_open_iff Inducing.isOpen_iff
-/- warning: inducing.dense_iff -> Inducing.dense_iff is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (Inducing.{u1, u2} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u1} α}, Iff (Dense.{u1} α _inst_1 s) (forall (x : α), Membership.Mem.{u2, u2} β (Set.{u2} β) (Set.hasMem.{u2} β) (f x) (closure.{u2} β _inst_2 (Set.image.{u1, u2} α β f s))))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (Inducing.{u2, u1} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u2} α}, Iff (Dense.{u2} α _inst_1 s) (forall (x : α), Membership.mem.{u1, u1} β (Set.{u1} β) (Set.instMembershipSet.{u1} β) (f x) (closure.{u1} β _inst_2 (Set.image.{u2, u1} α β f s))))
-Case conversion may be inaccurate. Consider using '#align inducing.dense_iff Inducing.dense_iffₓ'. -/
theorem Inducing.dense_iff {f : α → β} (hf : Inducing f) {s : Set α} :
Dense s ↔ ∀ x, f x ∈ closure (f '' s) := by
simp only [Dense, hf.closure_eq_preimage_closure_image, mem_preimage]
@@ -318,12 +198,6 @@ theorem Function.Injective.embedding_induced [t : TopologicalSpace β] {f : α
variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ]
-/- warning: embedding.mk' -> Embedding.mk' is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] (f : α -> β), (Function.Injective.{succ u1, succ u2} α β f) -> (forall (a : α), Eq.{succ u1} (Filter.{u1} α) (Filter.comap.{u1, u2} α β f (nhds.{u2} β _inst_2 (f a))) (nhds.{u1} α _inst_1 a)) -> (Embedding.{u1, u2} α β _inst_1 _inst_2 f)
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] (f : α -> β), (Function.Injective.{succ u2, succ u1} α β f) -> (forall (a : α), Eq.{succ u2} (Filter.{u2} α) (Filter.comap.{u2, u1} α β f (nhds.{u1} β _inst_2 (f a))) (nhds.{u2} α _inst_1 a)) -> (Embedding.{u2, u1} α β _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align embedding.mk' Embedding.mk'ₓ'. -/
theorem Embedding.mk' (f : α → β) (inj : Injective f) (induced : ∀ a, comap f (𝓝 (f a)) = 𝓝 a) :
Embedding f :=
⟨inducing_iff_nhds.2 fun a => (induced a).symm, inj⟩
@@ -335,23 +209,11 @@ theorem embedding_id : Embedding (@id α) :=
#align embedding_id embedding_id
-/
-/- warning: embedding.comp -> Embedding.comp is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] {g : β -> γ} {f : α -> β}, (Embedding.{u2, u3} β γ _inst_2 _inst_3 g) -> (Embedding.{u1, u2} α β _inst_1 _inst_2 f) -> (Embedding.{u1, u3} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u2, succ u3} α β γ g f))
-but is expected to have type
- forall {α : Type.{u1}} {β : Type.{u3}} {γ : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u3} β] [_inst_3 : TopologicalSpace.{u2} γ] {g : β -> γ} {f : α -> β}, (Embedding.{u3, u2} β γ _inst_2 _inst_3 g) -> (Embedding.{u1, u3} α β _inst_1 _inst_2 f) -> (Embedding.{u1, u2} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u3, succ u2} α β γ g f))
-Case conversion may be inaccurate. Consider using '#align embedding.comp Embedding.compₓ'. -/
theorem Embedding.comp {g : β → γ} {f : α → β} (hg : Embedding g) (hf : Embedding f) :
Embedding (g ∘ f) :=
{ hg.to_inducing.comp hf.to_inducing with inj := fun a₁ a₂ h => hf.inj <| hg.inj h }
#align embedding.comp Embedding.comp
-/- warning: embedding_of_embedding_compose -> embedding_of_embedding_compose is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] {f : α -> β} {g : β -> γ}, (Continuous.{u1, u2} α β _inst_1 _inst_2 f) -> (Continuous.{u2, u3} β γ _inst_2 _inst_3 g) -> (Embedding.{u1, u3} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u2, succ u3} α β γ g f)) -> (Embedding.{u1, u2} α β _inst_1 _inst_2 f)
-but is expected to have type
- forall {α : Type.{u3}} {β : Type.{u2}} {γ : Type.{u1}} [_inst_1 : TopologicalSpace.{u3} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u1} γ] {f : α -> β} {g : β -> γ}, (Continuous.{u3, u2} α β _inst_1 _inst_2 f) -> (Continuous.{u2, u1} β γ _inst_2 _inst_3 g) -> (Embedding.{u3, u1} α γ _inst_1 _inst_3 (Function.comp.{succ u3, succ u2, succ u1} α β γ g f)) -> (Embedding.{u3, u2} α β _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align embedding_of_embedding_compose embedding_of_embedding_composeₓ'. -/
theorem embedding_of_embedding_compose {f : α → β} {g : β → γ} (hf : Continuous f)
(hg : Continuous g) (hgf : Embedding (g ∘ f)) : Embedding f :=
{ induced := (inducing_of_inducing_compose hf hg hgf.to_inducing).induced
@@ -365,77 +227,35 @@ protected theorem Function.LeftInverse.embedding {f : α → β} {g : β → α}
#align function.left_inverse.embedding Function.LeftInverse.embedding
-/
-/- warning: embedding.map_nhds_eq -> Embedding.map_nhds_eq is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (Embedding.{u1, u2} α β _inst_1 _inst_2 f) -> (forall (a : α), Eq.{succ u2} (Filter.{u2} β) (Filter.map.{u1, u2} α β f (nhds.{u1} α _inst_1 a)) (nhdsWithin.{u2} β _inst_2 (f a) (Set.range.{u2, succ u1} β α f)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (Embedding.{u2, u1} α β _inst_1 _inst_2 f) -> (forall (a : α), Eq.{succ u1} (Filter.{u1} β) (Filter.map.{u2, u1} α β f (nhds.{u2} α _inst_1 a)) (nhdsWithin.{u1} β _inst_2 (f a) (Set.range.{u1, succ u2} β α f)))
-Case conversion may be inaccurate. Consider using '#align embedding.map_nhds_eq Embedding.map_nhds_eqₓ'. -/
theorem Embedding.map_nhds_eq {f : α → β} (hf : Embedding f) (a : α) :
(𝓝 a).map f = 𝓝[range f] f a :=
hf.1.map_nhds_eq a
#align embedding.map_nhds_eq Embedding.map_nhds_eq
-/- warning: embedding.map_nhds_of_mem -> Embedding.map_nhds_of_mem is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (Embedding.{u1, u2} α β _inst_1 _inst_2 f) -> (forall (a : α), (Membership.Mem.{u2, u2} (Set.{u2} β) (Filter.{u2} β) (Filter.hasMem.{u2} β) (Set.range.{u2, succ u1} β α f) (nhds.{u2} β _inst_2 (f a))) -> (Eq.{succ u2} (Filter.{u2} β) (Filter.map.{u1, u2} α β f (nhds.{u1} α _inst_1 a)) (nhds.{u2} β _inst_2 (f a))))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (Embedding.{u2, u1} α β _inst_1 _inst_2 f) -> (forall (a : α), (Membership.mem.{u1, u1} (Set.{u1} β) (Filter.{u1} β) (instMembershipSetFilter.{u1} β) (Set.range.{u1, succ u2} β α f) (nhds.{u1} β _inst_2 (f a))) -> (Eq.{succ u1} (Filter.{u1} β) (Filter.map.{u2, u1} α β f (nhds.{u2} α _inst_1 a)) (nhds.{u1} β _inst_2 (f a))))
-Case conversion may be inaccurate. Consider using '#align embedding.map_nhds_of_mem Embedding.map_nhds_of_memₓ'. -/
theorem Embedding.map_nhds_of_mem {f : α → β} (hf : Embedding f) (a : α) (h : range f ∈ 𝓝 (f a)) :
(𝓝 a).map f = 𝓝 (f a) :=
hf.1.map_nhds_of_mem a h
#align embedding.map_nhds_of_mem Embedding.map_nhds_of_mem
-/- warning: embedding.tendsto_nhds_iff -> Embedding.tendsto_nhds_iff is a dubious translation:
-lean 3 declaration is
- forall {β : Type.{u1}} {γ : Type.{u2}} [_inst_2 : TopologicalSpace.{u1} β] [_inst_3 : TopologicalSpace.{u2} γ] {ι : Type.{u3}} {f : ι -> β} {g : β -> γ} {a : Filter.{u3} ι} {b : β}, (Embedding.{u1, u2} β γ _inst_2 _inst_3 g) -> (Iff (Filter.Tendsto.{u3, u1} ι β f a (nhds.{u1} β _inst_2 b)) (Filter.Tendsto.{u3, u2} ι γ (Function.comp.{succ u3, succ u1, succ u2} ι β γ g f) a (nhds.{u2} γ _inst_3 (g b))))
-but is expected to have type
- forall {β : Type.{u2}} {γ : Type.{u1}} [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u1} γ] {ι : Type.{u3}} {f : ι -> β} {g : β -> γ} {a : Filter.{u3} ι} {b : β}, (Embedding.{u2, u1} β γ _inst_2 _inst_3 g) -> (Iff (Filter.Tendsto.{u3, u2} ι β f a (nhds.{u2} β _inst_2 b)) (Filter.Tendsto.{u3, u1} ι γ (Function.comp.{succ u3, succ u2, succ u1} ι β γ g f) a (nhds.{u1} γ _inst_3 (g b))))
-Case conversion may be inaccurate. Consider using '#align embedding.tendsto_nhds_iff Embedding.tendsto_nhds_iffₓ'. -/
theorem Embedding.tendsto_nhds_iff {ι : Type _} {f : ι → β} {g : β → γ} {a : Filter ι} {b : β}
(hg : Embedding g) : Tendsto f a (𝓝 b) ↔ Tendsto (g ∘ f) a (𝓝 (g b)) :=
hg.to_inducing.tendsto_nhds_iff
#align embedding.tendsto_nhds_iff Embedding.tendsto_nhds_iff
-/- warning: embedding.continuous_iff -> Embedding.continuous_iff is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] {f : α -> β} {g : β -> γ}, (Embedding.{u2, u3} β γ _inst_2 _inst_3 g) -> (Iff (Continuous.{u1, u2} α β _inst_1 _inst_2 f) (Continuous.{u1, u3} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u2, succ u3} α β γ g f)))
-but is expected to have type
- forall {α : Type.{u1}} {β : Type.{u3}} {γ : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u3} β] [_inst_3 : TopologicalSpace.{u2} γ] {f : α -> β} {g : β -> γ}, (Embedding.{u3, u2} β γ _inst_2 _inst_3 g) -> (Iff (Continuous.{u1, u3} α β _inst_1 _inst_2 f) (Continuous.{u1, u2} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u3, succ u2} α β γ g f)))
-Case conversion may be inaccurate. Consider using '#align embedding.continuous_iff Embedding.continuous_iffₓ'. -/
theorem Embedding.continuous_iff {f : α → β} {g : β → γ} (hg : Embedding g) :
Continuous f ↔ Continuous (g ∘ f) :=
Inducing.continuous_iff hg.1
#align embedding.continuous_iff Embedding.continuous_iff
-/- warning: embedding.continuous -> Embedding.continuous is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (Embedding.{u1, u2} α β _inst_1 _inst_2 f) -> (Continuous.{u1, u2} α β _inst_1 _inst_2 f)
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (Embedding.{u2, u1} α β _inst_1 _inst_2 f) -> (Continuous.{u2, u1} α β _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align embedding.continuous Embedding.continuousₓ'. -/
theorem Embedding.continuous {f : α → β} (hf : Embedding f) : Continuous f :=
Inducing.continuous hf.1
#align embedding.continuous Embedding.continuous
-/- warning: embedding.closure_eq_preimage_closure_image -> Embedding.closure_eq_preimage_closure_image is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {e : α -> β}, (Embedding.{u1, u2} α β _inst_1 _inst_2 e) -> (forall (s : Set.{u1} α), Eq.{succ u1} (Set.{u1} α) (closure.{u1} α _inst_1 s) (Set.preimage.{u1, u2} α β e (closure.{u2} β _inst_2 (Set.image.{u1, u2} α β e s))))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {e : α -> β}, (Embedding.{u2, u1} α β _inst_1 _inst_2 e) -> (forall (s : Set.{u2} α), Eq.{succ u2} (Set.{u2} α) (closure.{u2} α _inst_1 s) (Set.preimage.{u2, u1} α β e (closure.{u1} β _inst_2 (Set.image.{u2, u1} α β e s))))
-Case conversion may be inaccurate. Consider using '#align embedding.closure_eq_preimage_closure_image Embedding.closure_eq_preimage_closure_imageₓ'. -/
theorem Embedding.closure_eq_preimage_closure_image {e : α → β} (he : Embedding e) (s : Set α) :
closure s = e ⁻¹' closure (e '' s) :=
he.1.closure_eq_preimage_closure_image s
#align embedding.closure_eq_preimage_closure_image Embedding.closure_eq_preimage_closure_image
-/- warning: embedding.discrete_topology -> Embedding.discreteTopology is a dubious translation:
-lean 3 declaration is
- forall {X : Type.{u1}} {Y : Type.{u2}} [_inst_4 : TopologicalSpace.{u1} X] [tY : TopologicalSpace.{u2} Y] [_inst_5 : DiscreteTopology.{u2} Y tY] {f : X -> Y}, (Embedding.{u1, u2} X Y _inst_4 tY f) -> (DiscreteTopology.{u1} X _inst_4)
-but is expected to have type
- forall {X : Type.{u2}} {Y : Type.{u1}} [_inst_4 : TopologicalSpace.{u2} X] [tY : TopologicalSpace.{u1} Y] [_inst_5 : DiscreteTopology.{u1} Y tY] {f : X -> Y}, (Embedding.{u2, u1} X Y _inst_4 tY f) -> (DiscreteTopology.{u2} X _inst_4)
-Case conversion may be inaccurate. Consider using '#align embedding.discrete_topology Embedding.discreteTopologyₓ'. -/
/-- The topology induced under an inclusion `f : X → Y` from the discrete topological space `Y`
is the discrete topology on `X`. -/
theorem Embedding.discreteTopology {X Y : Type _} [TopologicalSpace X] [tY : TopologicalSpace Y]
@@ -456,12 +276,6 @@ def QuotientMap {α : Type _} {β : Type _} [tα : TopologicalSpace α] [tβ : T
#align quotient_map QuotientMap
-/
-/- warning: quotient_map_iff -> quotientMap_iff is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, Iff (QuotientMap.{u1, u2} α β _inst_1 _inst_2 f) (And (Function.Surjective.{succ u1, succ u2} α β f) (forall (s : Set.{u2} β), Iff (IsOpen.{u2} β _inst_2 s) (IsOpen.{u1} α _inst_1 (Set.preimage.{u1, u2} α β f s))))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, Iff (QuotientMap.{u2, u1} α β _inst_1 _inst_2 f) (And (Function.Surjective.{succ u2, succ u1} α β f) (forall (s : Set.{u1} β), Iff (IsOpen.{u1} β _inst_2 s) (IsOpen.{u2} α _inst_1 (Set.preimage.{u2, u1} α β f s))))
-Case conversion may be inaccurate. Consider using '#align quotient_map_iff quotientMap_iffₓ'. -/
theorem quotientMap_iff [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
QuotientMap f ↔ Surjective f ∧ ∀ s : Set β, IsOpen s ↔ IsOpen (f ⁻¹' s) :=
and_congr Iff.rfl topologicalSpace_eq_iff
@@ -484,22 +298,10 @@ protected theorem id : QuotientMap (@id α) :=
#align quotient_map.id QuotientMap.id
-/
-/- warning: quotient_map.comp -> QuotientMap.comp is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] {g : β -> γ} {f : α -> β}, (QuotientMap.{u2, u3} β γ _inst_2 _inst_3 g) -> (QuotientMap.{u1, u2} α β _inst_1 _inst_2 f) -> (QuotientMap.{u1, u3} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u2, succ u3} α β γ g f))
-but is expected to have type
- forall {α : Type.{u1}} {β : Type.{u3}} {γ : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u3} β] [_inst_3 : TopologicalSpace.{u2} γ] {g : β -> γ} {f : α -> β}, (QuotientMap.{u3, u2} β γ _inst_2 _inst_3 g) -> (QuotientMap.{u1, u3} α β _inst_1 _inst_2 f) -> (QuotientMap.{u1, u2} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u3, succ u2} α β γ g f))
-Case conversion may be inaccurate. Consider using '#align quotient_map.comp QuotientMap.compₓ'. -/
protected theorem comp (hg : QuotientMap g) (hf : QuotientMap f) : QuotientMap (g ∘ f) :=
⟨hg.left.comp hf.left, by rw [hg.right, hf.right, coinduced_compose]⟩
#align quotient_map.comp QuotientMap.comp
-/- warning: quotient_map.of_quotient_map_compose -> QuotientMap.of_quotientMap_compose is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] {g : β -> γ} {f : α -> β}, (Continuous.{u1, u2} α β _inst_1 _inst_2 f) -> (Continuous.{u2, u3} β γ _inst_2 _inst_3 g) -> (QuotientMap.{u1, u3} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u2, succ u3} α β γ g f)) -> (QuotientMap.{u2, u3} β γ _inst_2 _inst_3 g)
-but is expected to have type
- forall {α : Type.{u3}} {β : Type.{u2}} {γ : Type.{u1}} [_inst_1 : TopologicalSpace.{u3} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u1} γ] {g : β -> γ} {f : α -> β}, (Continuous.{u3, u2} α β _inst_1 _inst_2 f) -> (Continuous.{u2, u1} β γ _inst_2 _inst_3 g) -> (QuotientMap.{u3, u1} α γ _inst_1 _inst_3 (Function.comp.{succ u3, succ u2, succ u1} α β γ g f)) -> (QuotientMap.{u2, u1} β γ _inst_2 _inst_3 g)
-Case conversion may be inaccurate. Consider using '#align quotient_map.of_quotient_map_compose QuotientMap.of_quotientMap_composeₓ'. -/
protected theorem of_quotientMap_compose (hf : Continuous f) (hg : Continuous g)
(hgf : QuotientMap (g ∘ f)) : QuotientMap g :=
⟨hgf.1.of_comp,
@@ -508,63 +310,27 @@ protected theorem of_quotientMap_compose (hf : Continuous f) (hg : Continuous g)
(by rwa [← continuous_iff_coinduced_le])⟩
#align quotient_map.of_quotient_map_compose QuotientMap.of_quotientMap_compose
-/- warning: quotient_map.of_inverse -> QuotientMap.of_inverse is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β} {g : β -> α}, (Continuous.{u1, u2} α β _inst_1 _inst_2 f) -> (Continuous.{u2, u1} β α _inst_2 _inst_1 g) -> (Function.LeftInverse.{succ u1, succ u2} α β g f) -> (QuotientMap.{u2, u1} β α _inst_2 _inst_1 g)
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β} {g : β -> α}, (Continuous.{u2, u1} α β _inst_1 _inst_2 f) -> (Continuous.{u1, u2} β α _inst_2 _inst_1 g) -> (Function.LeftInverse.{succ u2, succ u1} α β g f) -> (QuotientMap.{u1, u2} β α _inst_2 _inst_1 g)
-Case conversion may be inaccurate. Consider using '#align quotient_map.of_inverse QuotientMap.of_inverseₓ'. -/
theorem of_inverse {g : β → α} (hf : Continuous f) (hg : Continuous g) (h : LeftInverse g f) :
QuotientMap g :=
QuotientMap.of_quotientMap_compose hf hg <| h.comp_eq_id.symm ▸ QuotientMap.id
#align quotient_map.of_inverse QuotientMap.of_inverse
-/- warning: quotient_map.continuous_iff -> QuotientMap.continuous_iff is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] {g : β -> γ} {f : α -> β}, (QuotientMap.{u1, u2} α β _inst_1 _inst_2 f) -> (Iff (Continuous.{u2, u3} β γ _inst_2 _inst_3 g) (Continuous.{u1, u3} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u2, succ u3} α β γ g f)))
-but is expected to have type
- forall {α : Type.{u3}} {β : Type.{u2}} {γ : Type.{u1}} [_inst_1 : TopologicalSpace.{u3} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u1} γ] {g : β -> γ} {f : α -> β}, (QuotientMap.{u3, u2} α β _inst_1 _inst_2 f) -> (Iff (Continuous.{u2, u1} β γ _inst_2 _inst_3 g) (Continuous.{u3, u1} α γ _inst_1 _inst_3 (Function.comp.{succ u3, succ u2, succ u1} α β γ g f)))
-Case conversion may be inaccurate. Consider using '#align quotient_map.continuous_iff QuotientMap.continuous_iffₓ'. -/
protected theorem continuous_iff (hf : QuotientMap f) : Continuous g ↔ Continuous (g ∘ f) := by
rw [continuous_iff_coinduced_le, continuous_iff_coinduced_le, hf.right, coinduced_compose]
#align quotient_map.continuous_iff QuotientMap.continuous_iff
-/- warning: quotient_map.continuous -> QuotientMap.continuous is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (QuotientMap.{u1, u2} α β _inst_1 _inst_2 f) -> (Continuous.{u1, u2} α β _inst_1 _inst_2 f)
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (QuotientMap.{u2, u1} α β _inst_1 _inst_2 f) -> (Continuous.{u2, u1} α β _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align quotient_map.continuous QuotientMap.continuousₓ'. -/
protected theorem continuous (hf : QuotientMap f) : Continuous f :=
hf.continuous_iff.mp continuous_id
#align quotient_map.continuous QuotientMap.continuous
-/- warning: quotient_map.surjective -> QuotientMap.surjective is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (QuotientMap.{u1, u2} α β _inst_1 _inst_2 f) -> (Function.Surjective.{succ u1, succ u2} α β f)
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (QuotientMap.{u2, u1} α β _inst_1 _inst_2 f) -> (Function.Surjective.{succ u2, succ u1} α β f)
-Case conversion may be inaccurate. Consider using '#align quotient_map.surjective QuotientMap.surjectiveₓ'. -/
protected theorem surjective (hf : QuotientMap f) : Surjective f :=
hf.1
#align quotient_map.surjective QuotientMap.surjective
-/- warning: quotient_map.is_open_preimage -> QuotientMap.isOpen_preimage is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (QuotientMap.{u1, u2} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u2} β}, Iff (IsOpen.{u1} α _inst_1 (Set.preimage.{u1, u2} α β f s)) (IsOpen.{u2} β _inst_2 s))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (QuotientMap.{u2, u1} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u1} β}, Iff (IsOpen.{u2} α _inst_1 (Set.preimage.{u2, u1} α β f s)) (IsOpen.{u1} β _inst_2 s))
-Case conversion may be inaccurate. Consider using '#align quotient_map.is_open_preimage QuotientMap.isOpen_preimageₓ'. -/
protected theorem isOpen_preimage (hf : QuotientMap f) {s : Set β} : IsOpen (f ⁻¹' s) ↔ IsOpen s :=
((quotientMap_iff.1 hf).2 s).symm
#align quotient_map.is_open_preimage QuotientMap.isOpen_preimage
-/- warning: quotient_map.is_closed_preimage -> QuotientMap.isClosed_preimage is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (QuotientMap.{u1, u2} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u2} β}, Iff (IsClosed.{u1} α _inst_1 (Set.preimage.{u1, u2} α β f s)) (IsClosed.{u2} β _inst_2 s))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (QuotientMap.{u2, u1} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u1} β}, Iff (IsClosed.{u2} α _inst_1 (Set.preimage.{u2, u1} α β f s)) (IsClosed.{u1} β _inst_2 s))
-Case conversion may be inaccurate. Consider using '#align quotient_map.is_closed_preimage QuotientMap.isClosed_preimageₓ'. -/
protected theorem isClosed_preimage (hf : QuotientMap f) {s : Set β} :
IsClosed (f ⁻¹' s) ↔ IsClosed s :=
((quotientMap_iff_closed.1 hf).2 s).symm
@@ -589,96 +355,42 @@ protected theorem id : IsOpenMap (@id α) := fun s hs => by rwa [image_id]
#align is_open_map.id IsOpenMap.id
-/
-/- warning: is_open_map.comp -> IsOpenMap.comp is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] {g : β -> γ} {f : α -> β}, (IsOpenMap.{u2, u3} β γ _inst_2 _inst_3 g) -> (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f) -> (IsOpenMap.{u1, u3} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u2, succ u3} α β γ g f))
-but is expected to have type
- forall {α : Type.{u1}} {β : Type.{u3}} {γ : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u3} β] [_inst_3 : TopologicalSpace.{u2} γ] {g : β -> γ} {f : α -> β}, (IsOpenMap.{u3, u2} β γ _inst_2 _inst_3 g) -> (IsOpenMap.{u1, u3} α β _inst_1 _inst_2 f) -> (IsOpenMap.{u1, u2} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u3, succ u2} α β γ g f))
-Case conversion may be inaccurate. Consider using '#align is_open_map.comp IsOpenMap.compₓ'. -/
protected theorem comp {g : β → γ} {f : α → β} (hg : IsOpenMap g) (hf : IsOpenMap f) :
IsOpenMap (g ∘ f) := by intro s hs <;> rw [image_comp] <;> exact hg _ (hf _ hs)
#align is_open_map.comp IsOpenMap.comp
-/- warning: is_open_map.is_open_range -> IsOpenMap.isOpen_range is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f) -> (IsOpen.{u2} β _inst_2 (Set.range.{u2, succ u1} β α f))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f) -> (IsOpen.{u1} β _inst_2 (Set.range.{u1, succ u2} β α f))
-Case conversion may be inaccurate. Consider using '#align is_open_map.is_open_range IsOpenMap.isOpen_rangeₓ'. -/
theorem isOpen_range (hf : IsOpenMap f) : IsOpen (range f) := by rw [← image_univ];
exact hf _ isOpen_univ
#align is_open_map.is_open_range IsOpenMap.isOpen_range
-/- warning: is_open_map.image_mem_nhds -> IsOpenMap.image_mem_nhds is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f) -> (forall {x : α} {s : Set.{u1} α}, (Membership.Mem.{u1, u1} (Set.{u1} α) (Filter.{u1} α) (Filter.hasMem.{u1} α) s (nhds.{u1} α _inst_1 x)) -> (Membership.Mem.{u2, u2} (Set.{u2} β) (Filter.{u2} β) (Filter.hasMem.{u2} β) (Set.image.{u1, u2} α β f s) (nhds.{u2} β _inst_2 (f x))))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f) -> (forall {x : α} {s : Set.{u2} α}, (Membership.mem.{u2, u2} (Set.{u2} α) (Filter.{u2} α) (instMembershipSetFilter.{u2} α) s (nhds.{u2} α _inst_1 x)) -> (Membership.mem.{u1, u1} (Set.{u1} β) (Filter.{u1} β) (instMembershipSetFilter.{u1} β) (Set.image.{u2, u1} α β f s) (nhds.{u1} β _inst_2 (f x))))
-Case conversion may be inaccurate. Consider using '#align is_open_map.image_mem_nhds IsOpenMap.image_mem_nhdsₓ'. -/
theorem image_mem_nhds (hf : IsOpenMap f) {x : α} {s : Set α} (hx : s ∈ 𝓝 x) : f '' s ∈ 𝓝 (f x) :=
let ⟨t, hts, ht, hxt⟩ := mem_nhds_iff.1 hx
mem_of_superset (IsOpen.mem_nhds (hf t ht) (mem_image_of_mem _ hxt)) (image_subset _ hts)
#align is_open_map.image_mem_nhds IsOpenMap.image_mem_nhds
-/- warning: is_open_map.range_mem_nhds -> IsOpenMap.range_mem_nhds is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f) -> (forall (x : α), Membership.Mem.{u2, u2} (Set.{u2} β) (Filter.{u2} β) (Filter.hasMem.{u2} β) (Set.range.{u2, succ u1} β α f) (nhds.{u2} β _inst_2 (f x)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f) -> (forall (x : α), Membership.mem.{u1, u1} (Set.{u1} β) (Filter.{u1} β) (instMembershipSetFilter.{u1} β) (Set.range.{u1, succ u2} β α f) (nhds.{u1} β _inst_2 (f x)))
-Case conversion may be inaccurate. Consider using '#align is_open_map.range_mem_nhds IsOpenMap.range_mem_nhdsₓ'. -/
theorem range_mem_nhds (hf : IsOpenMap f) (x : α) : range f ∈ 𝓝 (f x) :=
hf.isOpen_range.mem_nhds <| mem_range_self _
#align is_open_map.range_mem_nhds IsOpenMap.range_mem_nhds
-/- warning: is_open_map.maps_to_interior -> IsOpenMap.mapsTo_interior is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u1} α} {t : Set.{u2} β}, (Set.MapsTo.{u1, u2} α β f s t) -> (Set.MapsTo.{u1, u2} α β f (interior.{u1} α _inst_1 s) (interior.{u2} β _inst_2 t)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u2} α} {t : Set.{u1} β}, (Set.MapsTo.{u2, u1} α β f s t) -> (Set.MapsTo.{u2, u1} α β f (interior.{u2} α _inst_1 s) (interior.{u1} β _inst_2 t)))
-Case conversion may be inaccurate. Consider using '#align is_open_map.maps_to_interior IsOpenMap.mapsTo_interiorₓ'. -/
theorem mapsTo_interior (hf : IsOpenMap f) {s : Set α} {t : Set β} (h : MapsTo f s t) :
MapsTo f (interior s) (interior t) :=
mapsTo'.2 <|
interior_maximal (h.mono interior_subset Subset.rfl).image_subset (hf _ isOpen_interior)
#align is_open_map.maps_to_interior IsOpenMap.mapsTo_interior
-/- warning: is_open_map.image_interior_subset -> IsOpenMap.image_interior_subset is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f) -> (forall (s : Set.{u1} α), HasSubset.Subset.{u2} (Set.{u2} β) (Set.hasSubset.{u2} β) (Set.image.{u1, u2} α β f (interior.{u1} α _inst_1 s)) (interior.{u2} β _inst_2 (Set.image.{u1, u2} α β f s)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f) -> (forall (s : Set.{u2} α), HasSubset.Subset.{u1} (Set.{u1} β) (Set.instHasSubsetSet.{u1} β) (Set.image.{u2, u1} α β f (interior.{u2} α _inst_1 s)) (interior.{u1} β _inst_2 (Set.image.{u2, u1} α β f s)))
-Case conversion may be inaccurate. Consider using '#align is_open_map.image_interior_subset IsOpenMap.image_interior_subsetₓ'. -/
theorem image_interior_subset (hf : IsOpenMap f) (s : Set α) :
f '' interior s ⊆ interior (f '' s) :=
(hf.mapsTo_interior (mapsTo_image f s)).image_subset
#align is_open_map.image_interior_subset IsOpenMap.image_interior_subset
-/- warning: is_open_map.nhds_le -> IsOpenMap.nhds_le is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f) -> (forall (a : α), LE.le.{u2} (Filter.{u2} β) (Preorder.toHasLe.{u2} (Filter.{u2} β) (PartialOrder.toPreorder.{u2} (Filter.{u2} β) (Filter.partialOrder.{u2} β))) (nhds.{u2} β _inst_2 (f a)) (Filter.map.{u1, u2} α β f (nhds.{u1} α _inst_1 a)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f) -> (forall (a : α), LE.le.{u1} (Filter.{u1} β) (Preorder.toLE.{u1} (Filter.{u1} β) (PartialOrder.toPreorder.{u1} (Filter.{u1} β) (Filter.instPartialOrderFilter.{u1} β))) (nhds.{u1} β _inst_2 (f a)) (Filter.map.{u2, u1} α β f (nhds.{u2} α _inst_1 a)))
-Case conversion may be inaccurate. Consider using '#align is_open_map.nhds_le IsOpenMap.nhds_leₓ'. -/
theorem nhds_le (hf : IsOpenMap f) (a : α) : 𝓝 (f a) ≤ (𝓝 a).map f :=
le_map fun s => hf.image_mem_nhds
#align is_open_map.nhds_le IsOpenMap.nhds_le
-/- warning: is_open_map.of_nhds_le -> IsOpenMap.of_nhds_le is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (forall (a : α), LE.le.{u2} (Filter.{u2} β) (Preorder.toHasLe.{u2} (Filter.{u2} β) (PartialOrder.toPreorder.{u2} (Filter.{u2} β) (Filter.partialOrder.{u2} β))) (nhds.{u2} β _inst_2 (f a)) (Filter.map.{u1, u2} α β f (nhds.{u1} α _inst_1 a))) -> (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f)
-but is expected to have type
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (forall (a : α), LE.le.{u2} (Filter.{u2} β) (Preorder.toLE.{u2} (Filter.{u2} β) (PartialOrder.toPreorder.{u2} (Filter.{u2} β) (Filter.instPartialOrderFilter.{u2} β))) (nhds.{u2} β _inst_2 (f a)) (Filter.map.{u1, u2} α β f (nhds.{u1} α _inst_1 a))) -> (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align is_open_map.of_nhds_le IsOpenMap.of_nhds_leₓ'. -/
theorem of_nhds_le (hf : ∀ a, 𝓝 (f a) ≤ map f (𝓝 a)) : IsOpenMap f := fun s hs =>
isOpen_iff_mem_nhds.2 fun b ⟨a, has, hab⟩ => hab ▸ hf _ (image_mem_map <| IsOpen.mem_nhds hs has)
#align is_open_map.of_nhds_le IsOpenMap.of_nhds_le
-/- warning: is_open_map.of_sections -> IsOpenMap.of_sections is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (forall (x : α), Exists.{max (succ u2) (succ u1)} (β -> α) (fun (g : β -> α) => And (ContinuousAt.{u2, u1} β α _inst_2 _inst_1 g (f x)) (And (Eq.{succ u1} α (g (f x)) x) (Function.RightInverse.{succ u1, succ u2} α β g f)))) -> (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f)
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (forall (x : α), Exists.{max (succ u2) (succ u1)} (β -> α) (fun (g : β -> α) => And (ContinuousAt.{u1, u2} β α _inst_2 _inst_1 g (f x)) (And (Eq.{succ u2} α (g (f x)) x) (Function.RightInverse.{succ u2, succ u1} α β g f)))) -> (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align is_open_map.of_sections IsOpenMap.of_sectionsₓ'. -/
theorem of_sections {f : α → β}
(h : ∀ x, ∃ g : β → α, ContinuousAt g (f x) ∧ g (f x) = x ∧ RightInverse g f) : IsOpenMap f :=
of_nhds_le fun x =>
@@ -697,12 +409,6 @@ theorem of_inverse {f : α → β} {f' : β → α} (h : Continuous f') (l_inv :
#align is_open_map.of_inverse IsOpenMap.of_inverse
-/
-/- warning: is_open_map.to_quotient_map -> IsOpenMap.to_quotientMap is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f) -> (Continuous.{u1, u2} α β _inst_1 _inst_2 f) -> (Function.Surjective.{succ u1, succ u2} α β f) -> (QuotientMap.{u1, u2} α β _inst_1 _inst_2 f)
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f) -> (Continuous.{u2, u1} α β _inst_1 _inst_2 f) -> (Function.Surjective.{succ u2, succ u1} α β f) -> (QuotientMap.{u2, u1} α β _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align is_open_map.to_quotient_map IsOpenMap.to_quotientMapₓ'. -/
/-- A continuous surjective open map is a quotient map. -/
theorem to_quotientMap {f : α → β} (open_map : IsOpenMap f) (cont : Continuous f)
(surj : Surjective f) : QuotientMap f :=
@@ -710,35 +416,17 @@ theorem to_quotientMap {f : α → β} (open_map : IsOpenMap f) (cont : Continuo
⟨surj, fun s => ⟨fun h => h.Preimage cont, fun h => surj.image_preimage s ▸ open_map _ h⟩⟩
#align is_open_map.to_quotient_map IsOpenMap.to_quotientMap
-/- warning: is_open_map.interior_preimage_subset_preimage_interior -> IsOpenMap.interior_preimage_subset_preimage_interior is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u2} β}, HasSubset.Subset.{u1} (Set.{u1} α) (Set.hasSubset.{u1} α) (interior.{u1} α _inst_1 (Set.preimage.{u1, u2} α β f s)) (Set.preimage.{u1, u2} α β f (interior.{u2} β _inst_2 s)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u1} β}, HasSubset.Subset.{u2} (Set.{u2} α) (Set.instHasSubsetSet.{u2} α) (interior.{u2} α _inst_1 (Set.preimage.{u2, u1} α β f s)) (Set.preimage.{u2, u1} α β f (interior.{u1} β _inst_2 s)))
-Case conversion may be inaccurate. Consider using '#align is_open_map.interior_preimage_subset_preimage_interior IsOpenMap.interior_preimage_subset_preimage_interiorₓ'. -/
theorem interior_preimage_subset_preimage_interior (hf : IsOpenMap f) {s : Set β} :
interior (f ⁻¹' s) ⊆ f ⁻¹' interior s :=
hf.mapsTo_interior (mapsTo_preimage _ _)
#align is_open_map.interior_preimage_subset_preimage_interior IsOpenMap.interior_preimage_subset_preimage_interior
-/- warning: is_open_map.preimage_interior_eq_interior_preimage -> IsOpenMap.preimage_interior_eq_interior_preimage is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f) -> (Continuous.{u1, u2} α β _inst_1 _inst_2 f) -> (forall (s : Set.{u2} β), Eq.{succ u1} (Set.{u1} α) (Set.preimage.{u1, u2} α β f (interior.{u2} β _inst_2 s)) (interior.{u1} α _inst_1 (Set.preimage.{u1, u2} α β f s)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f) -> (Continuous.{u2, u1} α β _inst_1 _inst_2 f) -> (forall (s : Set.{u1} β), Eq.{succ u2} (Set.{u2} α) (Set.preimage.{u2, u1} α β f (interior.{u1} β _inst_2 s)) (interior.{u2} α _inst_1 (Set.preimage.{u2, u1} α β f s)))
-Case conversion may be inaccurate. Consider using '#align is_open_map.preimage_interior_eq_interior_preimage IsOpenMap.preimage_interior_eq_interior_preimageₓ'. -/
theorem preimage_interior_eq_interior_preimage (hf₁ : IsOpenMap f) (hf₂ : Continuous f)
(s : Set β) : f ⁻¹' interior s = interior (f ⁻¹' s) :=
Subset.antisymm (preimage_interior_subset_interior_preimage hf₂)
(interior_preimage_subset_preimage_interior hf₁)
#align is_open_map.preimage_interior_eq_interior_preimage IsOpenMap.preimage_interior_eq_interior_preimage
-/- warning: is_open_map.preimage_closure_subset_closure_preimage -> IsOpenMap.preimage_closure_subset_closure_preimage is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u2} β}, HasSubset.Subset.{u1} (Set.{u1} α) (Set.hasSubset.{u1} α) (Set.preimage.{u1, u2} α β f (closure.{u2} β _inst_2 s)) (closure.{u1} α _inst_1 (Set.preimage.{u1, u2} α β f s)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u1} β}, HasSubset.Subset.{u2} (Set.{u2} α) (Set.instHasSubsetSet.{u2} α) (Set.preimage.{u2, u1} α β f (closure.{u1} β _inst_2 s)) (closure.{u2} α _inst_1 (Set.preimage.{u2, u1} α β f s)))
-Case conversion may be inaccurate. Consider using '#align is_open_map.preimage_closure_subset_closure_preimage IsOpenMap.preimage_closure_subset_closure_preimageₓ'. -/
theorem preimage_closure_subset_closure_preimage (hf : IsOpenMap f) {s : Set β} :
f ⁻¹' closure s ⊆ closure (f ⁻¹' s) :=
by
@@ -746,23 +434,11 @@ theorem preimage_closure_subset_closure_preimage (hf : IsOpenMap f) {s : Set β}
simp only [← interior_compl, ← preimage_compl, hf.interior_preimage_subset_preimage_interior]
#align is_open_map.preimage_closure_subset_closure_preimage IsOpenMap.preimage_closure_subset_closure_preimage
-/- warning: is_open_map.preimage_closure_eq_closure_preimage -> IsOpenMap.preimage_closure_eq_closure_preimage is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f) -> (Continuous.{u1, u2} α β _inst_1 _inst_2 f) -> (forall (s : Set.{u2} β), Eq.{succ u1} (Set.{u1} α) (Set.preimage.{u1, u2} α β f (closure.{u2} β _inst_2 s)) (closure.{u1} α _inst_1 (Set.preimage.{u1, u2} α β f s)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f) -> (Continuous.{u2, u1} α β _inst_1 _inst_2 f) -> (forall (s : Set.{u1} β), Eq.{succ u2} (Set.{u2} α) (Set.preimage.{u2, u1} α β f (closure.{u1} β _inst_2 s)) (closure.{u2} α _inst_1 (Set.preimage.{u2, u1} α β f s)))
-Case conversion may be inaccurate. Consider using '#align is_open_map.preimage_closure_eq_closure_preimage IsOpenMap.preimage_closure_eq_closure_preimageₓ'. -/
theorem preimage_closure_eq_closure_preimage (hf : IsOpenMap f) (hfc : Continuous f) (s : Set β) :
f ⁻¹' closure s = closure (f ⁻¹' s) :=
hf.preimage_closure_subset_closure_preimage.antisymm (hfc.closure_preimage_subset s)
#align is_open_map.preimage_closure_eq_closure_preimage IsOpenMap.preimage_closure_eq_closure_preimage
-/- warning: is_open_map.preimage_frontier_subset_frontier_preimage -> IsOpenMap.preimage_frontier_subset_frontier_preimage is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u2} β}, HasSubset.Subset.{u1} (Set.{u1} α) (Set.hasSubset.{u1} α) (Set.preimage.{u1, u2} α β f (frontier.{u2} β _inst_2 s)) (frontier.{u1} α _inst_1 (Set.preimage.{u1, u2} α β f s)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u1} β}, HasSubset.Subset.{u2} (Set.{u2} α) (Set.instHasSubsetSet.{u2} α) (Set.preimage.{u2, u1} α β f (frontier.{u1} β _inst_2 s)) (frontier.{u2} α _inst_1 (Set.preimage.{u2, u1} α β f s)))
-Case conversion may be inaccurate. Consider using '#align is_open_map.preimage_frontier_subset_frontier_preimage IsOpenMap.preimage_frontier_subset_frontier_preimageₓ'. -/
theorem preimage_frontier_subset_frontier_preimage (hf : IsOpenMap f) {s : Set β} :
f ⁻¹' frontier s ⊆ frontier (f ⁻¹' s) := by
simpa only [frontier_eq_closure_inter_closure, preimage_inter] using
@@ -770,12 +446,6 @@ theorem preimage_frontier_subset_frontier_preimage (hf : IsOpenMap f) {s : Set
hf.preimage_closure_subset_closure_preimage
#align is_open_map.preimage_frontier_subset_frontier_preimage IsOpenMap.preimage_frontier_subset_frontier_preimage
-/- warning: is_open_map.preimage_frontier_eq_frontier_preimage -> IsOpenMap.preimage_frontier_eq_frontier_preimage is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f) -> (Continuous.{u1, u2} α β _inst_1 _inst_2 f) -> (forall (s : Set.{u2} β), Eq.{succ u1} (Set.{u1} α) (Set.preimage.{u1, u2} α β f (frontier.{u2} β _inst_2 s)) (frontier.{u1} α _inst_1 (Set.preimage.{u1, u2} α β f s)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f) -> (Continuous.{u2, u1} α β _inst_1 _inst_2 f) -> (forall (s : Set.{u1} β), Eq.{succ u2} (Set.{u2} α) (Set.preimage.{u2, u1} α β f (frontier.{u1} β _inst_2 s)) (frontier.{u2} α _inst_1 (Set.preimage.{u2, u1} α β f s)))
-Case conversion may be inaccurate. Consider using '#align is_open_map.preimage_frontier_eq_frontier_preimage IsOpenMap.preimage_frontier_eq_frontier_preimageₓ'. -/
theorem preimage_frontier_eq_frontier_preimage (hf : IsOpenMap f) (hfc : Continuous f) (s : Set β) :
f ⁻¹' frontier s = frontier (f ⁻¹' s) := by
simp only [frontier_eq_closure_inter_closure, preimage_inter, preimage_compl,
@@ -784,23 +454,11 @@ theorem preimage_frontier_eq_frontier_preimage (hf : IsOpenMap f) (hfc : Continu
end IsOpenMap
-/- warning: is_open_map_iff_nhds_le -> isOpenMap_iff_nhds_le is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, Iff (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f) (forall (a : α), LE.le.{u2} (Filter.{u2} β) (Preorder.toHasLe.{u2} (Filter.{u2} β) (PartialOrder.toPreorder.{u2} (Filter.{u2} β) (Filter.partialOrder.{u2} β))) (nhds.{u2} β _inst_2 (f a)) (Filter.map.{u1, u2} α β f (nhds.{u1} α _inst_1 a)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, Iff (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f) (forall (a : α), LE.le.{u1} (Filter.{u1} β) (Preorder.toLE.{u1} (Filter.{u1} β) (PartialOrder.toPreorder.{u1} (Filter.{u1} β) (Filter.instPartialOrderFilter.{u1} β))) (nhds.{u1} β _inst_2 (f a)) (Filter.map.{u2, u1} α β f (nhds.{u2} α _inst_1 a)))
-Case conversion may be inaccurate. Consider using '#align is_open_map_iff_nhds_le isOpenMap_iff_nhds_leₓ'. -/
theorem isOpenMap_iff_nhds_le [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
IsOpenMap f ↔ ∀ a : α, 𝓝 (f a) ≤ (𝓝 a).map f :=
⟨fun hf => hf.nhds_le, IsOpenMap.of_nhds_le⟩
#align is_open_map_iff_nhds_le isOpenMap_iff_nhds_le
-/- warning: is_open_map_iff_interior -> isOpenMap_iff_interior is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, Iff (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f) (forall (s : Set.{u1} α), HasSubset.Subset.{u2} (Set.{u2} β) (Set.hasSubset.{u2} β) (Set.image.{u1, u2} α β f (interior.{u1} α _inst_1 s)) (interior.{u2} β _inst_2 (Set.image.{u1, u2} α β f s)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, Iff (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f) (forall (s : Set.{u2} α), HasSubset.Subset.{u1} (Set.{u1} β) (Set.instHasSubsetSet.{u1} β) (Set.image.{u2, u1} α β f (interior.{u2} α _inst_1 s)) (interior.{u1} β _inst_2 (Set.image.{u2, u1} α β f s)))
-Case conversion may be inaccurate. Consider using '#align is_open_map_iff_interior isOpenMap_iff_interiorₓ'. -/
theorem isOpenMap_iff_interior [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
IsOpenMap f ↔ ∀ s, f '' interior s ⊆ interior (f '' s) :=
⟨IsOpenMap.image_interior_subset, fun hs u hu =>
@@ -811,12 +469,6 @@ theorem isOpenMap_iff_interior [TopologicalSpace α] [TopologicalSpace β] {f :
⟩
#align is_open_map_iff_interior isOpenMap_iff_interior
-/- warning: inducing.is_open_map -> Inducing.isOpenMap is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (Inducing.{u1, u2} α β _inst_1 _inst_2 f) -> (IsOpen.{u2} β _inst_2 (Set.range.{u2, succ u1} β α f)) -> (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f)
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (Inducing.{u2, u1} α β _inst_1 _inst_2 f) -> (IsOpen.{u1} β _inst_2 (Set.range.{u1, succ u2} β α f)) -> (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align inducing.is_open_map Inducing.isOpenMapₓ'. -/
/-- An inducing map with an open range is an open map. -/
protected theorem Inducing.isOpenMap [TopologicalSpace α] [TopologicalSpace β] {f : α → β}
(hi : Inducing f) (ho : IsOpen (range f)) : IsOpenMap f :=
@@ -848,22 +500,10 @@ protected theorem id : IsClosedMap (@id α) := fun s hs => by rwa [image_id]
#align is_closed_map.id IsClosedMap.id
-/
-/- warning: is_closed_map.comp -> IsClosedMap.comp is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] {g : β -> γ} {f : α -> β}, (IsClosedMap.{u2, u3} β γ _inst_2 _inst_3 g) -> (IsClosedMap.{u1, u2} α β _inst_1 _inst_2 f) -> (IsClosedMap.{u1, u3} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u2, succ u3} α β γ g f))
-but is expected to have type
- forall {α : Type.{u1}} {β : Type.{u3}} {γ : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u3} β] [_inst_3 : TopologicalSpace.{u2} γ] {g : β -> γ} {f : α -> β}, (IsClosedMap.{u3, u2} β γ _inst_2 _inst_3 g) -> (IsClosedMap.{u1, u3} α β _inst_1 _inst_2 f) -> (IsClosedMap.{u1, u2} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u3, succ u2} α β γ g f))
-Case conversion may be inaccurate. Consider using '#align is_closed_map.comp IsClosedMap.compₓ'. -/
protected theorem comp {g : β → γ} {f : α → β} (hg : IsClosedMap g) (hf : IsClosedMap f) :
IsClosedMap (g ∘ f) := by intro s hs; rw [image_comp]; exact hg _ (hf _ hs)
#align is_closed_map.comp IsClosedMap.comp
-/- warning: is_closed_map.closure_image_subset -> IsClosedMap.closure_image_subset is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (IsClosedMap.{u1, u2} α β _inst_1 _inst_2 f) -> (forall (s : Set.{u1} α), HasSubset.Subset.{u2} (Set.{u2} β) (Set.hasSubset.{u2} β) (closure.{u2} β _inst_2 (Set.image.{u1, u2} α β f s)) (Set.image.{u1, u2} α β f (closure.{u1} α _inst_1 s)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (IsClosedMap.{u2, u1} α β _inst_1 _inst_2 f) -> (forall (s : Set.{u2} α), HasSubset.Subset.{u1} (Set.{u1} β) (Set.instHasSubsetSet.{u1} β) (closure.{u1} β _inst_2 (Set.image.{u2, u1} α β f s)) (Set.image.{u2, u1} α β f (closure.{u2} α _inst_1 s)))
-Case conversion may be inaccurate. Consider using '#align is_closed_map.closure_image_subset IsClosedMap.closure_image_subsetₓ'. -/
theorem closure_image_subset {f : α → β} (hf : IsClosedMap f) (s : Set α) :
closure (f '' s) ⊆ f '' closure s :=
closure_minimal (image_subset _ subset_closure) (hf _ isClosed_closure)
@@ -877,12 +517,6 @@ theorem of_inverse {f : α → β} {f' : β → α} (h : Continuous f') (l_inv :
#align is_closed_map.of_inverse IsClosedMap.of_inverse
-/
-/- warning: is_closed_map.of_nonempty -> IsClosedMap.of_nonempty is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (forall (s : Set.{u1} α), (IsClosed.{u1} α _inst_1 s) -> (Set.Nonempty.{u1} α s) -> (IsClosed.{u2} β _inst_2 (Set.image.{u1, u2} α β f s))) -> (IsClosedMap.{u1, u2} α β _inst_1 _inst_2 f)
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (forall (s : Set.{u2} α), (IsClosed.{u2} α _inst_1 s) -> (Set.Nonempty.{u2} α s) -> (IsClosed.{u1} β _inst_2 (Set.image.{u2, u1} α β f s))) -> (IsClosedMap.{u2, u1} α β _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align is_closed_map.of_nonempty IsClosedMap.of_nonemptyₓ'. -/
theorem of_nonempty {f : α → β} (h : ∀ s, IsClosed s → s.Nonempty → IsClosed (f '' s)) :
IsClosedMap f := by
intro s hs; cases' eq_empty_or_nonempty s with h2s h2s
@@ -890,12 +524,6 @@ theorem of_nonempty {f : α → β} (h : ∀ s, IsClosed s → s.Nonempty → Is
· exact h s hs h2s
#align is_closed_map.of_nonempty IsClosedMap.of_nonempty
-/- warning: is_closed_map.closed_range -> IsClosedMap.closed_range is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (IsClosedMap.{u1, u2} α β _inst_1 _inst_2 f) -> (IsClosed.{u2} β _inst_2 (Set.range.{u2, succ u1} β α f))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (IsClosedMap.{u2, u1} α β _inst_1 _inst_2 f) -> (IsClosed.{u1} β _inst_2 (Set.range.{u1, succ u2} β α f))
-Case conversion may be inaccurate. Consider using '#align is_closed_map.closed_range IsClosedMap.closed_rangeₓ'. -/
theorem closed_range {f : α → β} (hf : IsClosedMap f) : IsClosed (range f) :=
@image_univ _ _ f ▸ hf _ isClosed_univ
#align is_closed_map.closed_range IsClosedMap.closed_range
@@ -908,12 +536,6 @@ theorem to_quotientMap {f : α → β} (hcl : IsClosedMap f) (hcont : Continuous
end IsClosedMap
-/- warning: inducing.is_closed_map -> Inducing.isClosedMap is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (Inducing.{u1, u2} α β _inst_1 _inst_2 f) -> (IsClosed.{u2} β _inst_2 (Set.range.{u2, succ u1} β α f)) -> (IsClosedMap.{u1, u2} α β _inst_1 _inst_2 f)
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (Inducing.{u2, u1} α β _inst_1 _inst_2 f) -> (IsClosed.{u1} β _inst_2 (Set.range.{u1, succ u2} β α f)) -> (IsClosedMap.{u2, u1} α β _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align inducing.is_closed_map Inducing.isClosedMapₓ'. -/
theorem Inducing.isClosedMap [TopologicalSpace α] [TopologicalSpace β] {f : α → β} (hf : Inducing f)
(h : IsClosed (range f)) : IsClosedMap f :=
by
@@ -923,12 +545,6 @@ theorem Inducing.isClosedMap [TopologicalSpace α] [TopologicalSpace β] {f : α
exact ht.inter h
#align inducing.is_closed_map Inducing.isClosedMap
-/- warning: is_closed_map_iff_closure_image -> isClosedMap_iff_closure_image is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, Iff (IsClosedMap.{u1, u2} α β _inst_1 _inst_2 f) (forall (s : Set.{u1} α), HasSubset.Subset.{u2} (Set.{u2} β) (Set.hasSubset.{u2} β) (closure.{u2} β _inst_2 (Set.image.{u1, u2} α β f s)) (Set.image.{u1, u2} α β f (closure.{u1} α _inst_1 s)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, Iff (IsClosedMap.{u2, u1} α β _inst_1 _inst_2 f) (forall (s : Set.{u2} α), HasSubset.Subset.{u1} (Set.{u1} β) (Set.instHasSubsetSet.{u1} β) (closure.{u1} β _inst_2 (Set.image.{u2, u1} α β f s)) (Set.image.{u2, u1} α β f (closure.{u2} α _inst_1 s)))
-Case conversion may be inaccurate. Consider using '#align is_closed_map_iff_closure_image isClosedMap_iff_closure_imageₓ'. -/
theorem isClosedMap_iff_closure_image [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
IsClosedMap f ↔ ∀ s, closure (f '' s) ⊆ f '' closure s :=
⟨IsClosedMap.closure_image_subset, fun hs c hc =>
@@ -951,33 +567,15 @@ structure OpenEmbedding (f : α → β) extends Embedding f : Prop where
#align open_embedding OpenEmbedding
-/
-/- warning: open_embedding.is_open_map -> OpenEmbedding.isOpenMap is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (OpenEmbedding.{u1, u2} α β _inst_1 _inst_2 f) -> (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f)
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (OpenEmbedding.{u2, u1} α β _inst_1 _inst_2 f) -> (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align open_embedding.is_open_map OpenEmbedding.isOpenMapₓ'. -/
theorem OpenEmbedding.isOpenMap {f : α → β} (hf : OpenEmbedding f) : IsOpenMap f :=
hf.toEmbedding.to_inducing.IsOpenMap hf.open_range
#align open_embedding.is_open_map OpenEmbedding.isOpenMap
-/- warning: open_embedding.map_nhds_eq -> OpenEmbedding.map_nhds_eq is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (OpenEmbedding.{u1, u2} α β _inst_1 _inst_2 f) -> (forall (a : α), Eq.{succ u2} (Filter.{u2} β) (Filter.map.{u1, u2} α β f (nhds.{u1} α _inst_1 a)) (nhds.{u2} β _inst_2 (f a)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (OpenEmbedding.{u2, u1} α β _inst_1 _inst_2 f) -> (forall (a : α), Eq.{succ u1} (Filter.{u1} β) (Filter.map.{u2, u1} α β f (nhds.{u2} α _inst_1 a)) (nhds.{u1} β _inst_2 (f a)))
-Case conversion may be inaccurate. Consider using '#align open_embedding.map_nhds_eq OpenEmbedding.map_nhds_eqₓ'. -/
theorem OpenEmbedding.map_nhds_eq {f : α → β} (hf : OpenEmbedding f) (a : α) :
map f (𝓝 a) = 𝓝 (f a) :=
hf.toEmbedding.map_nhds_of_mem _ <| hf.open_range.mem_nhds <| mem_range_self _
#align open_embedding.map_nhds_eq OpenEmbedding.map_nhds_eq
-/- warning: open_embedding.open_iff_image_open -> OpenEmbedding.open_iff_image_open is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (OpenEmbedding.{u1, u2} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u1} α}, Iff (IsOpen.{u1} α _inst_1 s) (IsOpen.{u2} β _inst_2 (Set.image.{u1, u2} α β f s)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (OpenEmbedding.{u2, u1} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u2} α}, Iff (IsOpen.{u2} α _inst_1 s) (IsOpen.{u1} β _inst_2 (Set.image.{u2, u1} α β f s)))
-Case conversion may be inaccurate. Consider using '#align open_embedding.open_iff_image_open OpenEmbedding.open_iff_image_openₓ'. -/
theorem OpenEmbedding.open_iff_image_open {f : α → β} (hf : OpenEmbedding f) {s : Set α} :
IsOpen s ↔ IsOpen (f '' s) :=
⟨hf.IsOpenMap s, fun h =>
@@ -986,33 +584,15 @@ theorem OpenEmbedding.open_iff_image_open {f : α → β} (hf : OpenEmbedding f)
apply preimage_image_eq _ hf.inj⟩
#align open_embedding.open_iff_image_open OpenEmbedding.open_iff_image_open
-/- warning: open_embedding.tendsto_nhds_iff -> OpenEmbedding.tendsto_nhds_iff is a dubious translation:
-lean 3 declaration is
- forall {β : Type.{u1}} {γ : Type.{u2}} [_inst_2 : TopologicalSpace.{u1} β] [_inst_3 : TopologicalSpace.{u2} γ] {ι : Type.{u3}} {f : ι -> β} {g : β -> γ} {a : Filter.{u3} ι} {b : β}, (OpenEmbedding.{u1, u2} β γ _inst_2 _inst_3 g) -> (Iff (Filter.Tendsto.{u3, u1} ι β f a (nhds.{u1} β _inst_2 b)) (Filter.Tendsto.{u3, u2} ι γ (Function.comp.{succ u3, succ u1, succ u2} ι β γ g f) a (nhds.{u2} γ _inst_3 (g b))))
-but is expected to have type
- forall {β : Type.{u2}} {γ : Type.{u1}} [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u1} γ] {ι : Type.{u3}} {f : ι -> β} {g : β -> γ} {a : Filter.{u3} ι} {b : β}, (OpenEmbedding.{u2, u1} β γ _inst_2 _inst_3 g) -> (Iff (Filter.Tendsto.{u3, u2} ι β f a (nhds.{u2} β _inst_2 b)) (Filter.Tendsto.{u3, u1} ι γ (Function.comp.{succ u3, succ u2, succ u1} ι β γ g f) a (nhds.{u1} γ _inst_3 (g b))))
-Case conversion may be inaccurate. Consider using '#align open_embedding.tendsto_nhds_iff OpenEmbedding.tendsto_nhds_iffₓ'. -/
theorem OpenEmbedding.tendsto_nhds_iff {ι : Type _} {f : ι → β} {g : β → γ} {a : Filter ι} {b : β}
(hg : OpenEmbedding g) : Tendsto f a (𝓝 b) ↔ Tendsto (g ∘ f) a (𝓝 (g b)) :=
hg.toEmbedding.tendsto_nhds_iff
#align open_embedding.tendsto_nhds_iff OpenEmbedding.tendsto_nhds_iff
-/- warning: open_embedding.continuous -> OpenEmbedding.continuous is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (OpenEmbedding.{u1, u2} α β _inst_1 _inst_2 f) -> (Continuous.{u1, u2} α β _inst_1 _inst_2 f)
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (OpenEmbedding.{u2, u1} α β _inst_1 _inst_2 f) -> (Continuous.{u2, u1} α β _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align open_embedding.continuous OpenEmbedding.continuousₓ'. -/
theorem OpenEmbedding.continuous {f : α → β} (hf : OpenEmbedding f) : Continuous f :=
hf.toEmbedding.Continuous
#align open_embedding.continuous OpenEmbedding.continuous
-/- warning: open_embedding.open_iff_preimage_open -> OpenEmbedding.open_iff_preimage_open is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (OpenEmbedding.{u1, u2} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u2} β}, (HasSubset.Subset.{u2} (Set.{u2} β) (Set.hasSubset.{u2} β) s (Set.range.{u2, succ u1} β α f)) -> (Iff (IsOpen.{u2} β _inst_2 s) (IsOpen.{u1} α _inst_1 (Set.preimage.{u1, u2} α β f s))))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (OpenEmbedding.{u2, u1} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u1} β}, (HasSubset.Subset.{u1} (Set.{u1} β) (Set.instHasSubsetSet.{u1} β) s (Set.range.{u1, succ u2} β α f)) -> (Iff (IsOpen.{u1} β _inst_2 s) (IsOpen.{u2} α _inst_1 (Set.preimage.{u2, u1} α β f s))))
-Case conversion may be inaccurate. Consider using '#align open_embedding.open_iff_preimage_open OpenEmbedding.open_iff_preimage_openₓ'. -/
theorem OpenEmbedding.open_iff_preimage_open {f : α → β} (hf : OpenEmbedding f) {s : Set β}
(hs : s ⊆ range f) : IsOpen s ↔ IsOpen (f ⁻¹' s) :=
by
@@ -1020,34 +600,16 @@ theorem OpenEmbedding.open_iff_preimage_open {f : α → β} (hf : OpenEmbedding
rwa [image_preimage_eq_inter_range, inter_eq_self_of_subset_left]
#align open_embedding.open_iff_preimage_open OpenEmbedding.open_iff_preimage_open
-/- warning: open_embedding_of_embedding_open -> openEmbedding_of_embedding_open is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (Embedding.{u1, u2} α β _inst_1 _inst_2 f) -> (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f) -> (OpenEmbedding.{u1, u2} α β _inst_1 _inst_2 f)
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (Embedding.{u2, u1} α β _inst_1 _inst_2 f) -> (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f) -> (OpenEmbedding.{u2, u1} α β _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align open_embedding_of_embedding_open openEmbedding_of_embedding_openₓ'. -/
theorem openEmbedding_of_embedding_open {f : α → β} (h₁ : Embedding f) (h₂ : IsOpenMap f) :
OpenEmbedding f :=
⟨h₁, h₂.isOpen_range⟩
#align open_embedding_of_embedding_open openEmbedding_of_embedding_open
-/- warning: open_embedding_iff_embedding_open -> openEmbedding_iff_embedding_open is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, Iff (OpenEmbedding.{u1, u2} α β _inst_1 _inst_2 f) (And (Embedding.{u1, u2} α β _inst_1 _inst_2 f) (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, Iff (OpenEmbedding.{u2, u1} α β _inst_1 _inst_2 f) (And (Embedding.{u2, u1} α β _inst_1 _inst_2 f) (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f))
-Case conversion may be inaccurate. Consider using '#align open_embedding_iff_embedding_open openEmbedding_iff_embedding_openₓ'. -/
theorem openEmbedding_iff_embedding_open {f : α → β} :
OpenEmbedding f ↔ Embedding f ∧ IsOpenMap f :=
⟨fun h => ⟨h.1, h.IsOpenMap⟩, fun h => openEmbedding_of_embedding_open h.1 h.2⟩
#align open_embedding_iff_embedding_open openEmbedding_iff_embedding_open
-/- warning: open_embedding_of_continuous_injective_open -> openEmbedding_of_continuous_injective_open is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (Continuous.{u1, u2} α β _inst_1 _inst_2 f) -> (Function.Injective.{succ u1, succ u2} α β f) -> (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f) -> (OpenEmbedding.{u1, u2} α β _inst_1 _inst_2 f)
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (Continuous.{u2, u1} α β _inst_1 _inst_2 f) -> (Function.Injective.{succ u2, succ u1} α β f) -> (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f) -> (OpenEmbedding.{u2, u1} α β _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align open_embedding_of_continuous_injective_open openEmbedding_of_continuous_injective_openₓ'. -/
theorem openEmbedding_of_continuous_injective_open {f : α → β} (h₁ : Continuous f)
(h₂ : Injective f) (h₃ : IsOpenMap f) : OpenEmbedding f :=
by
@@ -1056,12 +618,6 @@ theorem openEmbedding_of_continuous_injective_open {f : α → β} (h₁ : Conti
le_antisymm (h₁.tendsto _).le_comap (@comap_map _ _ (𝓝 a) _ h₂ ▸ comap_mono (h₃.nhds_le _))
#align open_embedding_of_continuous_injective_open openEmbedding_of_continuous_injective_open
-/- warning: open_embedding_iff_continuous_injective_open -> openEmbedding_iff_continuous_injective_open is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, Iff (OpenEmbedding.{u1, u2} α β _inst_1 _inst_2 f) (And (Continuous.{u1, u2} α β _inst_1 _inst_2 f) (And (Function.Injective.{succ u1, succ u2} α β f) (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, Iff (OpenEmbedding.{u2, u1} α β _inst_1 _inst_2 f) (And (Continuous.{u2, u1} α β _inst_1 _inst_2 f) (And (Function.Injective.{succ u2, succ u1} α β f) (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f)))
-Case conversion may be inaccurate. Consider using '#align open_embedding_iff_continuous_injective_open openEmbedding_iff_continuous_injective_openₓ'. -/
theorem openEmbedding_iff_continuous_injective_open {f : α → β} :
OpenEmbedding f ↔ Continuous f ∧ Injective f ∧ IsOpenMap f :=
⟨fun h => ⟨h.Continuous, h.inj, h.IsOpenMap⟩, fun h =>
@@ -1074,46 +630,22 @@ theorem openEmbedding_id : OpenEmbedding (@id α) :=
#align open_embedding_id openEmbedding_id
-/
-/- warning: open_embedding.comp -> OpenEmbedding.comp is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] {g : β -> γ} {f : α -> β}, (OpenEmbedding.{u2, u3} β γ _inst_2 _inst_3 g) -> (OpenEmbedding.{u1, u2} α β _inst_1 _inst_2 f) -> (OpenEmbedding.{u1, u3} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u2, succ u3} α β γ g f))
-but is expected to have type
- forall {α : Type.{u1}} {β : Type.{u3}} {γ : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u3} β] [_inst_3 : TopologicalSpace.{u2} γ] {g : β -> γ} {f : α -> β}, (OpenEmbedding.{u3, u2} β γ _inst_2 _inst_3 g) -> (OpenEmbedding.{u1, u3} α β _inst_1 _inst_2 f) -> (OpenEmbedding.{u1, u2} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u3, succ u2} α β γ g f))
-Case conversion may be inaccurate. Consider using '#align open_embedding.comp OpenEmbedding.compₓ'. -/
theorem OpenEmbedding.comp {g : β → γ} {f : α → β} (hg : OpenEmbedding g) (hf : OpenEmbedding f) :
OpenEmbedding (g ∘ f) :=
⟨hg.1.comp hf.1, (hg.IsOpenMap.comp hf.IsOpenMap).isOpen_range⟩
#align open_embedding.comp OpenEmbedding.comp
-/- warning: open_embedding.is_open_map_iff -> OpenEmbedding.isOpenMap_iff is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] {g : β -> γ} {f : α -> β}, (OpenEmbedding.{u2, u3} β γ _inst_2 _inst_3 g) -> (Iff (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f) (IsOpenMap.{u1, u3} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u2, succ u3} α β γ g f)))
-but is expected to have type
- forall {α : Type.{u1}} {β : Type.{u3}} {γ : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u3} β] [_inst_3 : TopologicalSpace.{u2} γ] {g : β -> γ} {f : α -> β}, (OpenEmbedding.{u3, u2} β γ _inst_2 _inst_3 g) -> (Iff (IsOpenMap.{u1, u3} α β _inst_1 _inst_2 f) (IsOpenMap.{u1, u2} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u3, succ u2} α β γ g f)))
-Case conversion may be inaccurate. Consider using '#align open_embedding.is_open_map_iff OpenEmbedding.isOpenMap_iffₓ'. -/
theorem OpenEmbedding.isOpenMap_iff {g : β → γ} {f : α → β} (hg : OpenEmbedding g) :
IsOpenMap f ↔ IsOpenMap (g ∘ f) := by
simp only [isOpenMap_iff_nhds_le, ← @map_map _ _ _ _ f g, ← hg.map_nhds_eq, map_le_map_iff hg.inj]
#align open_embedding.is_open_map_iff OpenEmbedding.isOpenMap_iff
-/- warning: open_embedding.of_comp_iff -> OpenEmbedding.of_comp_iff is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] (f : α -> β) {g : β -> γ}, (OpenEmbedding.{u2, u3} β γ _inst_2 _inst_3 g) -> (Iff (OpenEmbedding.{u1, u3} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u2, succ u3} α β γ g f)) (OpenEmbedding.{u1, u2} α β _inst_1 _inst_2 f))
-but is expected to have type
- forall {α : Type.{u1}} {β : Type.{u3}} {γ : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u3} β] [_inst_3 : TopologicalSpace.{u2} γ] (f : α -> β) {g : β -> γ}, (OpenEmbedding.{u3, u2} β γ _inst_2 _inst_3 g) -> (Iff (OpenEmbedding.{u1, u2} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u3, succ u2} α β γ g f)) (OpenEmbedding.{u1, u3} α β _inst_1 _inst_2 f))
-Case conversion may be inaccurate. Consider using '#align open_embedding.of_comp_iff OpenEmbedding.of_comp_iffₓ'. -/
theorem OpenEmbedding.of_comp_iff (f : α → β) {g : β → γ} (hg : OpenEmbedding g) :
OpenEmbedding (g ∘ f) ↔ OpenEmbedding f := by
simp only [openEmbedding_iff_continuous_injective_open, ← hg.is_open_map_iff, ←
hg.1.continuous_iff, hg.inj.of_comp_iff]
#align open_embedding.of_comp_iff OpenEmbedding.of_comp_iff
-/- warning: open_embedding.of_comp -> OpenEmbedding.of_comp is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] (f : α -> β) {g : β -> γ}, (OpenEmbedding.{u2, u3} β γ _inst_2 _inst_3 g) -> (OpenEmbedding.{u1, u3} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u2, succ u3} α β γ g f)) -> (OpenEmbedding.{u1, u2} α β _inst_1 _inst_2 f)
-but is expected to have type
- forall {α : Type.{u1}} {β : Type.{u3}} {γ : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u3} β] [_inst_3 : TopologicalSpace.{u2} γ] (f : α -> β) {g : β -> γ}, (OpenEmbedding.{u3, u2} β γ _inst_2 _inst_3 g) -> (OpenEmbedding.{u1, u2} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u3, succ u2} α β γ g f)) -> (OpenEmbedding.{u1, u3} α β _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align open_embedding.of_comp OpenEmbedding.of_compₓ'. -/
theorem OpenEmbedding.of_comp (f : α → β) {g : β → γ} (hg : OpenEmbedding g)
(h : OpenEmbedding (g ∘ f)) : OpenEmbedding f :=
(OpenEmbedding.of_comp_iff f hg).1 h
@@ -1135,43 +667,19 @@ structure ClosedEmbedding (f : α → β) extends Embedding f : Prop where
variable {f : α → β}
-/- warning: closed_embedding.tendsto_nhds_iff -> ClosedEmbedding.tendsto_nhds_iff is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β} {ι : Type.{u3}} {g : ι -> α} {a : Filter.{u3} ι} {b : α}, (ClosedEmbedding.{u1, u2} α β _inst_1 _inst_2 f) -> (Iff (Filter.Tendsto.{u3, u1} ι α g a (nhds.{u1} α _inst_1 b)) (Filter.Tendsto.{u3, u2} ι β (Function.comp.{succ u3, succ u1, succ u2} ι α β f g) a (nhds.{u2} β _inst_2 (f b))))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β} {ι : Type.{u3}} {g : ι -> α} {a : Filter.{u3} ι} {b : α}, (ClosedEmbedding.{u2, u1} α β _inst_1 _inst_2 f) -> (Iff (Filter.Tendsto.{u3, u2} ι α g a (nhds.{u2} α _inst_1 b)) (Filter.Tendsto.{u3, u1} ι β (Function.comp.{succ u3, succ u2, succ u1} ι α β f g) a (nhds.{u1} β _inst_2 (f b))))
-Case conversion may be inaccurate. Consider using '#align closed_embedding.tendsto_nhds_iff ClosedEmbedding.tendsto_nhds_iffₓ'. -/
theorem ClosedEmbedding.tendsto_nhds_iff {ι : Type _} {g : ι → α} {a : Filter ι} {b : α}
(hf : ClosedEmbedding f) : Tendsto g a (𝓝 b) ↔ Tendsto (f ∘ g) a (𝓝 (f b)) :=
hf.toEmbedding.tendsto_nhds_iff
#align closed_embedding.tendsto_nhds_iff ClosedEmbedding.tendsto_nhds_iff
-/- warning: closed_embedding.continuous -> ClosedEmbedding.continuous is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (ClosedEmbedding.{u1, u2} α β _inst_1 _inst_2 f) -> (Continuous.{u1, u2} α β _inst_1 _inst_2 f)
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (ClosedEmbedding.{u2, u1} α β _inst_1 _inst_2 f) -> (Continuous.{u2, u1} α β _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align closed_embedding.continuous ClosedEmbedding.continuousₓ'. -/
theorem ClosedEmbedding.continuous (hf : ClosedEmbedding f) : Continuous f :=
hf.toEmbedding.Continuous
#align closed_embedding.continuous ClosedEmbedding.continuous
-/- warning: closed_embedding.is_closed_map -> ClosedEmbedding.isClosedMap is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (ClosedEmbedding.{u1, u2} α β _inst_1 _inst_2 f) -> (IsClosedMap.{u1, u2} α β _inst_1 _inst_2 f)
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (ClosedEmbedding.{u2, u1} α β _inst_1 _inst_2 f) -> (IsClosedMap.{u2, u1} α β _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align closed_embedding.is_closed_map ClosedEmbedding.isClosedMapₓ'. -/
theorem ClosedEmbedding.isClosedMap (hf : ClosedEmbedding f) : IsClosedMap f :=
hf.toEmbedding.to_inducing.IsClosedMap hf.closed_range
#align closed_embedding.is_closed_map ClosedEmbedding.isClosedMap
-/- warning: closed_embedding.closed_iff_image_closed -> ClosedEmbedding.closed_iff_image_closed is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (ClosedEmbedding.{u1, u2} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u1} α}, Iff (IsClosed.{u1} α _inst_1 s) (IsClosed.{u2} β _inst_2 (Set.image.{u1, u2} α β f s)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (ClosedEmbedding.{u2, u1} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u2} α}, Iff (IsClosed.{u2} α _inst_1 s) (IsClosed.{u1} β _inst_2 (Set.image.{u2, u1} α β f s)))
-Case conversion may be inaccurate. Consider using '#align closed_embedding.closed_iff_image_closed ClosedEmbedding.closed_iff_image_closedₓ'. -/
theorem ClosedEmbedding.closed_iff_image_closed (hf : ClosedEmbedding f) {s : Set α} :
IsClosed s ↔ IsClosed (f '' s) :=
⟨hf.IsClosedMap s, fun h =>
@@ -1180,12 +688,6 @@ theorem ClosedEmbedding.closed_iff_image_closed (hf : ClosedEmbedding f) {s : Se
apply preimage_image_eq _ hf.inj⟩
#align closed_embedding.closed_iff_image_closed ClosedEmbedding.closed_iff_image_closed
-/- warning: closed_embedding.closed_iff_preimage_closed -> ClosedEmbedding.closed_iff_preimage_closed is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (ClosedEmbedding.{u1, u2} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u2} β}, (HasSubset.Subset.{u2} (Set.{u2} β) (Set.hasSubset.{u2} β) s (Set.range.{u2, succ u1} β α f)) -> (Iff (IsClosed.{u2} β _inst_2 s) (IsClosed.{u1} α _inst_1 (Set.preimage.{u1, u2} α β f s))))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (ClosedEmbedding.{u2, u1} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u1} β}, (HasSubset.Subset.{u1} (Set.{u1} β) (Set.instHasSubsetSet.{u1} β) s (Set.range.{u1, succ u2} β α f)) -> (Iff (IsClosed.{u1} β _inst_2 s) (IsClosed.{u2} α _inst_1 (Set.preimage.{u2, u1} α β f s))))
-Case conversion may be inaccurate. Consider using '#align closed_embedding.closed_iff_preimage_closed ClosedEmbedding.closed_iff_preimage_closedₓ'. -/
theorem ClosedEmbedding.closed_iff_preimage_closed (hf : ClosedEmbedding f) {s : Set β}
(hs : s ⊆ range f) : IsClosed s ↔ IsClosed (f ⁻¹' s) :=
by
@@ -1193,23 +695,11 @@ theorem ClosedEmbedding.closed_iff_preimage_closed (hf : ClosedEmbedding f) {s :
rwa [image_preimage_eq_inter_range, inter_eq_self_of_subset_left]
#align closed_embedding.closed_iff_preimage_closed ClosedEmbedding.closed_iff_preimage_closed
-/- warning: closed_embedding_of_embedding_closed -> closedEmbedding_of_embedding_closed is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (Embedding.{u1, u2} α β _inst_1 _inst_2 f) -> (IsClosedMap.{u1, u2} α β _inst_1 _inst_2 f) -> (ClosedEmbedding.{u1, u2} α β _inst_1 _inst_2 f)
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (Embedding.{u2, u1} α β _inst_1 _inst_2 f) -> (IsClosedMap.{u2, u1} α β _inst_1 _inst_2 f) -> (ClosedEmbedding.{u2, u1} α β _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align closed_embedding_of_embedding_closed closedEmbedding_of_embedding_closedₓ'. -/
theorem closedEmbedding_of_embedding_closed (h₁ : Embedding f) (h₂ : IsClosedMap f) :
ClosedEmbedding f :=
⟨h₁, by convert h₂ univ isClosed_univ <;> simp⟩
#align closed_embedding_of_embedding_closed closedEmbedding_of_embedding_closed
-/- warning: closed_embedding_of_continuous_injective_closed -> closedEmbedding_of_continuous_injective_closed is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (Continuous.{u1, u2} α β _inst_1 _inst_2 f) -> (Function.Injective.{succ u1, succ u2} α β f) -> (IsClosedMap.{u1, u2} α β _inst_1 _inst_2 f) -> (ClosedEmbedding.{u1, u2} α β _inst_1 _inst_2 f)
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (Continuous.{u2, u1} α β _inst_1 _inst_2 f) -> (Function.Injective.{succ u2, succ u1} α β f) -> (IsClosedMap.{u2, u1} α β _inst_1 _inst_2 f) -> (ClosedEmbedding.{u2, u1} α β _inst_1 _inst_2 f)
-Case conversion may be inaccurate. Consider using '#align closed_embedding_of_continuous_injective_closed closedEmbedding_of_continuous_injective_closedₓ'. -/
theorem closedEmbedding_of_continuous_injective_closed (h₁ : Continuous f) (h₂ : Injective f)
(h₃ : IsClosedMap f) : ClosedEmbedding f :=
by
@@ -1230,12 +720,6 @@ theorem closedEmbedding_id : ClosedEmbedding (@id α) :=
#align closed_embedding_id closedEmbedding_id
-/
-/- warning: closed_embedding.comp -> ClosedEmbedding.comp is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} {γ : Type.{u3}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] [_inst_3 : TopologicalSpace.{u3} γ] {g : β -> γ} {f : α -> β}, (ClosedEmbedding.{u2, u3} β γ _inst_2 _inst_3 g) -> (ClosedEmbedding.{u1, u2} α β _inst_1 _inst_2 f) -> (ClosedEmbedding.{u1, u3} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u2, succ u3} α β γ g f))
-but is expected to have type
- forall {α : Type.{u1}} {β : Type.{u3}} {γ : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u3} β] [_inst_3 : TopologicalSpace.{u2} γ] {g : β -> γ} {f : α -> β}, (ClosedEmbedding.{u3, u2} β γ _inst_2 _inst_3 g) -> (ClosedEmbedding.{u1, u3} α β _inst_1 _inst_2 f) -> (ClosedEmbedding.{u1, u2} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u3, succ u2} α β γ g f))
-Case conversion may be inaccurate. Consider using '#align closed_embedding.comp ClosedEmbedding.compₓ'. -/
theorem ClosedEmbedding.comp {g : β → γ} {f : α → β} (hg : ClosedEmbedding g)
(hf : ClosedEmbedding f) : ClosedEmbedding (g ∘ f) :=
⟨hg.toEmbedding.comp hf.toEmbedding,
@@ -1243,12 +727,6 @@ theorem ClosedEmbedding.comp {g : β → γ} {f : α → β} (hg : ClosedEmbeddi
rw [range_comp, ← hg.closed_iff_image_closed] <;> exact hf.closed_range⟩
#align closed_embedding.comp ClosedEmbedding.comp
-/- warning: closed_embedding.closure_image_eq -> ClosedEmbedding.closure_image_eq is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (ClosedEmbedding.{u1, u2} α β _inst_1 _inst_2 f) -> (forall (s : Set.{u1} α), Eq.{succ u2} (Set.{u2} β) (closure.{u2} β _inst_2 (Set.image.{u1, u2} α β f s)) (Set.image.{u1, u2} α β f (closure.{u1} α _inst_1 s)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (ClosedEmbedding.{u2, u1} α β _inst_1 _inst_2 f) -> (forall (s : Set.{u2} α), Eq.{succ u1} (Set.{u1} β) (closure.{u1} β _inst_2 (Set.image.{u2, u1} α β f s)) (Set.image.{u2, u1} α β f (closure.{u2} α _inst_1 s)))
-Case conversion may be inaccurate. Consider using '#align closed_embedding.closure_image_eq ClosedEmbedding.closure_image_eqₓ'. -/
theorem ClosedEmbedding.closure_image_eq {f : α → β} (hf : ClosedEmbedding f) (s : Set α) :
closure (f '' s) = f '' closure s :=
(hf.IsClosedMap.closure_image_subset _).antisymm
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -97,9 +97,7 @@ Case conversion may be inaccurate. Consider using '#align inducing_of_inducing_c
theorem inducing_of_inducing_compose {f : α → β} {g : β → γ} (hf : Continuous f) (hg : Continuous g)
(hgf : Inducing (g ∘ f)) : Inducing f :=
⟨le_antisymm (by rwa [← continuous_iff_le_induced])
- (by
- rw [hgf.induced, ← continuous_iff_le_induced]
- apply hg.comp continuous_induced_dom)⟩
+ (by rw [hgf.induced, ← continuous_iff_le_induced]; apply hg.comp continuous_induced_dom)⟩
#align inducing_of_inducing_compose inducing_of_inducing_compose
/- warning: inducing_iff_nhds -> inducing_iff_nhds is a dubious translation:
@@ -240,8 +238,7 @@ but is expected to have type
forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (Inducing.{u2, u1} α β _inst_1 _inst_2 f) -> (forall (s : Set.{u2} α), Eq.{succ u2} (Set.{u2} α) (closure.{u2} α _inst_1 s) (Set.preimage.{u2, u1} α β f (closure.{u1} β _inst_2 (Set.image.{u2, u1} α β f s))))
Case conversion may be inaccurate. Consider using '#align inducing.closure_eq_preimage_closure_image Inducing.closure_eq_preimage_closure_imageₓ'. -/
theorem Inducing.closure_eq_preimage_closure_image {f : α → β} (hf : Inducing f) (s : Set α) :
- closure s = f ⁻¹' closure (f '' s) := by
- ext x
+ closure s = f ⁻¹' closure (f '' s) := by ext x;
rw [Set.mem_preimage, ← closure_induced, hf.induced]
#align inducing.closure_eq_preimage_closure_image Inducing.closure_eq_preimage_closure_image
@@ -507,9 +504,7 @@ protected theorem of_quotientMap_compose (hf : Continuous f) (hg : Continuous g)
(hgf : QuotientMap (g ∘ f)) : QuotientMap g :=
⟨hgf.1.of_comp,
le_antisymm
- (by
- rw [hgf.right, ← continuous_iff_coinduced_le]
- apply continuous_coinduced_rng.comp hf)
+ (by rw [hgf.right, ← continuous_iff_coinduced_le]; apply continuous_coinduced_rng.comp hf)
(by rwa [← continuous_iff_coinduced_le])⟩
#align quotient_map.of_quotient_map_compose QuotientMap.of_quotientMap_compose
@@ -610,9 +605,7 @@ lean 3 declaration is
but is expected to have type
forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f) -> (IsOpen.{u1} β _inst_2 (Set.range.{u1, succ u2} β α f))
Case conversion may be inaccurate. Consider using '#align is_open_map.is_open_range IsOpenMap.isOpen_rangeₓ'. -/
-theorem isOpen_range (hf : IsOpenMap f) : IsOpen (range f) :=
- by
- rw [← image_univ]
+theorem isOpen_range (hf : IsOpenMap f) : IsOpen (range f) := by rw [← image_univ];
exact hf _ isOpen_univ
#align is_open_map.is_open_range IsOpenMap.isOpen_range
@@ -862,10 +855,7 @@ but is expected to have type
forall {α : Type.{u1}} {β : Type.{u3}} {γ : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u3} β] [_inst_3 : TopologicalSpace.{u2} γ] {g : β -> γ} {f : α -> β}, (IsClosedMap.{u3, u2} β γ _inst_2 _inst_3 g) -> (IsClosedMap.{u1, u3} α β _inst_1 _inst_2 f) -> (IsClosedMap.{u1, u2} α γ _inst_1 _inst_3 (Function.comp.{succ u1, succ u3, succ u2} α β γ g f))
Case conversion may be inaccurate. Consider using '#align is_closed_map.comp IsClosedMap.compₓ'. -/
protected theorem comp {g : β → γ} {f : α → β} (hg : IsClosedMap g) (hf : IsClosedMap f) :
- IsClosedMap (g ∘ f) := by
- intro s hs
- rw [image_comp]
- exact hg _ (hf _ hs)
+ IsClosedMap (g ∘ f) := by intro s hs; rw [image_comp]; exact hg _ (hf _ hs)
#align is_closed_map.comp IsClosedMap.comp
/- warning: is_closed_map.closure_image_subset -> IsClosedMap.closure_image_subset is a dubious translation:
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl, Mario Carneiro, Patrick Massot
! This file was ported from Lean 3 source module topology.maps
-! leanprover-community/mathlib commit e46da4e335b8671848ac711ccb34b42538c0d800
+! leanprover-community/mathlib commit d91e7f7a7f1c7e9f0e18fdb6bde4f652004c735d
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -465,11 +465,17 @@ lean 3 declaration is
but is expected to have type
forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, Iff (QuotientMap.{u2, u1} α β _inst_1 _inst_2 f) (And (Function.Surjective.{succ u2, succ u1} α β f) (forall (s : Set.{u1} β), Iff (IsOpen.{u1} β _inst_2 s) (IsOpen.{u2} α _inst_1 (Set.preimage.{u2, u1} α β f s))))
Case conversion may be inaccurate. Consider using '#align quotient_map_iff quotientMap_iffₓ'. -/
-theorem quotientMap_iff {α β : Type _} [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
+theorem quotientMap_iff [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
QuotientMap f ↔ Surjective f ∧ ∀ s : Set β, IsOpen s ↔ IsOpen (f ⁻¹' s) :=
and_congr Iff.rfl topologicalSpace_eq_iff
#align quotient_map_iff quotientMap_iff
+theorem quotientMap_iff_closed [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
+ QuotientMap f ↔ Surjective f ∧ ∀ s : Set β, IsClosed s ↔ IsClosed (f ⁻¹' s) :=
+ quotientMap_iff.trans <|
+ Iff.rfl.And <| compl_surjective.forall.trans <| by simp only [isOpen_compl_iff, preimage_compl]
+#align quotient_map_iff_closed quotientMap_iff_closed
+
namespace QuotientMap
variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ] [TopologicalSpace δ]
@@ -565,8 +571,8 @@ but is expected to have type
forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (QuotientMap.{u2, u1} α β _inst_1 _inst_2 f) -> (forall {s : Set.{u1} β}, Iff (IsClosed.{u2} α _inst_1 (Set.preimage.{u2, u1} α β f s)) (IsClosed.{u1} β _inst_2 s))
Case conversion may be inaccurate. Consider using '#align quotient_map.is_closed_preimage QuotientMap.isClosed_preimageₓ'. -/
protected theorem isClosed_preimage (hf : QuotientMap f) {s : Set β} :
- IsClosed (f ⁻¹' s) ↔ IsClosed s := by
- simp only [← isOpen_compl_iff, ← preimage_compl, hf.is_open_preimage]
+ IsClosed (f ⁻¹' s) ↔ IsClosed s :=
+ ((quotientMap_iff_closed.1 hf).2 s).symm
#align quotient_map.is_closed_preimage QuotientMap.isClosed_preimage
end QuotientMap
@@ -904,6 +910,12 @@ theorem closed_range {f : α → β} (hf : IsClosedMap f) : IsClosed (range f) :
@image_univ _ _ f ▸ hf _ isClosed_univ
#align is_closed_map.closed_range IsClosedMap.closed_range
+theorem to_quotientMap {f : α → β} (hcl : IsClosedMap f) (hcont : Continuous f)
+ (hsurj : Surjective f) : QuotientMap f :=
+ quotientMap_iff_closed.2
+ ⟨hsurj, fun s => ⟨fun hs => hs.Preimage hcont, fun hs => hsurj.image_preimage s ▸ hcl _ hs⟩⟩
+#align is_closed_map.to_quotient_map IsClosedMap.to_quotientMap
+
end IsClosedMap
/- warning: inducing.is_closed_map -> Inducing.isClosedMap is a dubious translation:
mathlib commit https://github.com/leanprover-community/mathlib/commit/0b9eaaa7686280fad8cce467f5c3c57ee6ce77f8
@@ -656,7 +656,7 @@ theorem image_interior_subset (hf : IsOpenMap f) (s : Set α) :
/- warning: is_open_map.nhds_le -> IsOpenMap.nhds_le is a dubious translation:
lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f) -> (forall (a : α), LE.le.{u2} (Filter.{u2} β) (Preorder.toLE.{u2} (Filter.{u2} β) (PartialOrder.toPreorder.{u2} (Filter.{u2} β) (Filter.partialOrder.{u2} β))) (nhds.{u2} β _inst_2 (f a)) (Filter.map.{u1, u2} α β f (nhds.{u1} α _inst_1 a)))
+ forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f) -> (forall (a : α), LE.le.{u2} (Filter.{u2} β) (Preorder.toHasLe.{u2} (Filter.{u2} β) (PartialOrder.toPreorder.{u2} (Filter.{u2} β) (Filter.partialOrder.{u2} β))) (nhds.{u2} β _inst_2 (f a)) (Filter.map.{u1, u2} α β f (nhds.{u1} α _inst_1 a)))
but is expected to have type
forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f) -> (forall (a : α), LE.le.{u1} (Filter.{u1} β) (Preorder.toLE.{u1} (Filter.{u1} β) (PartialOrder.toPreorder.{u1} (Filter.{u1} β) (Filter.instPartialOrderFilter.{u1} β))) (nhds.{u1} β _inst_2 (f a)) (Filter.map.{u2, u1} α β f (nhds.{u2} α _inst_1 a)))
Case conversion may be inaccurate. Consider using '#align is_open_map.nhds_le IsOpenMap.nhds_leₓ'. -/
@@ -666,7 +666,7 @@ theorem nhds_le (hf : IsOpenMap f) (a : α) : 𝓝 (f a) ≤ (𝓝 a).map f :=
/- warning: is_open_map.of_nhds_le -> IsOpenMap.of_nhds_le is a dubious translation:
lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (forall (a : α), LE.le.{u2} (Filter.{u2} β) (Preorder.toLE.{u2} (Filter.{u2} β) (PartialOrder.toPreorder.{u2} (Filter.{u2} β) (Filter.partialOrder.{u2} β))) (nhds.{u2} β _inst_2 (f a)) (Filter.map.{u1, u2} α β f (nhds.{u1} α _inst_1 a))) -> (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f)
+ forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (forall (a : α), LE.le.{u2} (Filter.{u2} β) (Preorder.toHasLe.{u2} (Filter.{u2} β) (PartialOrder.toPreorder.{u2} (Filter.{u2} β) (Filter.partialOrder.{u2} β))) (nhds.{u2} β _inst_2 (f a)) (Filter.map.{u1, u2} α β f (nhds.{u1} α _inst_1 a))) -> (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f)
but is expected to have type
forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, (forall (a : α), LE.le.{u2} (Filter.{u2} β) (Preorder.toLE.{u2} (Filter.{u2} β) (PartialOrder.toPreorder.{u2} (Filter.{u2} β) (Filter.instPartialOrderFilter.{u2} β))) (nhds.{u2} β _inst_2 (f a)) (Filter.map.{u1, u2} α β f (nhds.{u1} α _inst_1 a))) -> (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f)
Case conversion may be inaccurate. Consider using '#align is_open_map.of_nhds_le IsOpenMap.of_nhds_leₓ'. -/
@@ -787,7 +787,7 @@ end IsOpenMap
/- warning: is_open_map_iff_nhds_le -> isOpenMap_iff_nhds_le is a dubious translation:
lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, Iff (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f) (forall (a : α), LE.le.{u2} (Filter.{u2} β) (Preorder.toLE.{u2} (Filter.{u2} β) (PartialOrder.toPreorder.{u2} (Filter.{u2} β) (Filter.partialOrder.{u2} β))) (nhds.{u2} β _inst_2 (f a)) (Filter.map.{u1, u2} α β f (nhds.{u1} α _inst_1 a)))
+ forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : TopologicalSpace.{u1} α] [_inst_2 : TopologicalSpace.{u2} β] {f : α -> β}, Iff (IsOpenMap.{u1, u2} α β _inst_1 _inst_2 f) (forall (a : α), LE.le.{u2} (Filter.{u2} β) (Preorder.toHasLe.{u2} (Filter.{u2} β) (PartialOrder.toPreorder.{u2} (Filter.{u2} β) (Filter.partialOrder.{u2} β))) (nhds.{u2} β _inst_2 (f a)) (Filter.map.{u1, u2} α β f (nhds.{u1} α _inst_1 a)))
but is expected to have type
forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : TopologicalSpace.{u2} α] [_inst_2 : TopologicalSpace.{u1} β] {f : α -> β}, Iff (IsOpenMap.{u2, u1} α β _inst_1 _inst_2 f) (forall (a : α), LE.le.{u1} (Filter.{u1} β) (Preorder.toLE.{u1} (Filter.{u1} β) (PartialOrder.toPreorder.{u1} (Filter.{u1} β) (Filter.instPartialOrderFilter.{u1} β))) (nhds.{u1} β _inst_2 (f a)) (Filter.map.{u2, u1} α β f (nhds.{u2} α _inst_1 a)))
Case conversion may be inaccurate. Consider using '#align is_open_map_iff_nhds_le isOpenMap_iff_nhds_leₓ'. -/
mathlib commit https://github.com/leanprover-community/mathlib/commit/e3fb84046afd187b710170887195d50bada934ee
@@ -130,7 +130,7 @@ but is expected to have type
Case conversion may be inaccurate. Consider using '#align inducing.nhds_set_eq_comap Inducing.nhdsSet_eq_comapₓ'. -/
theorem Inducing.nhdsSet_eq_comap {f : α → β} (hf : Inducing f) (s : Set α) :
𝓝ˢ s = comap f (𝓝ˢ (f '' s)) := by
- simp only [nhdsSet, supₛ_image, comap_supr, hf.nhds_eq_comap, supᵢ_image]
+ simp only [nhdsSet, sSup_image, comap_supr, hf.nhds_eq_comap, iSup_image]
#align inducing.nhds_set_eq_comap Inducing.nhdsSet_eq_comap
/- warning: inducing.map_nhds_eq -> Inducing.map_nhds_eq is a dubious translation:
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce7e9d53d4bbc38065db3b595cd5bd73c323bc1d
@@ -980,7 +980,7 @@ theorem OpenEmbedding.open_iff_image_open {f : α → β} (hf : OpenEmbedding f)
IsOpen s ↔ IsOpen (f '' s) :=
⟨hf.IsOpenMap s, fun h =>
by
- convert ← h.preimage hf.to_embedding.continuous
+ convert← h.preimage hf.to_embedding.continuous
apply preimage_image_eq _ hf.inj⟩
#align open_embedding.open_iff_image_open OpenEmbedding.open_iff_image_open
@@ -1014,7 +1014,7 @@ Case conversion may be inaccurate. Consider using '#align open_embedding.open_if
theorem OpenEmbedding.open_iff_preimage_open {f : α → β} (hf : OpenEmbedding f) {s : Set β}
(hs : s ⊆ range f) : IsOpen s ↔ IsOpen (f ⁻¹' s) :=
by
- convert ← hf.open_iff_image_open.symm
+ convert← hf.open_iff_image_open.symm
rwa [image_preimage_eq_inter_range, inter_eq_self_of_subset_left]
#align open_embedding.open_iff_preimage_open OpenEmbedding.open_iff_preimage_open
@@ -1174,7 +1174,7 @@ theorem ClosedEmbedding.closed_iff_image_closed (hf : ClosedEmbedding f) {s : Se
IsClosed s ↔ IsClosed (f '' s) :=
⟨hf.IsClosedMap s, fun h =>
by
- convert ← continuous_iff_is_closed.mp hf.continuous _ h
+ convert← continuous_iff_is_closed.mp hf.continuous _ h
apply preimage_image_eq _ hf.inj⟩
#align closed_embedding.closed_iff_image_closed ClosedEmbedding.closed_iff_image_closed
@@ -1187,7 +1187,7 @@ Case conversion may be inaccurate. Consider using '#align closed_embedding.close
theorem ClosedEmbedding.closed_iff_preimage_closed (hf : ClosedEmbedding f) {s : Set β}
(hs : s ⊆ range f) : IsClosed s ↔ IsClosed (f ⁻¹' s) :=
by
- convert ← hf.closed_iff_image_closed.symm
+ convert← hf.closed_iff_image_closed.symm
rwa [image_preimage_eq_inter_range, inter_eq_self_of_subset_left]
#align closed_embedding.closed_iff_preimage_closed ClosedEmbedding.closed_iff_preimage_closed
mathlib commit https://github.com/leanprover-community/mathlib/commit/4c586d291f189eecb9d00581aeb3dd998ac34442
@@ -686,7 +686,7 @@ theorem of_sections {f : α → β}
let ⟨g, hgc, hgx, hgf⟩ := h x
calc
𝓝 (f x) = map f (map g (𝓝 (f x))) := by rw [map_map, hgf.comp_eq_id, map_id]
- _ ≤ map f (𝓝 (g (f x))) := map_mono hgc
+ _ ≤ map f (𝓝 (g (f x))) := (map_mono hgc)
_ = map f (𝓝 x) := by rw [hgx]
#align is_open_map.of_sections IsOpenMap.of_sections
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
*.of_subsingleton
and *.of_isEmpty
(#11818)
Also use OpenEmbedding.of_subsingleton
to golf AlgebraicGeometry.isOpenImmersion_of_isEmpty
.
@@ -176,6 +176,9 @@ theorem dense_iff (hf : Inducing f) {s : Set X} :
simp only [Dense, hf.closure_eq_preimage_closure_image, mem_preimage]
#align inducing.dense_iff Inducing.dense_iff
+theorem of_subsingleton [Subsingleton X] (f : X → Y) : Inducing f :=
+ ⟨Subsingleton.elim _ _⟩
+
end Inducing
end Inducing
@@ -251,6 +254,9 @@ theorem Embedding.discreteTopology [DiscreteTopology Y] (hf : Embedding f) : Dis
.of_continuous_injective hf.continuous hf.inj
#align embedding.discrete_topology Embedding.discreteTopology
+theorem Embedding.of_subsingleton [Subsingleton X] (f : X → Y) : Embedding f :=
+ ⟨.of_subsingleton f, f.injective_of_subsingleton⟩
+
end Embedding
section QuotientMap
@@ -417,6 +423,8 @@ theorem preimage_frontier_eq_frontier_preimage (hf : IsOpenMap f) (hfc : Continu
hf.preimage_closure_eq_closure_preimage hfc]
#align is_open_map.preimage_frontier_eq_frontier_preimage IsOpenMap.preimage_frontier_eq_frontier_preimage
+theorem of_isEmpty [h : IsEmpty X] (f : X → Y) : IsOpenMap f := of_nhds_le h.elim
+
end IsOpenMap
theorem isOpenMap_iff_nhds_le : IsOpenMap f ↔ ∀ x : X, 𝓝 (f x) ≤ (𝓝 x).map f :=
@@ -630,6 +638,9 @@ theorem of_comp (f : X → Y) (hg : OpenEmbedding g)
(OpenEmbedding.of_comp_iff f hg).1 h
#align open_embedding.of_comp OpenEmbedding.of_comp
+theorem of_isEmpty [IsEmpty X] (f : X → Y) : OpenEmbedding f :=
+ openEmbedding_of_embedding_open (.of_subsingleton f) (IsOpenMap.of_isEmpty f)
+
end OpenEmbedding
end OpenEmbedding
All these lemmas refer to the range of some function being open/range (i.e. isOpen
or isClosed
).
@@ -472,9 +472,11 @@ theorem of_nonempty (h : ∀ s, IsClosed s → s.Nonempty → IsClosed (f '' s))
· exact h s hs h2s
#align is_closed_map.of_nonempty IsClosedMap.of_nonempty
-theorem closed_range (hf : IsClosedMap f) : IsClosed (range f) :=
+theorem isClosed_range (hf : IsClosedMap f) : IsClosed (range f) :=
@image_univ _ _ f ▸ hf _ isClosed_univ
-#align is_closed_map.closed_range IsClosedMap.closed_range
+#align is_closed_map.closed_range IsClosedMap.isClosed_range
+
+@[deprecated] alias closed_range := isClosed_range -- 2024-03-17
theorem to_quotientMap (hcl : IsClosedMap f) (hcont : Continuous f)
(hsurj : Surjective f) : QuotientMap f :=
@@ -535,12 +537,12 @@ section OpenEmbedding
variable [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z]
theorem OpenEmbedding.isOpenMap (hf : OpenEmbedding f) : IsOpenMap f :=
- hf.toEmbedding.toInducing.isOpenMap hf.open_range
+ hf.toEmbedding.toInducing.isOpenMap hf.isOpen_range
#align open_embedding.is_open_map OpenEmbedding.isOpenMap
theorem OpenEmbedding.map_nhds_eq (hf : OpenEmbedding f) (x : X) :
map f (𝓝 x) = 𝓝 (f x) :=
- hf.toEmbedding.map_nhds_of_mem _ <| hf.open_range.mem_nhds <| mem_range_self _
+ hf.toEmbedding.map_nhds_of_mem _ <| hf.isOpen_range.mem_nhds <| mem_range_self _
#align open_embedding.map_nhds_eq OpenEmbedding.map_nhds_eq
theorem OpenEmbedding.open_iff_image_open (hf : OpenEmbedding f) {s : Set X} :
@@ -648,7 +650,7 @@ theorem continuous (hf : ClosedEmbedding f) : Continuous f :=
#align closed_embedding.continuous ClosedEmbedding.continuous
theorem isClosedMap (hf : ClosedEmbedding f) : IsClosedMap f :=
- hf.toEmbedding.toInducing.isClosedMap hf.closed_range
+ hf.toEmbedding.toInducing.isClosedMap hf.isClosed_range
#align closed_embedding.is_closed_map ClosedEmbedding.isClosedMap
theorem closed_iff_image_closed (hf : ClosedEmbedding f) {s : Set X} :
@@ -677,12 +679,12 @@ theorem _root_.closedEmbedding_of_continuous_injective_closed (h₁ : Continuous
#align closed_embedding_of_continuous_injective_closed closedEmbedding_of_continuous_injective_closed
theorem _root_.closedEmbedding_id : ClosedEmbedding (@id X) :=
- ⟨embedding_id, IsClosedMap.id.closed_range⟩
+ ⟨embedding_id, IsClosedMap.id.isClosed_range⟩
#align closed_embedding_id closedEmbedding_id
theorem comp (hg : ClosedEmbedding g) (hf : ClosedEmbedding f) :
ClosedEmbedding (g ∘ f) :=
- ⟨hg.toEmbedding.comp hf.toEmbedding, (hg.isClosedMap.comp hf.isClosedMap).closed_range⟩
+ ⟨hg.toEmbedding.comp hf.toEmbedding, (hg.isClosedMap.comp hf.isClosedMap).isClosed_range⟩
#align closed_embedding.comp ClosedEmbedding.comp
theorem closure_image_eq (hf : ClosedEmbedding f) (s : Set X) :
The main addition is IsTopologicalBasis.inf
(see https://leanprover.zulipchat.com/#narrow/stream/217875-Is-there-code-for-X.3F/topic/Inf.20of.20a.20pair.20of.20topologies/near/419989448), and I also reordered things to be in the more typical order (deducing the Pi
version from the iInf
version rather than the converse).
Also a few extra golfs and variations.
Co-authored-by: Yury G. Kudryashov <urkud@urkud.name> Co-authored-by: Christopher Hoskin <christopher.hoskin@gmail.com> Co-authored-by: Christopher Hoskin <christopher.hoskin@overleaf.com>
@@ -84,6 +84,10 @@ theorem nhds_eq_comap (hf : Inducing f) : ∀ x : X, 𝓝 x = comap f (𝓝 <| f
inducing_iff_nhds.1 hf
#align inducing.nhds_eq_comap Inducing.nhds_eq_comap
+theorem basis_nhds {p : ι → Prop} {s : ι → Set Y} (hf : Inducing f) {x : X}
+ (h_basis : (𝓝 (f x)).HasBasis p s) : (𝓝 x).HasBasis p (preimage f ∘ s) :=
+ hf.nhds_eq_comap x ▸ h_basis.comap f
+
theorem nhdsSet_eq_comap (hf : Inducing f) (s : Set X) :
𝓝ˢ s = comap f (𝓝ˢ (f '' s)) := by
simp only [nhdsSet, sSup_image, comap_iSup, hf.nhds_eq_comap, iSup_image]
@@ -98,7 +98,7 @@ theorem map_nhds_of_mem (hf : Inducing f) (x : X) (h : range f ∈ 𝓝 (f x)) :
hf.induced.symm ▸ map_nhds_induced_of_mem h
#align inducing.map_nhds_of_mem Inducing.map_nhds_of_mem
--- Porting note: new lemma
+-- Porting note (#10756): new lemma
theorem mapClusterPt_iff (hf : Inducing f) {x : X} {l : Filter X} :
MapClusterPt (f x) l f ↔ ClusterPt x l := by
delta MapClusterPt ClusterPt
Homogenises porting notes via capitalisation and addition of whitespace.
It makes the following changes:
@@ -98,7 +98,7 @@ theorem map_nhds_of_mem (hf : Inducing f) (x : X) (h : range f ∈ 𝓝 (f x)) :
hf.induced.symm ▸ map_nhds_induced_of_mem h
#align inducing.map_nhds_of_mem Inducing.map_nhds_of_mem
--- porting note: new lemma
+-- Porting note: new lemma
theorem mapClusterPt_iff (hf : Inducing f) {x : X} {l : Filter X} :
MapClusterPt (f x) l f ↔ ClusterPt x l := by
delta MapClusterPt ClusterPt
In some cases, the order of implicit arguments changed
because now they appear in a different order in variable
s.
Also, some definitions used greek letters for topological spaces,
changed to X
/Y
.
@@ -4,7 +4,6 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl, Mario Carneiro, Patrick Massot
-/
import Mathlib.Topology.Order
-import Mathlib.Topology.NhdsSet
#align_import topology.maps from "leanprover-community/mathlib"@"d91e7f7a7f1c7e9f0e18fdb6bde4f652004c735d"
@@ -53,16 +52,6 @@ variable {X : Type*} {Y : Type*} {Z : Type*} {ι : Type*} {f : X → Y} {g : Y
section Inducing
-/-- A function `f : X → Y` between topological spaces is inducing if the topology on `X` is induced
-by the topology on `Y` through `f`, meaning that a set `s : Set X` is open iff it is the preimage
-under `f` of some open set `t : Set Y`. -/
-@[mk_iff]
-structure Inducing [tX : TopologicalSpace X] [tY : TopologicalSpace Y] (f : X → Y) : Prop where
- /-- The topology on the domain is equal to the induced topology. -/
- induced : tX = tY.induced f
-#align inducing Inducing
-#align inducing_iff inducing_iff
-
variable [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z]
theorem inducing_induced (f : X → Y) : @Inducing X Y (TopologicalSpace.induced f ‹_›) _ f :=
@@ -189,16 +178,6 @@ end Inducing
section Embedding
-/-- A function between topological spaces is an embedding if it is injective,
- and for all `s : Set X`, `s` is open iff it is the preimage of an open set. -/
-@[mk_iff]
-structure Embedding [TopologicalSpace X] [TopologicalSpace Y] (f : X → Y) extends
- Inducing f : Prop where
- /-- A topological embedding is injective. -/
- inj : Injective f
-#align embedding Embedding
-#align embedding_iff embedding_iff
-
theorem Function.Injective.embedding_induced [t : TopologicalSpace Y] (hf : Injective f) :
@_root_.Embedding X Y (t.induced f) t f :=
@_root_.Embedding.mk X Y (t.induced f) t _ (inducing_induced f) hf
@@ -271,12 +250,6 @@ theorem Embedding.discreteTopology [DiscreteTopology Y] (hf : Embedding f) : Dis
end Embedding
section QuotientMap
-/-- A function between topological spaces is a quotient map if it is surjective,
- and for all `s : Set Y`, `s` is open iff its preimage is an open set. -/
-def QuotientMap {X : Type*} {Y : Type*} [tX : TopologicalSpace X] [tY : TopologicalSpace Y]
- (f : X → Y) : Prop :=
- Surjective f ∧ tY = tX.coinduced f
-#align quotient_map QuotientMap
variable [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z]
@@ -339,12 +312,6 @@ end QuotientMap
end QuotientMap
section OpenMap
-/-- A map `f : X → Y` is said to be an *open map*, if the image of any open `U : Set X`
-is open in `Y`. -/
-def IsOpenMap [TopologicalSpace X] [TopologicalSpace Y] (f : X → Y) :=
- ∀ U : Set X, IsOpen U → IsOpen (f '' U)
-#align is_open_map IsOpenMap
-
variable [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z]
namespace IsOpenMap
@@ -471,12 +438,6 @@ section IsClosedMap
variable [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z]
-/-- A map `f : X → Y` is said to be a *closed map*, if the image of any closed `U : Set X`
-is closed in `Y`. -/
-def IsClosedMap (f : X → Y) :=
- ∀ U : Set X, IsClosed U → IsClosed (f '' U)
-#align is_closed_map IsClosedMap
-
namespace IsClosedMap
open Function
@@ -569,14 +530,6 @@ section OpenEmbedding
variable [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z]
-/-- An open embedding is an embedding with open image. -/
-@[mk_iff]
-structure OpenEmbedding (f : X → Y) extends Embedding f : Prop where
- /-- The range of an open embedding is an open set. -/
- open_range : IsOpen <| range f
-#align open_embedding OpenEmbedding
-#align open_embedding_iff openEmbedding_iff
-
theorem OpenEmbedding.isOpenMap (hf : OpenEmbedding f) : IsOpenMap f :=
hf.toEmbedding.toInducing.isOpenMap hf.open_range
#align open_embedding.is_open_map OpenEmbedding.isOpenMap
@@ -679,14 +632,6 @@ section ClosedEmbedding
variable [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z]
-/-- A closed embedding is an embedding with closed image. -/
-@[mk_iff]
-structure ClosedEmbedding (f : X → Y) extends Embedding f : Prop where
- /-- The range of a closed embedding is a closed set. -/
- closed_range : IsClosed <| range f
-#align closed_embedding ClosedEmbedding
-#align closed_embedding_iff closedEmbedding_iff
-
namespace ClosedEmbedding
theorem tendsto_nhds_iff {g : ι → X} {l : Filter ι} {x : X} (hf : ClosedEmbedding f) :
This file was mostly using Greek letters, but used letters X, Y, Z in comments and one theorem. Switch to using the latter consistently, per Zulip discussion.
Co-authored-by: grunweg <grunweg@posteo.de>
@@ -49,26 +49,26 @@ open Set Filter Function
open TopologicalSpace Topology Filter
-variable {α : Type*} {β : Type*} {γ : Type*} {ι : Type*} {f : α → β} {g : β → γ}
+variable {X : Type*} {Y : Type*} {Z : Type*} {ι : Type*} {f : X → Y} {g : Y → Z}
section Inducing
-/-- A function `f : α → β` between topological spaces is inducing if the topology on `α` is induced
-by the topology on `β` through `f`, meaning that a set `s : Set α` is open iff it is the preimage
-under `f` of some open set `t : Set β`. -/
+/-- A function `f : X → Y` between topological spaces is inducing if the topology on `X` is induced
+by the topology on `Y` through `f`, meaning that a set `s : Set X` is open iff it is the preimage
+under `f` of some open set `t : Set Y`. -/
@[mk_iff]
-structure Inducing [tα : TopologicalSpace α] [tβ : TopologicalSpace β] (f : α → β) : Prop where
+structure Inducing [tX : TopologicalSpace X] [tY : TopologicalSpace Y] (f : X → Y) : Prop where
/-- The topology on the domain is equal to the induced topology. -/
- induced : tα = tβ.induced f
+ induced : tX = tY.induced f
#align inducing Inducing
#align inducing_iff inducing_iff
-variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ]
+variable [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z]
-theorem inducing_induced (f : α → β) : @Inducing α β (TopologicalSpace.induced f ‹_›) _ f :=
+theorem inducing_induced (f : X → Y) : @Inducing X Y (TopologicalSpace.induced f ‹_›) _ f :=
@Inducing.mk _ _ (TopologicalSpace.induced f ‹_›) _ _ rfl
-theorem inducing_id : Inducing (@id α) :=
+theorem inducing_id : Inducing (@id X) :=
⟨induced_id.symm⟩
#align inducing_id inducing_id
@@ -85,47 +85,47 @@ theorem inducing_of_inducing_compose
exact induced_mono hg.le_induced)⟩
#align inducing_of_inducing_compose inducing_of_inducing_compose
-theorem inducing_iff_nhds : Inducing f ↔ ∀ a, 𝓝 a = comap f (𝓝 (f a)) :=
+theorem inducing_iff_nhds : Inducing f ↔ ∀ x, 𝓝 x = comap f (𝓝 (f x)) :=
(inducing_iff _).trans (induced_iff_nhds_eq f)
#align inducing_iff_nhds inducing_iff_nhds
namespace Inducing
-theorem nhds_eq_comap (hf : Inducing f) : ∀ a : α, 𝓝 a = comap f (𝓝 <| f a) :=
+theorem nhds_eq_comap (hf : Inducing f) : ∀ x : X, 𝓝 x = comap f (𝓝 <| f x) :=
inducing_iff_nhds.1 hf
#align inducing.nhds_eq_comap Inducing.nhds_eq_comap
-theorem nhdsSet_eq_comap (hf : Inducing f) (s : Set α) :
+theorem nhdsSet_eq_comap (hf : Inducing f) (s : Set X) :
𝓝ˢ s = comap f (𝓝ˢ (f '' s)) := by
simp only [nhdsSet, sSup_image, comap_iSup, hf.nhds_eq_comap, iSup_image]
#align inducing.nhds_set_eq_comap Inducing.nhdsSet_eq_comap
-theorem map_nhds_eq (hf : Inducing f) (a : α) : (𝓝 a).map f = 𝓝[range f] f a :=
- hf.induced.symm ▸ map_nhds_induced_eq a
+theorem map_nhds_eq (hf : Inducing f) (x : X) : (𝓝 x).map f = 𝓝[range f] f x :=
+ hf.induced.symm ▸ map_nhds_induced_eq x
#align inducing.map_nhds_eq Inducing.map_nhds_eq
-theorem map_nhds_of_mem (hf : Inducing f) (a : α) (h : range f ∈ 𝓝 (f a)) :
- (𝓝 a).map f = 𝓝 (f a) :=
+theorem map_nhds_of_mem (hf : Inducing f) (x : X) (h : range f ∈ 𝓝 (f x)) :
+ (𝓝 x).map f = 𝓝 (f x) :=
hf.induced.symm ▸ map_nhds_induced_of_mem h
#align inducing.map_nhds_of_mem Inducing.map_nhds_of_mem
-- porting note: new lemma
-theorem mapClusterPt_iff (hf : Inducing f) {a : α} {l : Filter α} :
- MapClusterPt (f a) l f ↔ ClusterPt a l := by
+theorem mapClusterPt_iff (hf : Inducing f) {x : X} {l : Filter X} :
+ MapClusterPt (f x) l f ↔ ClusterPt x l := by
delta MapClusterPt ClusterPt
rw [← Filter.push_pull', ← hf.nhds_eq_comap, map_neBot_iff]
-theorem image_mem_nhdsWithin (hf : Inducing f) {a : α} {s : Set α} (hs : s ∈ 𝓝 a) :
- f '' s ∈ 𝓝[range f] f a :=
- hf.map_nhds_eq a ▸ image_mem_map hs
+theorem image_mem_nhdsWithin (hf : Inducing f) {x : X} {s : Set X} (hs : s ∈ 𝓝 x) :
+ f '' s ∈ 𝓝[range f] f x :=
+ hf.map_nhds_eq x ▸ image_mem_map hs
#align inducing.image_mem_nhds_within Inducing.image_mem_nhdsWithin
-theorem tendsto_nhds_iff {f : ι → β} {a : Filter ι} {b : β} (hg : Inducing g) :
- Tendsto f a (𝓝 b) ↔ Tendsto (g ∘ f) a (𝓝 (g b)) := by
+theorem tendsto_nhds_iff {f : ι → Y} {l : Filter ι} {y : Y} (hg : Inducing g) :
+ Tendsto f l (𝓝 y) ↔ Tendsto (g ∘ f) l (𝓝 (g y)) := by
rw [hg.nhds_eq_comap, tendsto_comap_iff]
#align inducing.tendsto_nhds_iff Inducing.tendsto_nhds_iff
-theorem continuousAt_iff (hg : Inducing g) {x : α} :
+theorem continuousAt_iff (hg : Inducing g) {x : X} :
ContinuousAt f x ↔ ContinuousAt (g ∘ f) x :=
hg.tendsto_nhds_iff
#align inducing.continuous_at_iff Inducing.continuousAt_iff
@@ -135,7 +135,7 @@ theorem continuous_iff (hg : Inducing g) :
simp_rw [continuous_iff_continuousAt, hg.continuousAt_iff]
#align inducing.continuous_iff Inducing.continuous_iff
-theorem continuousAt_iff' (hf : Inducing f) {x : α} (h : range f ∈ 𝓝 (f x)) :
+theorem continuousAt_iff' (hf : Inducing f) {x : X} (h : range f ∈ 𝓝 (f x)) :
ContinuousAt (g ∘ f) x ↔ ContinuousAt g (f x) := by
simp_rw [ContinuousAt, Filter.Tendsto, ← hf.map_nhds_of_mem _ h, Filter.map_map, comp]
#align inducing.continuous_at_iff' Inducing.continuousAt_iff'
@@ -151,34 +151,34 @@ protected theorem inducing_iff (hg : Inducing g) :
exact hgf.continuous
#align inducing.inducing_iff Inducing.inducing_iff
-theorem closure_eq_preimage_closure_image (hf : Inducing f) (s : Set α) :
+theorem closure_eq_preimage_closure_image (hf : Inducing f) (s : Set X) :
closure s = f ⁻¹' closure (f '' s) := by
ext x
rw [Set.mem_preimage, ← closure_induced, hf.induced]
#align inducing.closure_eq_preimage_closure_image Inducing.closure_eq_preimage_closure_image
-theorem isClosed_iff (hf : Inducing f) {s : Set α} :
+theorem isClosed_iff (hf : Inducing f) {s : Set X} :
IsClosed s ↔ ∃ t, IsClosed t ∧ f ⁻¹' t = s := by rw [hf.induced, isClosed_induced_iff]
#align inducing.is_closed_iff Inducing.isClosed_iff
-theorem isClosed_iff' (hf : Inducing f) {s : Set α} :
+theorem isClosed_iff' (hf : Inducing f) {s : Set X} :
IsClosed s ↔ ∀ x, f x ∈ closure (f '' s) → x ∈ s := by rw [hf.induced, isClosed_induced_iff']
#align inducing.is_closed_iff' Inducing.isClosed_iff'
-theorem isClosed_preimage (h : Inducing f) (s : Set β) (hs : IsClosed s) :
+theorem isClosed_preimage (h : Inducing f) (s : Set Y) (hs : IsClosed s) :
IsClosed (f ⁻¹' s) :=
(isClosed_iff h).mpr ⟨s, hs, rfl⟩
#align inducing.is_closed_preimage Inducing.isClosed_preimage
-theorem isOpen_iff (hf : Inducing f) {s : Set α} :
+theorem isOpen_iff (hf : Inducing f) {s : Set X} :
IsOpen s ↔ ∃ t, IsOpen t ∧ f ⁻¹' t = s := by rw [hf.induced, isOpen_induced_iff]
#align inducing.is_open_iff Inducing.isOpen_iff
theorem setOf_isOpen (hf : Inducing f) :
- {s : Set α | IsOpen s} = preimage f '' {t | IsOpen t} :=
+ {s : Set X | IsOpen s} = preimage f '' {t | IsOpen t} :=
Set.ext fun _ ↦ hf.isOpen_iff
-theorem dense_iff (hf : Inducing f) {s : Set α} :
+theorem dense_iff (hf : Inducing f) {s : Set X} :
Dense s ↔ ∀ x, f x ∈ closure (f '' s) := by
simp only [Dense, hf.closure_eq_preimage_closure_image, mem_preimage]
#align inducing.dense_iff Inducing.dense_iff
@@ -190,28 +190,28 @@ end Inducing
section Embedding
/-- A function between topological spaces is an embedding if it is injective,
- and for all `s : Set α`, `s` is open iff it is the preimage of an open set. -/
+ and for all `s : Set X`, `s` is open iff it is the preimage of an open set. -/
@[mk_iff]
-structure Embedding [TopologicalSpace α] [TopologicalSpace β] (f : α → β) extends
+structure Embedding [TopologicalSpace X] [TopologicalSpace Y] (f : X → Y) extends
Inducing f : Prop where
/-- A topological embedding is injective. -/
inj : Injective f
#align embedding Embedding
#align embedding_iff embedding_iff
-theorem Function.Injective.embedding_induced [t : TopologicalSpace β] {f : α → β}
- (hf : Injective f) : @_root_.Embedding α β (t.induced f) t f :=
- @_root_.Embedding.mk α β (t.induced f) t _ (inducing_induced f) hf
+theorem Function.Injective.embedding_induced [t : TopologicalSpace Y] (hf : Injective f) :
+ @_root_.Embedding X Y (t.induced f) t f :=
+ @_root_.Embedding.mk X Y (t.induced f) t _ (inducing_induced f) hf
#align function.injective.embedding_induced Function.Injective.embedding_induced
-variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ]
+variable [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z]
-theorem Embedding.mk' (f : α → β) (inj : Injective f) (induced : ∀ a, comap f (𝓝 (f a)) = 𝓝 a) :
+theorem Embedding.mk' (f : X → Y) (inj : Injective f) (induced : ∀ x, comap f (𝓝 (f x)) = 𝓝 x) :
Embedding f :=
- ⟨inducing_iff_nhds.2 fun a => (induced a).symm, inj⟩
+ ⟨inducing_iff_nhds.2 fun x => (induced x).symm, inj⟩
#align embedding.mk' Embedding.mk'
-theorem embedding_id : Embedding (@id α) :=
+theorem embedding_id : Embedding (@id X) :=
⟨inducing_id, fun _ _ h => h⟩
#align embedding_id embedding_id
@@ -223,26 +223,26 @@ protected theorem Embedding.comp (hg : Embedding g) (hf : Embedding f) :
theorem embedding_of_embedding_compose
(hf : Continuous f) (hg : Continuous g) (hgf : Embedding (g ∘ f)) : Embedding f :=
{ induced := (inducing_of_inducing_compose hf hg hgf.toInducing).induced
- inj := fun a₁ a₂ h => hgf.inj <| by simp [h, (· ∘ ·)] }
+ inj := fun x₁ x₂ h => hgf.inj <| by simp [h, (· ∘ ·)] }
#align embedding_of_embedding_compose embedding_of_embedding_compose
-protected theorem Function.LeftInverse.embedding {f : α → β} {g : β → α} (h : LeftInverse f g)
+protected theorem Function.LeftInverse.embedding {f : X → Y} {g : Y → X} (h : LeftInverse f g)
(hf : Continuous f) (hg : Continuous g) : _root_.Embedding g :=
embedding_of_embedding_compose hg hf <| h.comp_eq_id.symm ▸ embedding_id
#align function.left_inverse.embedding Function.LeftInverse.embedding
-theorem Embedding.map_nhds_eq (hf : Embedding f) (a : α) :
- (𝓝 a).map f = 𝓝[range f] f a :=
- hf.1.map_nhds_eq a
+theorem Embedding.map_nhds_eq (hf : Embedding f) (x : X) :
+ (𝓝 x).map f = 𝓝[range f] f x :=
+ hf.1.map_nhds_eq x
#align embedding.map_nhds_eq Embedding.map_nhds_eq
-theorem Embedding.map_nhds_of_mem (hf : Embedding f) (a : α) (h : range f ∈ 𝓝 (f a)) :
- (𝓝 a).map f = 𝓝 (f a) :=
- hf.1.map_nhds_of_mem a h
+theorem Embedding.map_nhds_of_mem (hf : Embedding f) (x : X) (h : range f ∈ 𝓝 (f x)) :
+ (𝓝 x).map f = 𝓝 (f x) :=
+ hf.1.map_nhds_of_mem x h
#align embedding.map_nhds_of_mem Embedding.map_nhds_of_mem
-theorem Embedding.tendsto_nhds_iff {f : ι → β} {a : Filter ι} {b : β}
- (hg : Embedding g) : Tendsto f a (𝓝 b) ↔ Tendsto (g ∘ f) a (𝓝 (g b)) :=
+theorem Embedding.tendsto_nhds_iff {f : ι → Y} {l : Filter ι} {y : Y}
+ (hg : Embedding g) : Tendsto f l (𝓝 y) ↔ Tendsto (g ∘ f) l (𝓝 (g y)) :=
hg.toInducing.tendsto_nhds_iff
#align embedding.tendsto_nhds_iff Embedding.tendsto_nhds_iff
@@ -255,17 +255,16 @@ theorem Embedding.continuous (hf : Embedding f) : Continuous f :=
Inducing.continuous hf.1
#align embedding.continuous Embedding.continuous
-theorem Embedding.closure_eq_preimage_closure_image {e : α → β} (he : Embedding e) (s : Set α) :
- closure s = e ⁻¹' closure (e '' s) :=
- he.1.closure_eq_preimage_closure_image s
+theorem Embedding.closure_eq_preimage_closure_image (hf : Embedding f) (s : Set X) :
+ closure s = f ⁻¹' closure (f '' s) :=
+ hf.1.closure_eq_preimage_closure_image s
#align embedding.closure_eq_preimage_closure_image Embedding.closure_eq_preimage_closure_image
/-- The topology induced under an inclusion `f : X → Y` from a discrete topological space `Y`
is the discrete topology on `X`.
See also `DiscreteTopology.of_continuous_injective`. -/
-theorem Embedding.discreteTopology {X Y : Type*} [TopologicalSpace X] [TopologicalSpace Y]
- [DiscreteTopology Y] {f : X → Y} (hf : Embedding f) : DiscreteTopology X :=
+theorem Embedding.discreteTopology [DiscreteTopology Y] (hf : Embedding f) : DiscreteTopology X :=
.of_continuous_injective hf.continuous hf.inj
#align embedding.discrete_topology Embedding.discreteTopology
@@ -273,28 +272,28 @@ end Embedding
section QuotientMap
/-- A function between topological spaces is a quotient map if it is surjective,
- and for all `s : Set β`, `s` is open iff its preimage is an open set. -/
-def QuotientMap {α : Type*} {β : Type*} [tα : TopologicalSpace α] [tβ : TopologicalSpace β]
- (f : α → β) : Prop :=
- Surjective f ∧ tβ = tα.coinduced f
+ and for all `s : Set Y`, `s` is open iff its preimage is an open set. -/
+def QuotientMap {X : Type*} {Y : Type*} [tX : TopologicalSpace X] [tY : TopologicalSpace Y]
+ (f : X → Y) : Prop :=
+ Surjective f ∧ tY = tX.coinduced f
#align quotient_map QuotientMap
-variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ]
+variable [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z]
-theorem quotientMap_iff : QuotientMap f ↔ Surjective f ∧ ∀ s : Set β, IsOpen s ↔ IsOpen (f ⁻¹' s) :=
+theorem quotientMap_iff : QuotientMap f ↔ Surjective f ∧ ∀ s : Set Y, IsOpen s ↔ IsOpen (f ⁻¹' s) :=
and_congr Iff.rfl TopologicalSpace.ext_iff
#align quotient_map_iff quotientMap_iff
theorem quotientMap_iff_closed :
- QuotientMap f ↔ Surjective f ∧ ∀ s : Set β, IsClosed s ↔ IsClosed (f ⁻¹' s) :=
+ QuotientMap f ↔ Surjective f ∧ ∀ s : Set Y, IsClosed s ↔ IsClosed (f ⁻¹' s) :=
quotientMap_iff.trans <| Iff.rfl.and <| compl_surjective.forall.trans <| by
simp only [isOpen_compl_iff, preimage_compl]
#align quotient_map_iff_closed quotientMap_iff_closed
namespace QuotientMap
-protected theorem id : QuotientMap (@id α) :=
- ⟨fun a => ⟨a, rfl⟩, coinduced_id.symm⟩
+protected theorem id : QuotientMap (@id X) :=
+ ⟨fun x => ⟨x, rfl⟩, coinduced_id.symm⟩
#align quotient_map.id QuotientMap.id
protected theorem comp (hg : QuotientMap g) (hf : QuotientMap f) : QuotientMap (g ∘ f) :=
@@ -309,7 +308,7 @@ protected theorem of_quotientMap_compose (hf : Continuous f) (hg : Continuous g)
hg.coinduced_le⟩
#align quotient_map.of_quotient_map_compose QuotientMap.of_quotientMap_compose
-theorem of_inverse {g : β → α} (hf : Continuous f) (hg : Continuous g) (h : LeftInverse g f) :
+theorem of_inverse {g : Y → X} (hf : Continuous f) (hg : Continuous g) (h : LeftInverse g f) :
QuotientMap g :=
QuotientMap.of_quotientMap_compose hf hg <| h.comp_eq_id.symm ▸ QuotientMap.id
#align quotient_map.of_inverse QuotientMap.of_inverse
@@ -326,11 +325,11 @@ protected theorem surjective (hf : QuotientMap f) : Surjective f :=
hf.1
#align quotient_map.surjective QuotientMap.surjective
-protected theorem isOpen_preimage (hf : QuotientMap f) {s : Set β} : IsOpen (f ⁻¹' s) ↔ IsOpen s :=
+protected theorem isOpen_preimage (hf : QuotientMap f) {s : Set Y} : IsOpen (f ⁻¹' s) ↔ IsOpen s :=
((quotientMap_iff.1 hf).2 s).symm
#align quotient_map.is_open_preimage QuotientMap.isOpen_preimage
-protected theorem isClosed_preimage (hf : QuotientMap f) {s : Set β} :
+protected theorem isClosed_preimage (hf : QuotientMap f) {s : Set Y} :
IsClosed (f ⁻¹' s) ↔ IsClosed s :=
((quotientMap_iff_closed.1 hf).2 s).symm
#align quotient_map.is_closed_preimage QuotientMap.isClosed_preimage
@@ -340,17 +339,17 @@ end QuotientMap
end QuotientMap
section OpenMap
-/-- A map `f : α → β` is said to be an *open map*, if the image of any open `U : Set α`
-is open in `β`. -/
-def IsOpenMap [TopologicalSpace α] [TopologicalSpace β] (f : α → β) :=
- ∀ U : Set α, IsOpen U → IsOpen (f '' U)
+/-- A map `f : X → Y` is said to be an *open map*, if the image of any open `U : Set X`
+is open in `Y`. -/
+def IsOpenMap [TopologicalSpace X] [TopologicalSpace Y] (f : X → Y) :=
+ ∀ U : Set X, IsOpen U → IsOpen (f '' U)
#align is_open_map IsOpenMap
-variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ]
+variable [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z]
namespace IsOpenMap
-protected theorem id : IsOpenMap (@id α) := fun s hs => by rwa [image_id]
+protected theorem id : IsOpenMap (@id X) := fun s hs => by rwa [image_id]
#align is_open_map.id IsOpenMap.id
protected theorem comp (hg : IsOpenMap g) (hf : IsOpenMap f) :
@@ -362,36 +361,36 @@ theorem isOpen_range (hf : IsOpenMap f) : IsOpen (range f) := by
exact hf _ isOpen_univ
#align is_open_map.is_open_range IsOpenMap.isOpen_range
-theorem image_mem_nhds (hf : IsOpenMap f) {x : α} {s : Set α} (hx : s ∈ 𝓝 x) : f '' s ∈ 𝓝 (f x) :=
+theorem image_mem_nhds (hf : IsOpenMap f) {x : X} {s : Set X} (hx : s ∈ 𝓝 x) : f '' s ∈ 𝓝 (f x) :=
let ⟨t, hts, ht, hxt⟩ := mem_nhds_iff.1 hx
mem_of_superset (IsOpen.mem_nhds (hf t ht) (mem_image_of_mem _ hxt)) (image_subset _ hts)
#align is_open_map.image_mem_nhds IsOpenMap.image_mem_nhds
-theorem range_mem_nhds (hf : IsOpenMap f) (x : α) : range f ∈ 𝓝 (f x) :=
+theorem range_mem_nhds (hf : IsOpenMap f) (x : X) : range f ∈ 𝓝 (f x) :=
hf.isOpen_range.mem_nhds <| mem_range_self _
#align is_open_map.range_mem_nhds IsOpenMap.range_mem_nhds
-theorem mapsTo_interior (hf : IsOpenMap f) {s : Set α} {t : Set β} (h : MapsTo f s t) :
+theorem mapsTo_interior (hf : IsOpenMap f) {s : Set X} {t : Set Y} (h : MapsTo f s t) :
MapsTo f (interior s) (interior t) :=
mapsTo'.2 <|
interior_maximal (h.mono interior_subset Subset.rfl).image_subset (hf _ isOpen_interior)
#align is_open_map.maps_to_interior IsOpenMap.mapsTo_interior
-theorem image_interior_subset (hf : IsOpenMap f) (s : Set α) :
+theorem image_interior_subset (hf : IsOpenMap f) (s : Set X) :
f '' interior s ⊆ interior (f '' s) :=
(hf.mapsTo_interior (mapsTo_image f s)).image_subset
#align is_open_map.image_interior_subset IsOpenMap.image_interior_subset
-theorem nhds_le (hf : IsOpenMap f) (a : α) : 𝓝 (f a) ≤ (𝓝 a).map f :=
+theorem nhds_le (hf : IsOpenMap f) (x : X) : 𝓝 (f x) ≤ (𝓝 x).map f :=
le_map fun _ => hf.image_mem_nhds
#align is_open_map.nhds_le IsOpenMap.nhds_le
-theorem of_nhds_le (hf : ∀ a, 𝓝 (f a) ≤ map f (𝓝 a)) : IsOpenMap f := fun _s hs =>
- isOpen_iff_mem_nhds.2 fun _b ⟨_a, has, hab⟩ => hab ▸ hf _ (image_mem_map <| hs.mem_nhds has)
+theorem of_nhds_le (hf : ∀ x, 𝓝 (f x) ≤ map f (𝓝 x)) : IsOpenMap f := fun _s hs =>
+ isOpen_iff_mem_nhds.2 fun _y ⟨_x, hxs, hxy⟩ => hxy ▸ hf _ (image_mem_map <| hs.mem_nhds hxs)
#align is_open_map.of_nhds_le IsOpenMap.of_nhds_le
theorem of_sections
- (h : ∀ x, ∃ g : β → α, ContinuousAt g (f x) ∧ g (f x) = x ∧ RightInverse g f) : IsOpenMap f :=
+ (h : ∀ x, ∃ g : Y → X, ContinuousAt g (f x) ∧ g (f x) = x ∧ RightInverse g f) : IsOpenMap f :=
of_nhds_le fun x =>
let ⟨g, hgc, hgx, hgf⟩ := h x
calc
@@ -400,7 +399,7 @@ theorem of_sections
_ = map f (𝓝 x) := by rw [hgx]
#align is_open_map.of_sections IsOpenMap.of_sections
-theorem of_inverse {f' : β → α} (h : Continuous f') (l_inv : LeftInverse f f')
+theorem of_inverse {f' : Y → X} (h : Continuous f') (l_inv : LeftInverse f f')
(r_inv : RightInverse f f') : IsOpenMap f :=
of_sections fun _ => ⟨f', h.continuousAt, r_inv _, l_inv⟩
#align is_open_map.of_inverse IsOpenMap.of_inverse
@@ -412,36 +411,36 @@ theorem to_quotientMap (open_map : IsOpenMap f) (cont : Continuous f) (surj : Su
⟨surj, fun s => ⟨fun h => h.preimage cont, fun h => surj.image_preimage s ▸ open_map _ h⟩⟩
#align is_open_map.to_quotient_map IsOpenMap.to_quotientMap
-theorem interior_preimage_subset_preimage_interior (hf : IsOpenMap f) {s : Set β} :
+theorem interior_preimage_subset_preimage_interior (hf : IsOpenMap f) {s : Set Y} :
interior (f ⁻¹' s) ⊆ f ⁻¹' interior s :=
hf.mapsTo_interior (mapsTo_preimage _ _)
#align is_open_map.interior_preimage_subset_preimage_interior IsOpenMap.interior_preimage_subset_preimage_interior
theorem preimage_interior_eq_interior_preimage (hf₁ : IsOpenMap f) (hf₂ : Continuous f)
- (s : Set β) : f ⁻¹' interior s = interior (f ⁻¹' s) :=
+ (s : Set Y) : f ⁻¹' interior s = interior (f ⁻¹' s) :=
Subset.antisymm (preimage_interior_subset_interior_preimage hf₂)
(interior_preimage_subset_preimage_interior hf₁)
#align is_open_map.preimage_interior_eq_interior_preimage IsOpenMap.preimage_interior_eq_interior_preimage
-theorem preimage_closure_subset_closure_preimage (hf : IsOpenMap f) {s : Set β} :
+theorem preimage_closure_subset_closure_preimage (hf : IsOpenMap f) {s : Set Y} :
f ⁻¹' closure s ⊆ closure (f ⁻¹' s) := by
rw [← compl_subset_compl]
simp only [← interior_compl, ← preimage_compl, hf.interior_preimage_subset_preimage_interior]
#align is_open_map.preimage_closure_subset_closure_preimage IsOpenMap.preimage_closure_subset_closure_preimage
-theorem preimage_closure_eq_closure_preimage (hf : IsOpenMap f) (hfc : Continuous f) (s : Set β) :
+theorem preimage_closure_eq_closure_preimage (hf : IsOpenMap f) (hfc : Continuous f) (s : Set Y) :
f ⁻¹' closure s = closure (f ⁻¹' s) :=
hf.preimage_closure_subset_closure_preimage.antisymm (hfc.closure_preimage_subset s)
#align is_open_map.preimage_closure_eq_closure_preimage IsOpenMap.preimage_closure_eq_closure_preimage
-theorem preimage_frontier_subset_frontier_preimage (hf : IsOpenMap f) {s : Set β} :
+theorem preimage_frontier_subset_frontier_preimage (hf : IsOpenMap f) {s : Set Y} :
f ⁻¹' frontier s ⊆ frontier (f ⁻¹' s) := by
simpa only [frontier_eq_closure_inter_closure, preimage_inter] using
inter_subset_inter hf.preimage_closure_subset_closure_preimage
hf.preimage_closure_subset_closure_preimage
#align is_open_map.preimage_frontier_subset_frontier_preimage IsOpenMap.preimage_frontier_subset_frontier_preimage
-theorem preimage_frontier_eq_frontier_preimage (hf : IsOpenMap f) (hfc : Continuous f) (s : Set β) :
+theorem preimage_frontier_eq_frontier_preimage (hf : IsOpenMap f) (hfc : Continuous f) (s : Set Y) :
f ⁻¹' frontier s = frontier (f ⁻¹' s) := by
simp only [frontier_eq_closure_inter_closure, preimage_inter, preimage_compl,
hf.preimage_closure_eq_closure_preimage hfc]
@@ -449,7 +448,7 @@ theorem preimage_frontier_eq_frontier_preimage (hf : IsOpenMap f) (hfc : Continu
end IsOpenMap
-theorem isOpenMap_iff_nhds_le : IsOpenMap f ↔ ∀ a : α, 𝓝 (f a) ≤ (𝓝 a).map f :=
+theorem isOpenMap_iff_nhds_le : IsOpenMap f ↔ ∀ x : X, 𝓝 (f x) ≤ (𝓝 x).map f :=
⟨fun hf => hf.nhds_le, IsOpenMap.of_nhds_le⟩
#align is_open_map_iff_nhds_le isOpenMap_iff_nhds_le
@@ -470,18 +469,18 @@ end OpenMap
section IsClosedMap
-variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ]
+variable [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z]
-/-- A map `f : α → β` is said to be a *closed map*, if the image of any closed `U : Set α`
-is closed in `β`. -/
-def IsClosedMap (f : α → β) :=
- ∀ U : Set α, IsClosed U → IsClosed (f '' U)
+/-- A map `f : X → Y` is said to be a *closed map*, if the image of any closed `U : Set X`
+is closed in `Y`. -/
+def IsClosedMap (f : X → Y) :=
+ ∀ U : Set X, IsClosed U → IsClosed (f '' U)
#align is_closed_map IsClosedMap
namespace IsClosedMap
open Function
-protected theorem id : IsClosedMap (@id α) := fun s hs => by rwa [image_id]
+protected theorem id : IsClosedMap (@id X) := fun s hs => by rwa [image_id]
#align is_closed_map.id IsClosedMap.id
protected theorem comp (hg : IsClosedMap g) (hf : IsClosedMap f) : IsClosedMap (g ∘ f) := by
@@ -490,12 +489,12 @@ protected theorem comp (hg : IsClosedMap g) (hf : IsClosedMap f) : IsClosedMap (
exact hg _ (hf _ hs)
#align is_closed_map.comp IsClosedMap.comp
-theorem closure_image_subset (hf : IsClosedMap f) (s : Set α) :
+theorem closure_image_subset (hf : IsClosedMap f) (s : Set X) :
closure (f '' s) ⊆ f '' closure s :=
closure_minimal (image_subset _ subset_closure) (hf _ isClosed_closure)
#align is_closed_map.closure_image_subset IsClosedMap.closure_image_subset
-theorem of_inverse {f' : β → α} (h : Continuous f') (l_inv : LeftInverse f f')
+theorem of_inverse {f' : Y → X} (h : Continuous f') (l_inv : LeftInverse f f')
(r_inv : RightInverse f f') : IsClosedMap f := fun s hs => by
rw [image_eq_preimage_of_inverse r_inv l_inv]
exact hs.preimage h
@@ -546,20 +545,20 @@ theorem isClosedMap_iff_clusterPt :
and_comm]
theorem IsClosedMap.closure_image_eq_of_continuous
- (f_closed : IsClosedMap f) (f_cont : Continuous f) (s : Set α) :
+ (f_closed : IsClosedMap f) (f_cont : Continuous f) (s : Set X) :
closure (f '' s) = f '' closure s :=
subset_antisymm (f_closed.closure_image_subset s) (image_closure_subset_closure_image f_cont)
theorem IsClosedMap.lift'_closure_map_eq
- (f_closed : IsClosedMap f) (f_cont : Continuous f) (F : Filter α) :
+ (f_closed : IsClosedMap f) (f_cont : Continuous f) (F : Filter X) :
(map f F).lift' closure = map f (F.lift' closure) := by
- rw [map_lift'_eq2 (monotone_closure β), map_lift'_eq (monotone_closure α)]
+ rw [map_lift'_eq2 (monotone_closure Y), map_lift'_eq (monotone_closure X)]
congr
ext s : 1
exact f_closed.closure_image_eq_of_continuous f_cont s
theorem IsClosedMap.mapClusterPt_iff_lift'_closure
- {F : Filter α} (f_closed : IsClosedMap f) (f_cont : Continuous f) {y : β} :
+ {F : Filter X} (f_closed : IsClosedMap f) (f_cont : Continuous f) {y : Y} :
MapClusterPt y F f ↔ ((F.lift' closure) ⊓ 𝓟 (f ⁻¹' {y})).NeBot := by
rw [MapClusterPt, clusterPt_iff_lift'_closure', f_closed.lift'_closure_map_eq f_cont,
← comap_principal, ← map_neBot_iff f, Filter.push_pull, principal_singleton]
@@ -568,11 +567,11 @@ end IsClosedMap
section OpenEmbedding
-variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ]
+variable [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z]
/-- An open embedding is an embedding with open image. -/
@[mk_iff]
-structure OpenEmbedding (f : α → β) extends Embedding f : Prop where
+structure OpenEmbedding (f : X → Y) extends Embedding f : Prop where
/-- The range of an open embedding is an open set. -/
open_range : IsOpen <| range f
#align open_embedding OpenEmbedding
@@ -582,28 +581,28 @@ theorem OpenEmbedding.isOpenMap (hf : OpenEmbedding f) : IsOpenMap f :=
hf.toEmbedding.toInducing.isOpenMap hf.open_range
#align open_embedding.is_open_map OpenEmbedding.isOpenMap
-theorem OpenEmbedding.map_nhds_eq (hf : OpenEmbedding f) (a : α) :
- map f (𝓝 a) = 𝓝 (f a) :=
+theorem OpenEmbedding.map_nhds_eq (hf : OpenEmbedding f) (x : X) :
+ map f (𝓝 x) = 𝓝 (f x) :=
hf.toEmbedding.map_nhds_of_mem _ <| hf.open_range.mem_nhds <| mem_range_self _
#align open_embedding.map_nhds_eq OpenEmbedding.map_nhds_eq
-theorem OpenEmbedding.open_iff_image_open (hf : OpenEmbedding f) {s : Set α} :
+theorem OpenEmbedding.open_iff_image_open (hf : OpenEmbedding f) {s : Set X} :
IsOpen s ↔ IsOpen (f '' s) :=
⟨hf.isOpenMap s, fun h => by
convert ← h.preimage hf.toEmbedding.continuous
apply preimage_image_eq _ hf.inj⟩
#align open_embedding.open_iff_image_open OpenEmbedding.open_iff_image_open
-theorem OpenEmbedding.tendsto_nhds_iff {f : ι → β} {a : Filter ι} {b : β} (hg : OpenEmbedding g) :
- Tendsto f a (𝓝 b) ↔ Tendsto (g ∘ f) a (𝓝 (g b)) :=
+theorem OpenEmbedding.tendsto_nhds_iff {f : ι → Y} {l : Filter ι} {y : Y} (hg : OpenEmbedding g) :
+ Tendsto f l (𝓝 y) ↔ Tendsto (g ∘ f) l (𝓝 (g y)) :=
hg.toEmbedding.tendsto_nhds_iff
#align open_embedding.tendsto_nhds_iff OpenEmbedding.tendsto_nhds_iff
-theorem OpenEmbedding.tendsto_nhds_iff' (hf : OpenEmbedding f) {l : Filter γ} {a : α} :
- Tendsto (g ∘ f) (𝓝 a) l ↔ Tendsto g (𝓝 (f a)) l := by
+theorem OpenEmbedding.tendsto_nhds_iff' (hf : OpenEmbedding f) {l : Filter Z} {x : X} :
+ Tendsto (g ∘ f) (𝓝 x) l ↔ Tendsto g (𝓝 (f x)) l := by
rw [Tendsto, ← map_map, hf.map_nhds_eq]; rfl
-theorem OpenEmbedding.continuousAt_iff (hf : OpenEmbedding f) {x : α} :
+theorem OpenEmbedding.continuousAt_iff (hf : OpenEmbedding f) {x : X} :
ContinuousAt (g ∘ f) x ↔ ContinuousAt g (f x) :=
hf.tendsto_nhds_iff'
#align open_embedding.continuous_at_iff OpenEmbedding.continuousAt_iff
@@ -612,7 +611,7 @@ theorem OpenEmbedding.continuous (hf : OpenEmbedding f) : Continuous f :=
hf.toEmbedding.continuous
#align open_embedding.continuous OpenEmbedding.continuous
-theorem OpenEmbedding.open_iff_preimage_open (hf : OpenEmbedding f) {s : Set β}
+theorem OpenEmbedding.open_iff_preimage_open (hf : OpenEmbedding f) {s : Set Y}
(hs : s ⊆ range f) : IsOpen s ↔ IsOpen (f ⁻¹' s) := by
rw [hf.open_iff_image_open, image_preimage_eq_inter_range, inter_eq_self_of_subset_left hs]
#align open_embedding.open_iff_preimage_open OpenEmbedding.open_iff_preimage_open
@@ -635,8 +634,8 @@ theorem openEmbedding_iff_embedding_open :
theorem openEmbedding_of_continuous_injective_open
(h₁ : Continuous f) (h₂ : Injective f) (h₃ : IsOpenMap f) : OpenEmbedding f := by
simp only [openEmbedding_iff_embedding_open, embedding_iff, inducing_iff_nhds, *, and_true_iff]
- exact fun a =>
- le_antisymm (h₁.tendsto _).le_comap (@comap_map _ _ (𝓝 a) _ h₂ ▸ comap_mono (h₃.nhds_le _))
+ exact fun x =>
+ le_antisymm (h₁.tendsto _).le_comap (@comap_map _ _ (𝓝 x) _ h₂ ▸ comap_mono (h₃.nhds_le _))
#align open_embedding_of_continuous_injective_open openEmbedding_of_continuous_injective_open
theorem openEmbedding_iff_continuous_injective_open :
@@ -645,7 +644,7 @@ theorem openEmbedding_iff_continuous_injective_open :
openEmbedding_of_continuous_injective_open h.1 h.2.1 h.2.2⟩
#align open_embedding_iff_continuous_injective_open openEmbedding_iff_continuous_injective_open
-theorem openEmbedding_id : OpenEmbedding (@id α) :=
+theorem openEmbedding_id : OpenEmbedding (@id X) :=
⟨embedding_id, IsOpenMap.id.isOpen_range⟩
#align open_embedding_id openEmbedding_id
@@ -661,13 +660,13 @@ theorem isOpenMap_iff (hg : OpenEmbedding g) :
simp_rw [isOpenMap_iff_nhds_le, ← map_map, comp, ← hg.map_nhds_eq, Filter.map_le_map_iff hg.inj]
#align open_embedding.is_open_map_iff OpenEmbedding.isOpenMap_iff
-theorem of_comp_iff (f : α → β) (hg : OpenEmbedding g) :
+theorem of_comp_iff (f : X → Y) (hg : OpenEmbedding g) :
OpenEmbedding (g ∘ f) ↔ OpenEmbedding f := by
simp only [openEmbedding_iff_continuous_injective_open, ← hg.isOpenMap_iff, ←
hg.1.continuous_iff, hg.inj.of_comp_iff]
#align open_embedding.of_comp_iff OpenEmbedding.of_comp_iff
-theorem of_comp (f : α → β) (hg : OpenEmbedding g)
+theorem of_comp (f : X → Y) (hg : OpenEmbedding g)
(h : OpenEmbedding (g ∘ f)) : OpenEmbedding f :=
(OpenEmbedding.of_comp_iff f hg).1 h
#align open_embedding.of_comp OpenEmbedding.of_comp
@@ -678,11 +677,11 @@ end OpenEmbedding
section ClosedEmbedding
-variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ]
+variable [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z]
/-- A closed embedding is an embedding with closed image. -/
@[mk_iff]
-structure ClosedEmbedding (f : α → β) extends Embedding f : Prop where
+structure ClosedEmbedding (f : X → Y) extends Embedding f : Prop where
/-- The range of a closed embedding is a closed set. -/
closed_range : IsClosed <| range f
#align closed_embedding ClosedEmbedding
@@ -690,8 +689,8 @@ structure ClosedEmbedding (f : α → β) extends Embedding f : Prop where
namespace ClosedEmbedding
-theorem tendsto_nhds_iff {g : ι → α} {a : Filter ι} {b : α} (hf : ClosedEmbedding f) :
- Tendsto g a (𝓝 b) ↔ Tendsto (f ∘ g) a (𝓝 (f b)) :=
+theorem tendsto_nhds_iff {g : ι → X} {l : Filter ι} {x : X} (hf : ClosedEmbedding f) :
+ Tendsto g l (𝓝 x) ↔ Tendsto (f ∘ g) l (𝓝 (f x)) :=
hf.toEmbedding.tendsto_nhds_iff
#align closed_embedding.tendsto_nhds_iff ClosedEmbedding.tendsto_nhds_iff
@@ -703,14 +702,14 @@ theorem isClosedMap (hf : ClosedEmbedding f) : IsClosedMap f :=
hf.toEmbedding.toInducing.isClosedMap hf.closed_range
#align closed_embedding.is_closed_map ClosedEmbedding.isClosedMap
-theorem closed_iff_image_closed (hf : ClosedEmbedding f) {s : Set α} :
+theorem closed_iff_image_closed (hf : ClosedEmbedding f) {s : Set X} :
IsClosed s ↔ IsClosed (f '' s) :=
⟨hf.isClosedMap s, fun h => by
rw [← preimage_image_eq s hf.inj]
exact h.preimage hf.continuous⟩
#align closed_embedding.closed_iff_image_closed ClosedEmbedding.closed_iff_image_closed
-theorem closed_iff_preimage_closed (hf : ClosedEmbedding f) {s : Set β}
+theorem closed_iff_preimage_closed (hf : ClosedEmbedding f) {s : Set Y}
(hs : s ⊆ range f) : IsClosed s ↔ IsClosed (f ⁻¹' s) := by
rw [hf.closed_iff_image_closed, image_preimage_eq_of_subset hs]
#align closed_embedding.closed_iff_preimage_closed ClosedEmbedding.closed_iff_preimage_closed
@@ -728,7 +727,7 @@ theorem _root_.closedEmbedding_of_continuous_injective_closed (h₁ : Continuous
rw [preimage_compl, preimage_image_eq _ h₂, compl_compl]
#align closed_embedding_of_continuous_injective_closed closedEmbedding_of_continuous_injective_closed
-theorem _root_.closedEmbedding_id : ClosedEmbedding (@id α) :=
+theorem _root_.closedEmbedding_id : ClosedEmbedding (@id X) :=
⟨embedding_id, IsClosedMap.id.closed_range⟩
#align closed_embedding_id closedEmbedding_id
@@ -737,7 +736,7 @@ theorem comp (hg : ClosedEmbedding g) (hf : ClosedEmbedding f) :
⟨hg.toEmbedding.comp hf.toEmbedding, (hg.isClosedMap.comp hf.isClosedMap).closed_range⟩
#align closed_embedding.comp ClosedEmbedding.comp
-theorem closure_image_eq (hf : ClosedEmbedding f) (s : Set α) :
+theorem closure_image_eq (hf : ClosedEmbedding f) (s : Set X) :
closure (f '' s) = f '' closure s :=
hf.isClosedMap.closure_image_eq_of_continuous hf.continuous s
#align closed_embedding.closure_image_eq ClosedEmbedding.closure_image_eq
TopologicalSpace
assumptions.Co-authored-by: grunweg <grunweg@posteo.de>
@@ -49,7 +49,7 @@ open Set Filter Function
open TopologicalSpace Topology Filter
-variable {α : Type*} {β : Type*} {γ : Type*} {δ : Type*}
+variable {α : Type*} {β : Type*} {γ : Type*} {ι : Type*} {f : α → β} {g : β → γ}
section Inducing
@@ -63,7 +63,7 @@ structure Inducing [tα : TopologicalSpace α] [tβ : TopologicalSpace β] (f :
#align inducing Inducing
#align inducing_iff inducing_iff
-variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ] [TopologicalSpace δ]
+variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ]
theorem inducing_induced (f : α → β) : @Inducing α β (TopologicalSpace.induced f ‹_›) _ f :=
@Inducing.mk _ _ (TopologicalSpace.induced f ‹_›) _ _ rfl
@@ -72,117 +72,121 @@ theorem inducing_id : Inducing (@id α) :=
⟨induced_id.symm⟩
#align inducing_id inducing_id
-protected theorem Inducing.comp {g : β → γ} {f : α → β} (hg : Inducing g) (hf : Inducing f) :
+protected theorem Inducing.comp (hg : Inducing g) (hf : Inducing f) :
Inducing (g ∘ f) :=
⟨by rw [hf.induced, hg.induced, induced_compose]⟩
#align inducing.comp Inducing.comp
-theorem inducing_of_inducing_compose {f : α → β} {g : β → γ} (hf : Continuous f) (hg : Continuous g)
- (hgf : Inducing (g ∘ f)) : Inducing f :=
+theorem inducing_of_inducing_compose
+ (hf : Continuous f) (hg : Continuous g) (hgf : Inducing (g ∘ f)) : Inducing f :=
⟨le_antisymm (by rwa [← continuous_iff_le_induced])
(by
rw [hgf.induced, ← induced_compose]
exact induced_mono hg.le_induced)⟩
#align inducing_of_inducing_compose inducing_of_inducing_compose
-theorem inducing_iff_nhds {f : α → β} : Inducing f ↔ ∀ a, 𝓝 a = comap f (𝓝 (f a)) :=
+theorem inducing_iff_nhds : Inducing f ↔ ∀ a, 𝓝 a = comap f (𝓝 (f a)) :=
(inducing_iff _).trans (induced_iff_nhds_eq f)
#align inducing_iff_nhds inducing_iff_nhds
-theorem Inducing.nhds_eq_comap {f : α → β} (hf : Inducing f) : ∀ a : α, 𝓝 a = comap f (𝓝 <| f a) :=
+namespace Inducing
+
+theorem nhds_eq_comap (hf : Inducing f) : ∀ a : α, 𝓝 a = comap f (𝓝 <| f a) :=
inducing_iff_nhds.1 hf
#align inducing.nhds_eq_comap Inducing.nhds_eq_comap
-theorem Inducing.nhdsSet_eq_comap {f : α → β} (hf : Inducing f) (s : Set α) :
+theorem nhdsSet_eq_comap (hf : Inducing f) (s : Set α) :
𝓝ˢ s = comap f (𝓝ˢ (f '' s)) := by
simp only [nhdsSet, sSup_image, comap_iSup, hf.nhds_eq_comap, iSup_image]
#align inducing.nhds_set_eq_comap Inducing.nhdsSet_eq_comap
-theorem Inducing.map_nhds_eq {f : α → β} (hf : Inducing f) (a : α) : (𝓝 a).map f = 𝓝[range f] f a :=
+theorem map_nhds_eq (hf : Inducing f) (a : α) : (𝓝 a).map f = 𝓝[range f] f a :=
hf.induced.symm ▸ map_nhds_induced_eq a
#align inducing.map_nhds_eq Inducing.map_nhds_eq
-theorem Inducing.map_nhds_of_mem {f : α → β} (hf : Inducing f) (a : α) (h : range f ∈ 𝓝 (f a)) :
+theorem map_nhds_of_mem (hf : Inducing f) (a : α) (h : range f ∈ 𝓝 (f a)) :
(𝓝 a).map f = 𝓝 (f a) :=
hf.induced.symm ▸ map_nhds_induced_of_mem h
#align inducing.map_nhds_of_mem Inducing.map_nhds_of_mem
-- porting note: new lemma
-theorem Inducing.mapClusterPt_iff {f : α → β} (hf : Inducing f) {a : α} {l : Filter α} :
+theorem mapClusterPt_iff (hf : Inducing f) {a : α} {l : Filter α} :
MapClusterPt (f a) l f ↔ ClusterPt a l := by
delta MapClusterPt ClusterPt
rw [← Filter.push_pull', ← hf.nhds_eq_comap, map_neBot_iff]
-theorem Inducing.image_mem_nhdsWithin {f : α → β} (hf : Inducing f) {a : α} {s : Set α}
- (hs : s ∈ 𝓝 a) : f '' s ∈ 𝓝[range f] f a :=
+theorem image_mem_nhdsWithin (hf : Inducing f) {a : α} {s : Set α} (hs : s ∈ 𝓝 a) :
+ f '' s ∈ 𝓝[range f] f a :=
hf.map_nhds_eq a ▸ image_mem_map hs
#align inducing.image_mem_nhds_within Inducing.image_mem_nhdsWithin
-theorem Inducing.tendsto_nhds_iff {ι : Type*} {f : ι → β} {g : β → γ} {a : Filter ι} {b : β}
- (hg : Inducing g) : Tendsto f a (𝓝 b) ↔ Tendsto (g ∘ f) a (𝓝 (g b)) := by
+theorem tendsto_nhds_iff {f : ι → β} {a : Filter ι} {b : β} (hg : Inducing g) :
+ Tendsto f a (𝓝 b) ↔ Tendsto (g ∘ f) a (𝓝 (g b)) := by
rw [hg.nhds_eq_comap, tendsto_comap_iff]
#align inducing.tendsto_nhds_iff Inducing.tendsto_nhds_iff
-theorem Inducing.continuousAt_iff {f : α → β} {g : β → γ} (hg : Inducing g) {x : α} :
+theorem continuousAt_iff (hg : Inducing g) {x : α} :
ContinuousAt f x ↔ ContinuousAt (g ∘ f) x :=
hg.tendsto_nhds_iff
#align inducing.continuous_at_iff Inducing.continuousAt_iff
-theorem Inducing.continuous_iff {f : α → β} {g : β → γ} (hg : Inducing g) :
+theorem continuous_iff (hg : Inducing g) :
Continuous f ↔ Continuous (g ∘ f) := by
simp_rw [continuous_iff_continuousAt, hg.continuousAt_iff]
#align inducing.continuous_iff Inducing.continuous_iff
-theorem Inducing.continuousAt_iff' {f : α → β} {g : β → γ} (hf : Inducing f) {x : α}
- (h : range f ∈ 𝓝 (f x)) : ContinuousAt (g ∘ f) x ↔ ContinuousAt g (f x) := by
+theorem continuousAt_iff' (hf : Inducing f) {x : α} (h : range f ∈ 𝓝 (f x)) :
+ ContinuousAt (g ∘ f) x ↔ ContinuousAt g (f x) := by
simp_rw [ContinuousAt, Filter.Tendsto, ← hf.map_nhds_of_mem _ h, Filter.map_map, comp]
#align inducing.continuous_at_iff' Inducing.continuousAt_iff'
-protected theorem Inducing.continuous {f : α → β} (hf : Inducing f) : Continuous f :=
+protected theorem continuous (hf : Inducing f) : Continuous f :=
hf.continuous_iff.mp continuous_id
#align inducing.continuous Inducing.continuous
-protected theorem Inducing.inducing_iff {f : α → β} {g : β → γ} (hg : Inducing g) :
+protected theorem inducing_iff (hg : Inducing g) :
Inducing f ↔ Inducing (g ∘ f) := by
refine' ⟨fun h => hg.comp h, fun hgf => inducing_of_inducing_compose _ hg.continuous hgf⟩
rw [hg.continuous_iff]
exact hgf.continuous
#align inducing.inducing_iff Inducing.inducing_iff
-theorem Inducing.closure_eq_preimage_closure_image {f : α → β} (hf : Inducing f) (s : Set α) :
+theorem closure_eq_preimage_closure_image (hf : Inducing f) (s : Set α) :
closure s = f ⁻¹' closure (f '' s) := by
ext x
rw [Set.mem_preimage, ← closure_induced, hf.induced]
#align inducing.closure_eq_preimage_closure_image Inducing.closure_eq_preimage_closure_image
-theorem Inducing.isClosed_iff {f : α → β} (hf : Inducing f) {s : Set α} :
+theorem isClosed_iff (hf : Inducing f) {s : Set α} :
IsClosed s ↔ ∃ t, IsClosed t ∧ f ⁻¹' t = s := by rw [hf.induced, isClosed_induced_iff]
#align inducing.is_closed_iff Inducing.isClosed_iff
-theorem Inducing.isClosed_iff' {f : α → β} (hf : Inducing f) {s : Set α} :
+theorem isClosed_iff' (hf : Inducing f) {s : Set α} :
IsClosed s ↔ ∀ x, f x ∈ closure (f '' s) → x ∈ s := by rw [hf.induced, isClosed_induced_iff']
#align inducing.is_closed_iff' Inducing.isClosed_iff'
-theorem Inducing.isClosed_preimage {f : α → β} (h : Inducing f) (s : Set β) (hs : IsClosed s) :
+theorem isClosed_preimage (h : Inducing f) (s : Set β) (hs : IsClosed s) :
IsClosed (f ⁻¹' s) :=
- (Inducing.isClosed_iff h).mpr ⟨s, hs, rfl⟩
+ (isClosed_iff h).mpr ⟨s, hs, rfl⟩
#align inducing.is_closed_preimage Inducing.isClosed_preimage
-theorem Inducing.isOpen_iff {f : α → β} (hf : Inducing f) {s : Set α} :
+theorem isOpen_iff (hf : Inducing f) {s : Set α} :
IsOpen s ↔ ∃ t, IsOpen t ∧ f ⁻¹' t = s := by rw [hf.induced, isOpen_induced_iff]
#align inducing.is_open_iff Inducing.isOpen_iff
-theorem Inducing.setOf_isOpen {f : α → β} (hf : Inducing f) :
+theorem setOf_isOpen (hf : Inducing f) :
{s : Set α | IsOpen s} = preimage f '' {t | IsOpen t} :=
Set.ext fun _ ↦ hf.isOpen_iff
-theorem Inducing.dense_iff {f : α → β} (hf : Inducing f) {s : Set α} :
+theorem dense_iff (hf : Inducing f) {s : Set α} :
Dense s ↔ ∀ x, f x ∈ closure (f '' s) := by
simp only [Dense, hf.closure_eq_preimage_closure_image, mem_preimage]
#align inducing.dense_iff Inducing.dense_iff
end Inducing
+end Inducing
+
section Embedding
/-- A function between topological spaces is an embedding if it is injective,
@@ -211,13 +215,13 @@ theorem embedding_id : Embedding (@id α) :=
⟨inducing_id, fun _ _ h => h⟩
#align embedding_id embedding_id
-protected theorem Embedding.comp {g : β → γ} {f : α → β} (hg : Embedding g) (hf : Embedding f) :
+protected theorem Embedding.comp (hg : Embedding g) (hf : Embedding f) :
Embedding (g ∘ f) :=
{ hg.toInducing.comp hf.toInducing with inj := fun _ _ h => hf.inj <| hg.inj h }
#align embedding.comp Embedding.comp
-theorem embedding_of_embedding_compose {f : α → β} {g : β → γ} (hf : Continuous f)
- (hg : Continuous g) (hgf : Embedding (g ∘ f)) : Embedding f :=
+theorem embedding_of_embedding_compose
+ (hf : Continuous f) (hg : Continuous g) (hgf : Embedding (g ∘ f)) : Embedding f :=
{ induced := (inducing_of_inducing_compose hf hg hgf.toInducing).induced
inj := fun a₁ a₂ h => hgf.inj <| by simp [h, (· ∘ ·)] }
#align embedding_of_embedding_compose embedding_of_embedding_compose
@@ -227,27 +231,27 @@ protected theorem Function.LeftInverse.embedding {f : α → β} {g : β → α}
embedding_of_embedding_compose hg hf <| h.comp_eq_id.symm ▸ embedding_id
#align function.left_inverse.embedding Function.LeftInverse.embedding
-theorem Embedding.map_nhds_eq {f : α → β} (hf : Embedding f) (a : α) :
+theorem Embedding.map_nhds_eq (hf : Embedding f) (a : α) :
(𝓝 a).map f = 𝓝[range f] f a :=
hf.1.map_nhds_eq a
#align embedding.map_nhds_eq Embedding.map_nhds_eq
-theorem Embedding.map_nhds_of_mem {f : α → β} (hf : Embedding f) (a : α) (h : range f ∈ 𝓝 (f a)) :
+theorem Embedding.map_nhds_of_mem (hf : Embedding f) (a : α) (h : range f ∈ 𝓝 (f a)) :
(𝓝 a).map f = 𝓝 (f a) :=
hf.1.map_nhds_of_mem a h
#align embedding.map_nhds_of_mem Embedding.map_nhds_of_mem
-theorem Embedding.tendsto_nhds_iff {ι : Type*} {f : ι → β} {g : β → γ} {a : Filter ι} {b : β}
+theorem Embedding.tendsto_nhds_iff {f : ι → β} {a : Filter ι} {b : β}
(hg : Embedding g) : Tendsto f a (𝓝 b) ↔ Tendsto (g ∘ f) a (𝓝 (g b)) :=
hg.toInducing.tendsto_nhds_iff
#align embedding.tendsto_nhds_iff Embedding.tendsto_nhds_iff
-theorem Embedding.continuous_iff {f : α → β} {g : β → γ} (hg : Embedding g) :
+theorem Embedding.continuous_iff (hg : Embedding g) :
Continuous f ↔ Continuous (g ∘ f) :=
Inducing.continuous_iff hg.1
#align embedding.continuous_iff Embedding.continuous_iff
-theorem Embedding.continuous {f : α → β} (hf : Embedding f) : Continuous f :=
+theorem Embedding.continuous (hf : Embedding f) : Continuous f :=
Inducing.continuous hf.1
#align embedding.continuous Embedding.continuous
@@ -267,6 +271,7 @@ theorem Embedding.discreteTopology {X Y : Type*} [TopologicalSpace X] [Topologic
end Embedding
+section QuotientMap
/-- A function between topological spaces is a quotient map if it is surjective,
and for all `s : Set β`, `s` is open iff its preimage is an open set. -/
def QuotientMap {α : Type*} {β : Type*} [tα : TopologicalSpace α] [tβ : TopologicalSpace β]
@@ -274,12 +279,13 @@ def QuotientMap {α : Type*} {β : Type*} [tα : TopologicalSpace α] [tβ : Top
Surjective f ∧ tβ = tα.coinduced f
#align quotient_map QuotientMap
-theorem quotientMap_iff [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
- QuotientMap f ↔ Surjective f ∧ ∀ s : Set β, IsOpen s ↔ IsOpen (f ⁻¹' s) :=
+variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ]
+
+theorem quotientMap_iff : QuotientMap f ↔ Surjective f ∧ ∀ s : Set β, IsOpen s ↔ IsOpen (f ⁻¹' s) :=
and_congr Iff.rfl TopologicalSpace.ext_iff
#align quotient_map_iff quotientMap_iff
-theorem quotientMap_iff_closed [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
+theorem quotientMap_iff_closed :
QuotientMap f ↔ Surjective f ∧ ∀ s : Set β, IsClosed s ↔ IsClosed (f ⁻¹' s) :=
quotientMap_iff.trans <| Iff.rfl.and <| compl_surjective.forall.trans <| by
simp only [isOpen_compl_iff, preimage_compl]
@@ -287,9 +293,6 @@ theorem quotientMap_iff_closed [TopologicalSpace α] [TopologicalSpace β] {f :
namespace QuotientMap
-variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ] [TopologicalSpace δ]
- {g : β → γ} {f : α → β}
-
protected theorem id : QuotientMap (@id α) :=
⟨fun a => ⟨a, rfl⟩, coinduced_id.symm⟩
#align quotient_map.id QuotientMap.id
@@ -334,20 +337,23 @@ protected theorem isClosed_preimage (hf : QuotientMap f) {s : Set β} :
end QuotientMap
+end QuotientMap
+
+section OpenMap
/-- A map `f : α → β` is said to be an *open map*, if the image of any open `U : Set α`
is open in `β`. -/
def IsOpenMap [TopologicalSpace α] [TopologicalSpace β] (f : α → β) :=
∀ U : Set α, IsOpen U → IsOpen (f '' U)
#align is_open_map IsOpenMap
-namespace IsOpenMap
+variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ]
-variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ] {f : α → β}
+namespace IsOpenMap
protected theorem id : IsOpenMap (@id α) := fun s hs => by rwa [image_id]
#align is_open_map.id IsOpenMap.id
-protected theorem comp {g : β → γ} {f : α → β} (hg : IsOpenMap g) (hf : IsOpenMap f) :
+protected theorem comp (hg : IsOpenMap g) (hf : IsOpenMap f) :
IsOpenMap (g ∘ f) := fun s hs => by rw [image_comp]; exact hg _ (hf _ hs)
#align is_open_map.comp IsOpenMap.comp
@@ -384,7 +390,7 @@ theorem of_nhds_le (hf : ∀ a, 𝓝 (f a) ≤ map f (𝓝 a)) : IsOpenMap f :=
isOpen_iff_mem_nhds.2 fun _b ⟨_a, has, hab⟩ => hab ▸ hf _ (image_mem_map <| hs.mem_nhds has)
#align is_open_map.of_nhds_le IsOpenMap.of_nhds_le
-theorem of_sections {f : α → β}
+theorem of_sections
(h : ∀ x, ∃ g : β → α, ContinuousAt g (f x) ∧ g (f x) = x ∧ RightInverse g f) : IsOpenMap f :=
of_nhds_le fun x =>
let ⟨g, hgc, hgx, hgf⟩ := h x
@@ -394,14 +400,14 @@ theorem of_sections {f : α → β}
_ = map f (𝓝 x) := by rw [hgx]
#align is_open_map.of_sections IsOpenMap.of_sections
-theorem of_inverse {f : α → β} {f' : β → α} (h : Continuous f') (l_inv : LeftInverse f f')
+theorem of_inverse {f' : β → α} (h : Continuous f') (l_inv : LeftInverse f f')
(r_inv : RightInverse f f') : IsOpenMap f :=
of_sections fun _ => ⟨f', h.continuousAt, r_inv _, l_inv⟩
#align is_open_map.of_inverse IsOpenMap.of_inverse
/-- A continuous surjective open map is a quotient map. -/
-theorem to_quotientMap {f : α → β} (open_map : IsOpenMap f) (cont : Continuous f)
- (surj : Surjective f) : QuotientMap f :=
+theorem to_quotientMap (open_map : IsOpenMap f) (cont : Continuous f) (surj : Surjective f) :
+ QuotientMap f :=
quotientMap_iff.2
⟨surj, fun s => ⟨fun h => h.preimage cont, fun h => surj.image_preimage s ▸ open_map _ h⟩⟩
#align is_open_map.to_quotient_map IsOpenMap.to_quotientMap
@@ -443,13 +449,11 @@ theorem preimage_frontier_eq_frontier_preimage (hf : IsOpenMap f) (hfc : Continu
end IsOpenMap
-theorem isOpenMap_iff_nhds_le [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
- IsOpenMap f ↔ ∀ a : α, 𝓝 (f a) ≤ (𝓝 a).map f :=
+theorem isOpenMap_iff_nhds_le : IsOpenMap f ↔ ∀ a : α, 𝓝 (f a) ≤ (𝓝 a).map f :=
⟨fun hf => hf.nhds_le, IsOpenMap.of_nhds_le⟩
#align is_open_map_iff_nhds_le isOpenMap_iff_nhds_le
-theorem isOpenMap_iff_interior [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
- IsOpenMap f ↔ ∀ s, f '' interior s ⊆ interior (f '' s) :=
+theorem isOpenMap_iff_interior : IsOpenMap f ↔ ∀ s, f '' interior s ⊆ interior (f '' s) :=
⟨IsOpenMap.image_interior_subset, fun hs u hu =>
subset_interior_iff_isOpen.mp <|
calc
@@ -458,14 +462,15 @@ theorem isOpenMap_iff_interior [TopologicalSpace α] [TopologicalSpace β] {f :
#align is_open_map_iff_interior isOpenMap_iff_interior
/-- An inducing map with an open range is an open map. -/
-protected theorem Inducing.isOpenMap [TopologicalSpace α] [TopologicalSpace β] {f : α → β}
- (hi : Inducing f) (ho : IsOpen (range f)) : IsOpenMap f :=
+protected theorem Inducing.isOpenMap (hi : Inducing f) (ho : IsOpen (range f)) : IsOpenMap f :=
IsOpenMap.of_nhds_le fun _ => (hi.map_nhds_of_mem _ <| IsOpen.mem_nhds ho <| mem_range_self _).ge
#align inducing.is_open_map Inducing.isOpenMap
+end OpenMap
+
section IsClosedMap
-variable [TopologicalSpace α] [TopologicalSpace β]
+variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ]
/-- A map `f : α → β` is said to be a *closed map*, if the image of any closed `U : Set α`
is closed in `β`. -/
@@ -473,47 +478,41 @@ def IsClosedMap (f : α → β) :=
∀ U : Set α, IsClosed U → IsClosed (f '' U)
#align is_closed_map IsClosedMap
-end IsClosedMap
-
namespace IsClosedMap
-
-variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ]
-
open Function
protected theorem id : IsClosedMap (@id α) := fun s hs => by rwa [image_id]
#align is_closed_map.id IsClosedMap.id
-protected theorem comp {g : β → γ} {f : α → β} (hg : IsClosedMap g) (hf : IsClosedMap f) :
- IsClosedMap (g ∘ f) := by
+protected theorem comp (hg : IsClosedMap g) (hf : IsClosedMap f) : IsClosedMap (g ∘ f) := by
intro s hs
rw [image_comp]
exact hg _ (hf _ hs)
#align is_closed_map.comp IsClosedMap.comp
-theorem closure_image_subset {f : α → β} (hf : IsClosedMap f) (s : Set α) :
+theorem closure_image_subset (hf : IsClosedMap f) (s : Set α) :
closure (f '' s) ⊆ f '' closure s :=
closure_minimal (image_subset _ subset_closure) (hf _ isClosed_closure)
#align is_closed_map.closure_image_subset IsClosedMap.closure_image_subset
-theorem of_inverse {f : α → β} {f' : β → α} (h : Continuous f') (l_inv : LeftInverse f f')
+theorem of_inverse {f' : β → α} (h : Continuous f') (l_inv : LeftInverse f f')
(r_inv : RightInverse f f') : IsClosedMap f := fun s hs => by
rw [image_eq_preimage_of_inverse r_inv l_inv]
exact hs.preimage h
#align is_closed_map.of_inverse IsClosedMap.of_inverse
-theorem of_nonempty {f : α → β} (h : ∀ s, IsClosed s → s.Nonempty → IsClosed (f '' s)) :
+theorem of_nonempty (h : ∀ s, IsClosed s → s.Nonempty → IsClosed (f '' s)) :
IsClosedMap f := by
intro s hs; rcases eq_empty_or_nonempty s with h2s | h2s
· simp_rw [h2s, image_empty, isClosed_empty]
· exact h s hs h2s
#align is_closed_map.of_nonempty IsClosedMap.of_nonempty
-theorem closed_range {f : α → β} (hf : IsClosedMap f) : IsClosed (range f) :=
+theorem closed_range (hf : IsClosedMap f) : IsClosed (range f) :=
@image_univ _ _ f ▸ hf _ isClosed_univ
#align is_closed_map.closed_range IsClosedMap.closed_range
-theorem to_quotientMap {f : α → β} (hcl : IsClosedMap f) (hcont : Continuous f)
+theorem to_quotientMap (hcl : IsClosedMap f) (hcont : Continuous f)
(hsurj : Surjective f) : QuotientMap f :=
quotientMap_iff_closed.2 ⟨hsurj, fun s =>
⟨fun hs => hs.preimage hcont, fun hs => hsurj.image_preimage s ▸ hcl _ hs⟩⟩
@@ -521,15 +520,14 @@ theorem to_quotientMap {f : α → β} (hcl : IsClosedMap f) (hcont : Continuous
end IsClosedMap
-theorem Inducing.isClosedMap [TopologicalSpace α] [TopologicalSpace β] {f : α → β} (hf : Inducing f)
- (h : IsClosed (range f)) : IsClosedMap f := by
+theorem Inducing.isClosedMap (hf : Inducing f) (h : IsClosed (range f)) : IsClosedMap f := by
intro s hs
rcases hf.isClosed_iff.1 hs with ⟨t, ht, rfl⟩
rw [image_preimage_eq_inter_range]
exact ht.inter h
#align inducing.is_closed_map Inducing.isClosedMap
-theorem isClosedMap_iff_closure_image [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
+theorem isClosedMap_iff_closure_image :
IsClosedMap f ↔ ∀ s, closure (f '' s) ⊆ f '' closure s :=
⟨IsClosedMap.closure_image_subset, fun hs c hc =>
isClosed_of_closure_subset <|
@@ -542,30 +540,32 @@ theorem isClosedMap_iff_closure_image [TopologicalSpace α] [TopologicalSpace β
the image by `f` of some cluster point of `s`.
If you require this for all filters instead of just principal filters, and also that `f` is
continuous, you get the notion of **proper map**. See `isProperMap_iff_clusterPt`. -/
-theorem isClosedMap_iff_clusterPt [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
+theorem isClosedMap_iff_clusterPt :
IsClosedMap f ↔ ∀ s y, MapClusterPt y (𝓟 s) f → ∃ x, f x = y ∧ ClusterPt x (𝓟 s) := by
simp [MapClusterPt, isClosedMap_iff_closure_image, subset_def, mem_closure_iff_clusterPt,
and_comm]
-theorem IsClosedMap.closure_image_eq_of_continuous [TopologicalSpace α] [TopologicalSpace β]
- {f : α → β} (f_closed : IsClosedMap f) (f_cont : Continuous f) (s : Set α) :
+theorem IsClosedMap.closure_image_eq_of_continuous
+ (f_closed : IsClosedMap f) (f_cont : Continuous f) (s : Set α) :
closure (f '' s) = f '' closure s :=
subset_antisymm (f_closed.closure_image_subset s) (image_closure_subset_closure_image f_cont)
-theorem IsClosedMap.lift'_closure_map_eq [TopologicalSpace α] [TopologicalSpace β]
- {f : α → β} (f_closed : IsClosedMap f) (f_cont : Continuous f) (F : Filter α) :
+theorem IsClosedMap.lift'_closure_map_eq
+ (f_closed : IsClosedMap f) (f_cont : Continuous f) (F : Filter α) :
(map f F).lift' closure = map f (F.lift' closure) := by
rw [map_lift'_eq2 (monotone_closure β), map_lift'_eq (monotone_closure α)]
congr
ext s : 1
exact f_closed.closure_image_eq_of_continuous f_cont s
-theorem IsClosedMap.mapClusterPt_iff_lift'_closure [TopologicalSpace α] [TopologicalSpace β]
- {F : Filter α} {f : α → β} (f_closed : IsClosedMap f) (f_cont : Continuous f) {y : β} :
+theorem IsClosedMap.mapClusterPt_iff_lift'_closure
+ {F : Filter α} (f_closed : IsClosedMap f) (f_cont : Continuous f) {y : β} :
MapClusterPt y F f ↔ ((F.lift' closure) ⊓ 𝓟 (f ⁻¹' {y})).NeBot := by
rw [MapClusterPt, clusterPt_iff_lift'_closure', f_closed.lift'_closure_map_eq f_cont,
← comap_principal, ← map_neBot_iff f, Filter.push_pull, principal_singleton]
+end IsClosedMap
+
section OpenEmbedding
variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ]
@@ -578,68 +578,68 @@ structure OpenEmbedding (f : α → β) extends Embedding f : Prop where
#align open_embedding OpenEmbedding
#align open_embedding_iff openEmbedding_iff
-theorem OpenEmbedding.isOpenMap {f : α → β} (hf : OpenEmbedding f) : IsOpenMap f :=
+theorem OpenEmbedding.isOpenMap (hf : OpenEmbedding f) : IsOpenMap f :=
hf.toEmbedding.toInducing.isOpenMap hf.open_range
#align open_embedding.is_open_map OpenEmbedding.isOpenMap
-theorem OpenEmbedding.map_nhds_eq {f : α → β} (hf : OpenEmbedding f) (a : α) :
+theorem OpenEmbedding.map_nhds_eq (hf : OpenEmbedding f) (a : α) :
map f (𝓝 a) = 𝓝 (f a) :=
hf.toEmbedding.map_nhds_of_mem _ <| hf.open_range.mem_nhds <| mem_range_self _
#align open_embedding.map_nhds_eq OpenEmbedding.map_nhds_eq
-theorem OpenEmbedding.open_iff_image_open {f : α → β} (hf : OpenEmbedding f) {s : Set α} :
+theorem OpenEmbedding.open_iff_image_open (hf : OpenEmbedding f) {s : Set α} :
IsOpen s ↔ IsOpen (f '' s) :=
⟨hf.isOpenMap s, fun h => by
convert ← h.preimage hf.toEmbedding.continuous
apply preimage_image_eq _ hf.inj⟩
#align open_embedding.open_iff_image_open OpenEmbedding.open_iff_image_open
-theorem OpenEmbedding.tendsto_nhds_iff {ι : Type*} {f : ι → β} {g : β → γ} {a : Filter ι} {b : β}
- (hg : OpenEmbedding g) : Tendsto f a (𝓝 b) ↔ Tendsto (g ∘ f) a (𝓝 (g b)) :=
+theorem OpenEmbedding.tendsto_nhds_iff {f : ι → β} {a : Filter ι} {b : β} (hg : OpenEmbedding g) :
+ Tendsto f a (𝓝 b) ↔ Tendsto (g ∘ f) a (𝓝 (g b)) :=
hg.toEmbedding.tendsto_nhds_iff
#align open_embedding.tendsto_nhds_iff OpenEmbedding.tendsto_nhds_iff
-theorem OpenEmbedding.tendsto_nhds_iff' {f : α → β} (hf : OpenEmbedding f) {g : β → γ}
- {l : Filter γ} {a : α} : Tendsto (g ∘ f) (𝓝 a) l ↔ Tendsto g (𝓝 (f a)) l := by
+theorem OpenEmbedding.tendsto_nhds_iff' (hf : OpenEmbedding f) {l : Filter γ} {a : α} :
+ Tendsto (g ∘ f) (𝓝 a) l ↔ Tendsto g (𝓝 (f a)) l := by
rw [Tendsto, ← map_map, hf.map_nhds_eq]; rfl
-theorem OpenEmbedding.continuousAt_iff {f : α → β} (hf : OpenEmbedding f) {g : β → γ} {x : α} :
+theorem OpenEmbedding.continuousAt_iff (hf : OpenEmbedding f) {x : α} :
ContinuousAt (g ∘ f) x ↔ ContinuousAt g (f x) :=
hf.tendsto_nhds_iff'
#align open_embedding.continuous_at_iff OpenEmbedding.continuousAt_iff
-theorem OpenEmbedding.continuous {f : α → β} (hf : OpenEmbedding f) : Continuous f :=
+theorem OpenEmbedding.continuous (hf : OpenEmbedding f) : Continuous f :=
hf.toEmbedding.continuous
#align open_embedding.continuous OpenEmbedding.continuous
-theorem OpenEmbedding.open_iff_preimage_open {f : α → β} (hf : OpenEmbedding f) {s : Set β}
+theorem OpenEmbedding.open_iff_preimage_open (hf : OpenEmbedding f) {s : Set β}
(hs : s ⊆ range f) : IsOpen s ↔ IsOpen (f ⁻¹' s) := by
rw [hf.open_iff_image_open, image_preimage_eq_inter_range, inter_eq_self_of_subset_left hs]
#align open_embedding.open_iff_preimage_open OpenEmbedding.open_iff_preimage_open
-theorem openEmbedding_of_embedding_open {f : α → β} (h₁ : Embedding f) (h₂ : IsOpenMap f) :
+theorem openEmbedding_of_embedding_open (h₁ : Embedding f) (h₂ : IsOpenMap f) :
OpenEmbedding f :=
⟨h₁, h₂.isOpen_range⟩
#align open_embedding_of_embedding_open openEmbedding_of_embedding_open
/-- A surjective embedding is an `OpenEmbedding`. -/
-theorem _root_.Embedding.toOpenEmbedding_of_surjective {f : α → β}
- (hf : Embedding f) (hsurj: f.Surjective) : OpenEmbedding f :=
+theorem _root_.Embedding.toOpenEmbedding_of_surjective (hf : Embedding f) (hsurj: f.Surjective) :
+ OpenEmbedding f :=
⟨hf, hsurj.range_eq ▸ isOpen_univ⟩
-theorem openEmbedding_iff_embedding_open {f : α → β} :
+theorem openEmbedding_iff_embedding_open :
OpenEmbedding f ↔ Embedding f ∧ IsOpenMap f :=
⟨fun h => ⟨h.1, h.isOpenMap⟩, fun h => openEmbedding_of_embedding_open h.1 h.2⟩
#align open_embedding_iff_embedding_open openEmbedding_iff_embedding_open
-theorem openEmbedding_of_continuous_injective_open {f : α → β} (h₁ : Continuous f)
- (h₂ : Injective f) (h₃ : IsOpenMap f) : OpenEmbedding f := by
+theorem openEmbedding_of_continuous_injective_open
+ (h₁ : Continuous f) (h₂ : Injective f) (h₃ : IsOpenMap f) : OpenEmbedding f := by
simp only [openEmbedding_iff_embedding_open, embedding_iff, inducing_iff_nhds, *, and_true_iff]
exact fun a =>
le_antisymm (h₁.tendsto _).le_comap (@comap_map _ _ (𝓝 a) _ h₂ ▸ comap_mono (h₃.nhds_le _))
#align open_embedding_of_continuous_injective_open openEmbedding_of_continuous_injective_open
-theorem openEmbedding_iff_continuous_injective_open {f : α → β} :
+theorem openEmbedding_iff_continuous_injective_open :
OpenEmbedding f ↔ Continuous f ∧ Injective f ∧ IsOpenMap f :=
⟨fun h => ⟨h.continuous, h.inj, h.isOpenMap⟩, fun h =>
openEmbedding_of_continuous_injective_open h.1 h.2.1 h.2.2⟩
@@ -649,29 +649,33 @@ theorem openEmbedding_id : OpenEmbedding (@id α) :=
⟨embedding_id, IsOpenMap.id.isOpen_range⟩
#align open_embedding_id openEmbedding_id
-protected theorem OpenEmbedding.comp {g : β → γ} {f : α → β} (hg : OpenEmbedding g)
+namespace OpenEmbedding
+
+protected theorem comp (hg : OpenEmbedding g)
(hf : OpenEmbedding f) : OpenEmbedding (g ∘ f) :=
⟨hg.1.comp hf.1, (hg.isOpenMap.comp hf.isOpenMap).isOpen_range⟩
#align open_embedding.comp OpenEmbedding.comp
-theorem OpenEmbedding.isOpenMap_iff {g : β → γ} {f : α → β} (hg : OpenEmbedding g) :
+theorem isOpenMap_iff (hg : OpenEmbedding g) :
IsOpenMap f ↔ IsOpenMap (g ∘ f) := by
simp_rw [isOpenMap_iff_nhds_le, ← map_map, comp, ← hg.map_nhds_eq, Filter.map_le_map_iff hg.inj]
#align open_embedding.is_open_map_iff OpenEmbedding.isOpenMap_iff
-theorem OpenEmbedding.of_comp_iff (f : α → β) {g : β → γ} (hg : OpenEmbedding g) :
+theorem of_comp_iff (f : α → β) (hg : OpenEmbedding g) :
OpenEmbedding (g ∘ f) ↔ OpenEmbedding f := by
simp only [openEmbedding_iff_continuous_injective_open, ← hg.isOpenMap_iff, ←
hg.1.continuous_iff, hg.inj.of_comp_iff]
#align open_embedding.of_comp_iff OpenEmbedding.of_comp_iff
-theorem OpenEmbedding.of_comp (f : α → β) {g : β → γ} (hg : OpenEmbedding g)
+theorem of_comp (f : α → β) (hg : OpenEmbedding g)
(h : OpenEmbedding (g ∘ f)) : OpenEmbedding f :=
(OpenEmbedding.of_comp_iff f hg).1 h
#align open_embedding.of_comp OpenEmbedding.of_comp
end OpenEmbedding
+end OpenEmbedding
+
section ClosedEmbedding
variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ]
@@ -684,39 +688,39 @@ structure ClosedEmbedding (f : α → β) extends Embedding f : Prop where
#align closed_embedding ClosedEmbedding
#align closed_embedding_iff closedEmbedding_iff
-variable {f : α → β}
+namespace ClosedEmbedding
-theorem ClosedEmbedding.tendsto_nhds_iff {ι : Type*} {g : ι → α} {a : Filter ι} {b : α}
- (hf : ClosedEmbedding f) : Tendsto g a (𝓝 b) ↔ Tendsto (f ∘ g) a (𝓝 (f b)) :=
+theorem tendsto_nhds_iff {g : ι → α} {a : Filter ι} {b : α} (hf : ClosedEmbedding f) :
+ Tendsto g a (𝓝 b) ↔ Tendsto (f ∘ g) a (𝓝 (f b)) :=
hf.toEmbedding.tendsto_nhds_iff
#align closed_embedding.tendsto_nhds_iff ClosedEmbedding.tendsto_nhds_iff
-theorem ClosedEmbedding.continuous (hf : ClosedEmbedding f) : Continuous f :=
+theorem continuous (hf : ClosedEmbedding f) : Continuous f :=
hf.toEmbedding.continuous
#align closed_embedding.continuous ClosedEmbedding.continuous
-theorem ClosedEmbedding.isClosedMap (hf : ClosedEmbedding f) : IsClosedMap f :=
+theorem isClosedMap (hf : ClosedEmbedding f) : IsClosedMap f :=
hf.toEmbedding.toInducing.isClosedMap hf.closed_range
#align closed_embedding.is_closed_map ClosedEmbedding.isClosedMap
-theorem ClosedEmbedding.closed_iff_image_closed (hf : ClosedEmbedding f) {s : Set α} :
+theorem closed_iff_image_closed (hf : ClosedEmbedding f) {s : Set α} :
IsClosed s ↔ IsClosed (f '' s) :=
⟨hf.isClosedMap s, fun h => by
rw [← preimage_image_eq s hf.inj]
exact h.preimage hf.continuous⟩
#align closed_embedding.closed_iff_image_closed ClosedEmbedding.closed_iff_image_closed
-theorem ClosedEmbedding.closed_iff_preimage_closed (hf : ClosedEmbedding f) {s : Set β}
+theorem closed_iff_preimage_closed (hf : ClosedEmbedding f) {s : Set β}
(hs : s ⊆ range f) : IsClosed s ↔ IsClosed (f ⁻¹' s) := by
rw [hf.closed_iff_image_closed, image_preimage_eq_of_subset hs]
#align closed_embedding.closed_iff_preimage_closed ClosedEmbedding.closed_iff_preimage_closed
-theorem closedEmbedding_of_embedding_closed (h₁ : Embedding f) (h₂ : IsClosedMap f) :
+theorem _root_.closedEmbedding_of_embedding_closed (h₁ : Embedding f) (h₂ : IsClosedMap f) :
ClosedEmbedding f :=
⟨h₁, image_univ (f := f) ▸ h₂ univ isClosed_univ⟩
#align closed_embedding_of_embedding_closed closedEmbedding_of_embedding_closed
-theorem closedEmbedding_of_continuous_injective_closed (h₁ : Continuous f) (h₂ : Injective f)
+theorem _root_.closedEmbedding_of_continuous_injective_closed (h₁ : Continuous f) (h₂ : Injective f)
(h₃ : IsClosedMap f) : ClosedEmbedding f := by
refine closedEmbedding_of_embedding_closed ⟨⟨?_⟩, h₂⟩ h₃
refine h₁.le_induced.antisymm fun s hs => ?_
@@ -724,18 +728,20 @@ theorem closedEmbedding_of_continuous_injective_closed (h₁ : Continuous f) (h
rw [preimage_compl, preimage_image_eq _ h₂, compl_compl]
#align closed_embedding_of_continuous_injective_closed closedEmbedding_of_continuous_injective_closed
-theorem closedEmbedding_id : ClosedEmbedding (@id α) :=
+theorem _root_.closedEmbedding_id : ClosedEmbedding (@id α) :=
⟨embedding_id, IsClosedMap.id.closed_range⟩
#align closed_embedding_id closedEmbedding_id
-theorem ClosedEmbedding.comp {g : β → γ} {f : α → β} (hg : ClosedEmbedding g)
- (hf : ClosedEmbedding f) : ClosedEmbedding (g ∘ f) :=
+theorem comp (hg : ClosedEmbedding g) (hf : ClosedEmbedding f) :
+ ClosedEmbedding (g ∘ f) :=
⟨hg.toEmbedding.comp hf.toEmbedding, (hg.isClosedMap.comp hf.isClosedMap).closed_range⟩
#align closed_embedding.comp ClosedEmbedding.comp
-theorem ClosedEmbedding.closure_image_eq {f : α → β} (hf : ClosedEmbedding f) (s : Set α) :
+theorem closure_image_eq (hf : ClosedEmbedding f) (s : Set α) :
closure (f '' s) = f '' closure s :=
hf.isClosedMap.closure_image_eq_of_continuous hf.continuous s
#align closed_embedding.closure_image_eq ClosedEmbedding.closure_image_eq
end ClosedEmbedding
+
+end ClosedEmbedding
@@ -56,7 +56,7 @@ section Inducing
/-- A function `f : α → β` between topological spaces is inducing if the topology on `α` is induced
by the topology on `β` through `f`, meaning that a set `s : Set α` is open iff it is the preimage
under `f` of some open set `t : Set β`. -/
-@[mk_iff inducing_iff]
+@[mk_iff]
structure Inducing [tα : TopologicalSpace α] [tβ : TopologicalSpace β] (f : α → β) : Prop where
/-- The topology on the domain is equal to the induced topology. -/
induced : tα = tβ.induced f
@@ -187,7 +187,7 @@ section Embedding
/-- A function between topological spaces is an embedding if it is injective,
and for all `s : Set α`, `s` is open iff it is the preimage of an open set. -/
-@[mk_iff embedding_iff]
+@[mk_iff]
structure Embedding [TopologicalSpace α] [TopologicalSpace β] (f : α → β) extends
Inducing f : Prop where
/-- A topological embedding is injective. -/
@@ -571,7 +571,7 @@ section OpenEmbedding
variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ]
/-- An open embedding is an embedding with open image. -/
-@[mk_iff openEmbedding_iff]
+@[mk_iff]
structure OpenEmbedding (f : α → β) extends Embedding f : Prop where
/-- The range of an open embedding is an open set. -/
open_range : IsOpen <| range f
@@ -677,7 +677,7 @@ section ClosedEmbedding
variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ]
/-- A closed embedding is an embedding with closed image. -/
-@[mk_iff closedEmbedding_iff]
+@[mk_iff]
structure ClosedEmbedding (f : α → β) extends Embedding f : Prop where
/-- The range of a closed embedding is a closed set. -/
closed_range : IsClosed <| range f
@@ -622,6 +622,11 @@ theorem openEmbedding_of_embedding_open {f : α → β} (h₁ : Embedding f) (h
⟨h₁, h₂.isOpen_range⟩
#align open_embedding_of_embedding_open openEmbedding_of_embedding_open
+/-- A surjective embedding is an `OpenEmbedding`. -/
+theorem _root_.Embedding.toOpenEmbedding_of_surjective {f : α → β}
+ (hf : Embedding f) (hsurj: f.Surjective) : OpenEmbedding f :=
+ ⟨hf, hsurj.range_eq ▸ isOpen_univ⟩
+
theorem openEmbedding_iff_embedding_open {f : α → β} :
OpenEmbedding f ↔ Embedding f ∧ IsOpenMap f :=
⟨fun h => ⟨h.1, h.isOpenMap⟩, fun h => openEmbedding_of_embedding_open h.1 h.2⟩
cases'
(#9171)
I literally went through and regex'd some uses of cases'
, replacing them with rcases
; this is meant to be a low effort PR as I hope that tools can do this in the future.
rcases
is an easier replacement than cases
, though with better tools we could in future do a second pass converting simple rcases
added here (and existing ones) to cases
.
@@ -504,7 +504,7 @@ theorem of_inverse {f : α → β} {f' : β → α} (h : Continuous f') (l_inv :
theorem of_nonempty {f : α → β} (h : ∀ s, IsClosed s → s.Nonempty → IsClosed (f '' s)) :
IsClosedMap f := by
- intro s hs; cases' eq_empty_or_nonempty s with h2s h2s
+ intro s hs; rcases eq_empty_or_nonempty s with h2s | h2s
· simp_rw [h2s, image_empty, isClosed_empty]
· exact h s hs h2s
#align is_closed_map.of_nonempty IsClosedMap.of_nonempty
A stronger version of #8800, the differences are:
assume either IsSigmaCompact U
or SigmaCompactSpace M
;
only need test functions satisfying tsupport g ⊆ U
rather than support g ⊆ U
;
requires LocallyIntegrableOn
U rather than LocallyIntegrable
on the whole space.
Also fills in some missing APIs around the manifold and measure theory libraries.
Co-authored-by: sgouezel <sebastien.gouezel@univ-rennes1.fr> Co-authored-by: Junyan Xu <junyanxu.math@gmail.com>
@@ -603,6 +603,11 @@ theorem OpenEmbedding.tendsto_nhds_iff' {f : α → β} (hf : OpenEmbedding f) {
{l : Filter γ} {a : α} : Tendsto (g ∘ f) (𝓝 a) l ↔ Tendsto g (𝓝 (f a)) l := by
rw [Tendsto, ← map_map, hf.map_nhds_eq]; rfl
+theorem OpenEmbedding.continuousAt_iff {f : α → β} (hf : OpenEmbedding f) {g : β → γ} {x : α} :
+ ContinuousAt (g ∘ f) x ↔ ContinuousAt g (f x) :=
+ hf.tendsto_nhds_iff'
+#align open_embedding.continuous_at_iff OpenEmbedding.continuousAt_iff
+
theorem OpenEmbedding.continuous {f : α → β} (hf : OpenEmbedding f) : Continuous f :=
hf.toEmbedding.continuous
#align open_embedding.continuous OpenEmbedding.continuous
@@ -256,13 +256,13 @@ theorem Embedding.closure_eq_preimage_closure_image {e : α → β} (he : Embedd
he.1.closure_eq_preimage_closure_image s
#align embedding.closure_eq_preimage_closure_image Embedding.closure_eq_preimage_closure_image
-/-- The topology induced under an inclusion `f : X → Y` from the discrete topological space `Y`
-is the discrete topology on `X`. -/
-theorem Embedding.discreteTopology {X Y : Type*} [TopologicalSpace X] [tY : TopologicalSpace Y]
+/-- The topology induced under an inclusion `f : X → Y` from a discrete topological space `Y`
+is the discrete topology on `X`.
+
+See also `DiscreteTopology.of_continuous_injective`. -/
+theorem Embedding.discreteTopology {X Y : Type*} [TopologicalSpace X] [TopologicalSpace Y]
[DiscreteTopology Y] {f : X → Y} (hf : Embedding f) : DiscreteTopology X :=
- discreteTopology_iff_nhds.2 fun x => by
- rw [hf.nhds_eq_comap, nhds_discrete, comap_pure, ← image_singleton, hf.inj.preimage_image,
- principal_singleton]
+ .of_continuous_injective hf.continuous hf.inj
#align embedding.discrete_topology Embedding.discreteTopology
end Embedding
@@ -276,7 +276,7 @@ def QuotientMap {α : Type*} {β : Type*} [tα : TopologicalSpace α] [tβ : Top
theorem quotientMap_iff [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
QuotientMap f ↔ Surjective f ∧ ∀ s : Set β, IsOpen s ↔ IsOpen (f ⁻¹' s) :=
- and_congr Iff.rfl topologicalSpace_eq_iff
+ and_congr Iff.rfl TopologicalSpace.ext_iff
#align quotient_map_iff quotientMap_iff
theorem quotientMap_iff_closed [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -49,7 +49,7 @@ open Set Filter Function
open TopologicalSpace Topology Filter
-variable {α : Type _} {β : Type _} {γ : Type _} {δ : Type _}
+variable {α : Type*} {β : Type*} {γ : Type*} {δ : Type*}
section Inducing
@@ -118,7 +118,7 @@ theorem Inducing.image_mem_nhdsWithin {f : α → β} (hf : Inducing f) {a : α}
hf.map_nhds_eq a ▸ image_mem_map hs
#align inducing.image_mem_nhds_within Inducing.image_mem_nhdsWithin
-theorem Inducing.tendsto_nhds_iff {ι : Type _} {f : ι → β} {g : β → γ} {a : Filter ι} {b : β}
+theorem Inducing.tendsto_nhds_iff {ι : Type*} {f : ι → β} {g : β → γ} {a : Filter ι} {b : β}
(hg : Inducing g) : Tendsto f a (𝓝 b) ↔ Tendsto (g ∘ f) a (𝓝 (g b)) := by
rw [hg.nhds_eq_comap, tendsto_comap_iff]
#align inducing.tendsto_nhds_iff Inducing.tendsto_nhds_iff
@@ -237,7 +237,7 @@ theorem Embedding.map_nhds_of_mem {f : α → β} (hf : Embedding f) (a : α) (h
hf.1.map_nhds_of_mem a h
#align embedding.map_nhds_of_mem Embedding.map_nhds_of_mem
-theorem Embedding.tendsto_nhds_iff {ι : Type _} {f : ι → β} {g : β → γ} {a : Filter ι} {b : β}
+theorem Embedding.tendsto_nhds_iff {ι : Type*} {f : ι → β} {g : β → γ} {a : Filter ι} {b : β}
(hg : Embedding g) : Tendsto f a (𝓝 b) ↔ Tendsto (g ∘ f) a (𝓝 (g b)) :=
hg.toInducing.tendsto_nhds_iff
#align embedding.tendsto_nhds_iff Embedding.tendsto_nhds_iff
@@ -258,7 +258,7 @@ theorem Embedding.closure_eq_preimage_closure_image {e : α → β} (he : Embedd
/-- The topology induced under an inclusion `f : X → Y` from the discrete topological space `Y`
is the discrete topology on `X`. -/
-theorem Embedding.discreteTopology {X Y : Type _} [TopologicalSpace X] [tY : TopologicalSpace Y]
+theorem Embedding.discreteTopology {X Y : Type*} [TopologicalSpace X] [tY : TopologicalSpace Y]
[DiscreteTopology Y] {f : X → Y} (hf : Embedding f) : DiscreteTopology X :=
discreteTopology_iff_nhds.2 fun x => by
rw [hf.nhds_eq_comap, nhds_discrete, comap_pure, ← image_singleton, hf.inj.preimage_image,
@@ -269,7 +269,7 @@ end Embedding
/-- A function between topological spaces is a quotient map if it is surjective,
and for all `s : Set β`, `s` is open iff its preimage is an open set. -/
-def QuotientMap {α : Type _} {β : Type _} [tα : TopologicalSpace α] [tβ : TopologicalSpace β]
+def QuotientMap {α : Type*} {β : Type*} [tα : TopologicalSpace α] [tβ : TopologicalSpace β]
(f : α → β) : Prop :=
Surjective f ∧ tβ = tα.coinduced f
#align quotient_map QuotientMap
@@ -594,7 +594,7 @@ theorem OpenEmbedding.open_iff_image_open {f : α → β} (hf : OpenEmbedding f)
apply preimage_image_eq _ hf.inj⟩
#align open_embedding.open_iff_image_open OpenEmbedding.open_iff_image_open
-theorem OpenEmbedding.tendsto_nhds_iff {ι : Type _} {f : ι → β} {g : β → γ} {a : Filter ι} {b : β}
+theorem OpenEmbedding.tendsto_nhds_iff {ι : Type*} {f : ι → β} {g : β → γ} {a : Filter ι} {b : β}
(hg : OpenEmbedding g) : Tendsto f a (𝓝 b) ↔ Tendsto (g ∘ f) a (𝓝 (g b)) :=
hg.toEmbedding.tendsto_nhds_iff
#align open_embedding.tendsto_nhds_iff OpenEmbedding.tendsto_nhds_iff
@@ -676,7 +676,7 @@ structure ClosedEmbedding (f : α → β) extends Embedding f : Prop where
variable {f : α → β}
-theorem ClosedEmbedding.tendsto_nhds_iff {ι : Type _} {g : ι → α} {a : Filter ι} {b : α}
+theorem ClosedEmbedding.tendsto_nhds_iff {ι : Type*} {g : ι → α} {a : Filter ι} {b : α}
(hf : ClosedEmbedding f) : Tendsto g a (𝓝 b) ↔ Tendsto (f ∘ g) a (𝓝 (f b)) :=
hf.toEmbedding.tendsto_nhds_iff
#align closed_embedding.tendsto_nhds_iff ClosedEmbedding.tendsto_nhds_iff
@@ -538,11 +538,34 @@ theorem isClosedMap_iff_closure_image [TopologicalSpace α] [TopologicalSpace β
_ = f '' c := by rw [hc.closure_eq]⟩
#align is_closed_map_iff_closure_image isClosedMap_iff_closure_image
+/-- A map `f : X → Y` is closed if and only if for all sets `s`, any cluster point of `f '' s` is
+the image by `f` of some cluster point of `s`.
+If you require this for all filters instead of just principal filters, and also that `f` is
+continuous, you get the notion of **proper map**. See `isProperMap_iff_clusterPt`. -/
theorem isClosedMap_iff_clusterPt [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
IsClosedMap f ↔ ∀ s y, MapClusterPt y (𝓟 s) f → ∃ x, f x = y ∧ ClusterPt x (𝓟 s) := by
simp [MapClusterPt, isClosedMap_iff_closure_image, subset_def, mem_closure_iff_clusterPt,
and_comm]
+theorem IsClosedMap.closure_image_eq_of_continuous [TopologicalSpace α] [TopologicalSpace β]
+ {f : α → β} (f_closed : IsClosedMap f) (f_cont : Continuous f) (s : Set α) :
+ closure (f '' s) = f '' closure s :=
+ subset_antisymm (f_closed.closure_image_subset s) (image_closure_subset_closure_image f_cont)
+
+theorem IsClosedMap.lift'_closure_map_eq [TopologicalSpace α] [TopologicalSpace β]
+ {f : α → β} (f_closed : IsClosedMap f) (f_cont : Continuous f) (F : Filter α) :
+ (map f F).lift' closure = map f (F.lift' closure) := by
+ rw [map_lift'_eq2 (monotone_closure β), map_lift'_eq (monotone_closure α)]
+ congr
+ ext s : 1
+ exact f_closed.closure_image_eq_of_continuous f_cont s
+
+theorem IsClosedMap.mapClusterPt_iff_lift'_closure [TopologicalSpace α] [TopologicalSpace β]
+ {F : Filter α} {f : α → β} (f_closed : IsClosedMap f) (f_cont : Continuous f) {y : β} :
+ MapClusterPt y F f ↔ ((F.lift' closure) ⊓ 𝓟 (f ⁻¹' {y})).NeBot := by
+ rw [MapClusterPt, clusterPt_iff_lift'_closure', f_closed.lift'_closure_map_eq f_cont,
+ ← comap_principal, ← map_neBot_iff f, Filter.push_pull, principal_singleton]
+
section OpenEmbedding
variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ]
@@ -702,8 +725,7 @@ theorem ClosedEmbedding.comp {g : β → γ} {f : α → β} (hg : ClosedEmbeddi
theorem ClosedEmbedding.closure_image_eq {f : α → β} (hf : ClosedEmbedding f) (s : Set α) :
closure (f '' s) = f '' closure s :=
- (hf.isClosedMap.closure_image_subset _).antisymm
- (image_closure_subset_closure_image hf.continuous)
+ hf.isClosedMap.closure_image_eq_of_continuous hf.continuous s
#align closed_embedding.closure_image_eq ClosedEmbedding.closure_image_eq
end ClosedEmbedding
@@ -538,6 +538,11 @@ theorem isClosedMap_iff_closure_image [TopologicalSpace α] [TopologicalSpace β
_ = f '' c := by rw [hc.closure_eq]⟩
#align is_closed_map_iff_closure_image isClosedMap_iff_closure_image
+theorem isClosedMap_iff_clusterPt [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
+ IsClosedMap f ↔ ∀ s y, MapClusterPt y (𝓟 s) f → ∃ x, f x = y ∧ ClusterPt x (𝓟 s) := by
+ simp [MapClusterPt, isClosedMap_iff_closure_image, subset_def, mem_closure_iff_clusterPt,
+ and_comm]
+
section OpenEmbedding
variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ]
@@ -2,15 +2,12 @@
Copyright (c) 2017 Johannes Hölzl. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl, Mario Carneiro, Patrick Massot
-
-! This file was ported from Lean 3 source module topology.maps
-! leanprover-community/mathlib commit d91e7f7a7f1c7e9f0e18fdb6bde4f652004c735d
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Topology.Order
import Mathlib.Topology.NhdsSet
+#align_import topology.maps from "leanprover-community/mathlib"@"d91e7f7a7f1c7e9f0e18fdb6bde4f652004c735d"
+
/-!
# Specific classes of maps between topological spaces
@@ -69,7 +69,7 @@ structure Inducing [tα : TopologicalSpace α] [tβ : TopologicalSpace β] (f :
variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ] [TopologicalSpace δ]
theorem inducing_induced (f : α → β) : @Inducing α β (TopologicalSpace.induced f ‹_›) _ f :=
- @Inducing.mk _ _ (TopologicalSpace.induced f ‹_›) _ _ rfl
+ @Inducing.mk _ _ (TopologicalSpace.induced f ‹_›) _ _ rfl
theorem inducing_id : Inducing (@id α) :=
⟨induced_id.symm⟩
@@ -551,7 +551,7 @@ structure OpenEmbedding (f : α → β) extends Embedding f : Prop where
/-- The range of an open embedding is an open set. -/
open_range : IsOpen <| range f
#align open_embedding OpenEmbedding
-#align open_embedding_iff openEmbedding_iff
+#align open_embedding_iff openEmbedding_iff
theorem OpenEmbedding.isOpenMap {f : α → β} (hf : OpenEmbedding f) : IsOpenMap f :=
hf.toEmbedding.toInducing.isOpenMap hf.open_range
ContinuousMap
s is inducing (#5652)
If g : C(β, γ)
is inducing, then fun f : C(α, β) ↦ g.comp f
is inducing.
@@ -175,6 +175,10 @@ theorem Inducing.isOpen_iff {f : α → β} (hf : Inducing f) {s : Set α} :
IsOpen s ↔ ∃ t, IsOpen t ∧ f ⁻¹' t = s := by rw [hf.induced, isOpen_induced_iff]
#align inducing.is_open_iff Inducing.isOpen_iff
+theorem Inducing.setOf_isOpen {f : α → β} (hf : Inducing f) :
+ {s : Set α | IsOpen s} = preimage f '' {t | IsOpen t} :=
+ Set.ext fun _ ↦ hf.isOpen_iff
+
theorem Inducing.dense_iff {f : α → β} (hf : Inducing f) {s : Set α} :
Dense s ↔ ∀ x, f x ∈ closure (f '' s) := by
simp only [Dense, hf.closure_eq_preimage_closure_image, mem_preimage]
Forward-port of leanprover-community/mathlib#19071
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl, Mario Carneiro, Patrick Massot
! This file was ported from Lean 3 source module topology.maps
-! leanprover-community/mathlib commit bcfa726826abd57587355b4b5b7e78ad6527b7e4
+! leanprover-community/mathlib commit d91e7f7a7f1c7e9f0e18fdb6bde4f652004c735d
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -273,11 +273,17 @@ def QuotientMap {α : Type _} {β : Type _} [tα : TopologicalSpace α] [tβ : T
Surjective f ∧ tβ = tα.coinduced f
#align quotient_map QuotientMap
-theorem quotientMap_iff {α β : Type _} [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
+theorem quotientMap_iff [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
QuotientMap f ↔ Surjective f ∧ ∀ s : Set β, IsOpen s ↔ IsOpen (f ⁻¹' s) :=
and_congr Iff.rfl topologicalSpace_eq_iff
#align quotient_map_iff quotientMap_iff
+theorem quotientMap_iff_closed [TopologicalSpace α] [TopologicalSpace β] {f : α → β} :
+ QuotientMap f ↔ Surjective f ∧ ∀ s : Set β, IsClosed s ↔ IsClosed (f ⁻¹' s) :=
+ quotientMap_iff.trans <| Iff.rfl.and <| compl_surjective.forall.trans <| by
+ simp only [isOpen_compl_iff, preimage_compl]
+#align quotient_map_iff_closed quotientMap_iff_closed
+
namespace QuotientMap
variable [TopologicalSpace α] [TopologicalSpace β] [TopologicalSpace γ] [TopologicalSpace δ]
@@ -321,8 +327,8 @@ protected theorem isOpen_preimage (hf : QuotientMap f) {s : Set β} : IsOpen (f
#align quotient_map.is_open_preimage QuotientMap.isOpen_preimage
protected theorem isClosed_preimage (hf : QuotientMap f) {s : Set β} :
- IsClosed (f ⁻¹' s) ↔ IsClosed s := by
- simp only [← isOpen_compl_iff, ← preimage_compl, hf.isOpen_preimage]
+ IsClosed (f ⁻¹' s) ↔ IsClosed s :=
+ ((quotientMap_iff_closed.1 hf).2 s).symm
#align quotient_map.is_closed_preimage QuotientMap.isClosed_preimage
end QuotientMap
@@ -506,6 +512,12 @@ theorem closed_range {f : α → β} (hf : IsClosedMap f) : IsClosed (range f) :
@image_univ _ _ f ▸ hf _ isClosed_univ
#align is_closed_map.closed_range IsClosedMap.closed_range
+theorem to_quotientMap {f : α → β} (hcl : IsClosedMap f) (hcont : Continuous f)
+ (hsurj : Surjective f) : QuotientMap f :=
+ quotientMap_iff_closed.2 ⟨hsurj, fun s =>
+ ⟨fun hs => hs.preimage hcont, fun hs => hsurj.image_preimage s ▸ hcl _ hs⟩⟩
+#align is_closed_map.to_quotient_map IsClosedMap.to_quotientMap
+
end IsClosedMap
theorem Inducing.isClosedMap [TopologicalSpace α] [TopologicalSpace β] {f : α → β} (hf : Inducing f)
fix-comments.py
on all files.@@ -57,8 +57,8 @@ variable {α : Type _} {β : Type _} {γ : Type _} {δ : Type _}
section Inducing
/-- A function `f : α → β` between topological spaces is inducing if the topology on `α` is induced
-by the topology on `β` through `f`, meaning that a set `s : set α` is open iff it is the preimage
-under `f` of some open set `t : set β`. -/
+by the topology on `β` through `f`, meaning that a set `s : Set α` is open iff it is the preimage
+under `f` of some open set `t : Set β`. -/
@[mk_iff inducing_iff]
structure Inducing [tα : TopologicalSpace α] [tβ : TopologicalSpace β] (f : α → β) : Prop where
/-- The topology on the domain is equal to the induced topology. -/
@@ -185,7 +185,7 @@ end Inducing
section Embedding
/-- A function between topological spaces is an embedding if it is injective,
- and for all `s : set α`, `s` is open iff it is the preimage of an open set. -/
+ and for all `s : Set α`, `s` is open iff it is the preimage of an open set. -/
@[mk_iff embedding_iff]
structure Embedding [TopologicalSpace α] [TopologicalSpace β] (f : α → β) extends
Inducing f : Prop where
@@ -267,7 +267,7 @@ theorem Embedding.discreteTopology {X Y : Type _} [TopologicalSpace X] [tY : Top
end Embedding
/-- A function between topological spaces is a quotient map if it is surjective,
- and for all `s : set β`, `s` is open iff its preimage is an open set. -/
+ and for all `s : Set β`, `s` is open iff its preimage is an open set. -/
def QuotientMap {α : Type _} {β : Type _} [tα : TopologicalSpace α] [tβ : TopologicalSpace β]
(f : α → β) : Prop :=
Surjective f ∧ tβ = tα.coinduced f
@@ -327,7 +327,7 @@ protected theorem isClosed_preimage (hf : QuotientMap f) {s : Set β} :
end QuotientMap
-/-- A map `f : α → β` is said to be an *open map*, if the image of any open `U : set α`
+/-- A map `f : α → β` is said to be an *open map*, if the image of any open `U : Set α`
is open in `β`. -/
def IsOpenMap [TopologicalSpace α] [TopologicalSpace β] (f : α → β) :=
∀ U : Set α, IsOpen U → IsOpen (f '' U)
@@ -460,7 +460,7 @@ section IsClosedMap
variable [TopologicalSpace α] [TopologicalSpace β]
-/-- A map `f : α → β` is said to be a *closed map*, if the image of any closed `U : set α`
+/-- A map `f : α → β` is said to be a *closed map*, if the image of any closed `U : Set α`
is closed in `β`. -/
def IsClosedMap (f : α → β) :=
∀ U : Set α, IsClosed U → IsClosed (f '' U)
sSup
/iSup
(#3938)
As discussed on Zulip
supₛ
→ sSup
infₛ
→ sInf
supᵢ
→ iSup
infᵢ
→ iInf
bsupₛ
→ bsSup
binfₛ
→ bsInf
bsupᵢ
→ biSup
binfᵢ
→ biInf
csupₛ
→ csSup
cinfₛ
→ csInf
csupᵢ
→ ciSup
cinfᵢ
→ ciInf
unionₛ
→ sUnion
interₛ
→ sInter
unionᵢ
→ iUnion
interᵢ
→ iInter
bunionₛ
→ bsUnion
binterₛ
→ bsInter
bunionᵢ
→ biUnion
binterᵢ
→ biInter
Co-authored-by: Parcly Taxel <reddeloostw@gmail.com>
@@ -98,7 +98,7 @@ theorem Inducing.nhds_eq_comap {f : α → β} (hf : Inducing f) : ∀ a : α,
theorem Inducing.nhdsSet_eq_comap {f : α → β} (hf : Inducing f) (s : Set α) :
𝓝ˢ s = comap f (𝓝ˢ (f '' s)) := by
- simp only [nhdsSet, supₛ_image, comap_supᵢ, hf.nhds_eq_comap, supᵢ_image]
+ simp only [nhdsSet, sSup_image, comap_iSup, hf.nhds_eq_comap, iSup_image]
#align inducing.nhds_set_eq_comap Inducing.nhdsSet_eq_comap
theorem Inducing.map_nhds_eq {f : α → β} (hf : Inducing f) (a : α) : (𝓝 a).map f = 𝓝[range f] f a :=
This PR fixes two things:
align
statements for definitions and theorems and instances that are separated by two newlines from the relevant declaration (s/\n\n#align/\n#align
). This is often seen in the mathport output after ending calc
blocks.#align
statements. (This was needed for a script I wrote for #3630.)@@ -385,7 +385,6 @@ theorem of_sections {f : α → β}
𝓝 (f x) = map f (map g (𝓝 (f x))) := by rw [map_map, hgf.comp_eq_id, map_id]
_ ≤ map f (𝓝 (g (f x))) := map_mono hgc
_ = map f (𝓝 x) := by rw [hgx]
-
#align is_open_map.of_sections IsOpenMap.of_sections
theorem of_inverse {f : α → β} {f' : β → α} (h : Continuous f') (l_inv : LeftInverse f f')
@@ -385,7 +385,7 @@ theorem of_sections {f : α → β}
𝓝 (f x) = map f (map g (𝓝 (f x))) := by rw [map_map, hgf.comp_eq_id, map_id]
_ ≤ map f (𝓝 (g (f x))) := map_mono hgc
_ = map f (𝓝 x) := by rw [hgx]
-
+
#align is_open_map.of_sections IsOpenMap.of_sections
theorem of_inverse {f : α → β} {f' : β → α} (h : Continuous f') (l_inv : LeftInverse f f')
@@ -559,6 +559,10 @@ theorem OpenEmbedding.tendsto_nhds_iff {ι : Type _} {f : ι → β} {g : β →
hg.toEmbedding.tendsto_nhds_iff
#align open_embedding.tendsto_nhds_iff OpenEmbedding.tendsto_nhds_iff
+theorem OpenEmbedding.tendsto_nhds_iff' {f : α → β} (hf : OpenEmbedding f) {g : β → γ}
+ {l : Filter γ} {a : α} : Tendsto (g ∘ f) (𝓝 a) l ↔ Tendsto g (𝓝 (f a)) l := by
+ rw [Tendsto, ← map_map, hf.map_nhds_eq]; rfl
+
theorem OpenEmbedding.continuous {f : α → β} (hf : OpenEmbedding f) : Continuous f :=
hf.toEmbedding.continuous
#align open_embedding.continuous OpenEmbedding.continuous
@@ -110,6 +110,12 @@ theorem Inducing.map_nhds_of_mem {f : α → β} (hf : Inducing f) (a : α) (h :
hf.induced.symm ▸ map_nhds_induced_of_mem h
#align inducing.map_nhds_of_mem Inducing.map_nhds_of_mem
+-- porting note: new lemma
+theorem Inducing.mapClusterPt_iff {f : α → β} (hf : Inducing f) {a : α} {l : Filter α} :
+ MapClusterPt (f a) l f ↔ ClusterPt a l := by
+ delta MapClusterPt ClusterPt
+ rw [← Filter.push_pull', ← hf.nhds_eq_comap, map_neBot_iff]
+
theorem Inducing.image_mem_nhdsWithin {f : α → β} (hf : Inducing f) {a : α} {s : Set α}
(hs : s ∈ 𝓝 a) : f '' s ∈ 𝓝[range f] f a :=
hf.map_nhds_eq a ▸ image_mem_map hs
The unported dependencies are