Theorem: isLocalHomeomorphOn_iff_openEmbedding_restrict
File: Mathlib/Topology/IsLocalHomeomorph.lean

tactic: refine ⟨fun h x hx ↦ ?_, fun h x hx ↦ ?_⟩
state_before: X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f✝ : X → Y
s : Set X
t : Set Y
f : X → Y
⊢ IsLocalHomeomorphOn f s ↔ ∀ x ∈ s, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f)
state_after: case refine_1
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f✝ : X → Y
s : Set X
t : Set Y
f : X → Y
h : IsLocalHomeomorphOn f s
x : X
hx : x ∈ s
⊢ ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f)

case refine_2
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f✝ : X → Y
s : Set X
t : Set Y
f : X → Y
h : ∀ x ∈ s, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f)
x : X
hx : x ∈ s
⊢ ∃ e, x ∈ e.source ∧ f = ↑e

tactic: obtain ⟨e, hxe, rfl⟩ := h x hx
state_before: case refine_1
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f✝ : X → Y
s : Set X
t : Set Y
f : X → Y
h : IsLocalHomeomorphOn f s
x : X
hx : x ∈ s
⊢ ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f)
state_after: case refine_1.intro.intro
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f : X → Y
s : Set X
t : Set Y
x : X
hx : x ∈ s
e : PartialHomeomorph X Y
hxe : x ∈ e.source
h : IsLocalHomeomorphOn (↑e) s
⊢ ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict ↑e)

tactic: exact ⟨e.source, e.open_source.mem_nhds hxe, e.openEmbedding_restrict⟩
state_before: case refine_1.intro.intro
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f : X → Y
s : Set X
t : Set Y
x : X
hx : x ∈ s
e : PartialHomeomorph X Y
hxe : x ∈ e.source
h : IsLocalHomeomorphOn (↑e) s
⊢ ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict ↑e)
state_after: no goals

tactic: obtain ⟨U, hU, emb⟩ := h x hx
state_before: case refine_2
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f✝ : X → Y
s : Set X
t : Set Y
f : X → Y
h : ∀ x ∈ s, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f)
x : X
hx : x ∈ s
⊢ ∃ e, x ∈ e.source ∧ f = ↑e
state_after: case refine_2.intro.intro
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f✝ : X → Y
s : Set X
t : Set Y
f : X → Y
h : ∀ x ∈ s, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f)
x : X
hx : x ∈ s
U : Set X
hU : U ∈ 𝓝 x
emb : OpenEmbedding (U.restrict f)
⊢ ∃ e, x ∈ e.source ∧ f = ↑e

tactic: have : OpenEmbedding ((interior U).restrict f) := by
  refine emb.comp ⟨embedding_inclusion interior_subset, ?_⟩
  rw [Set.range_inclusion]; exact isOpen_induced isOpen_interior
state_before: case refine_2.intro.intro
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f✝ : X → Y
s : Set X
t : Set Y
f : X → Y
h : ∀ x ∈ s, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f)
x : X
hx : x ∈ s
U : Set X
hU : U ∈ 𝓝 x
emb : OpenEmbedding (U.restrict f)
⊢ ∃ e, x ∈ e.source ∧ f = ↑e
state_after: case refine_2.intro.intro
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f✝ : X → Y
s : Set X
t : Set Y
f : X → Y
h : ∀ x ∈ s, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f)
x : X
hx : x ∈ s
U : Set X
hU : U ∈ 𝓝 x
emb : OpenEmbedding (U.restrict f)
this : OpenEmbedding ((interior U).restrict f)
⊢ ∃ e, x ∈ e.source ∧ f = ↑e

tactic: obtain ⟨cont, inj, openMap⟩ := openEmbedding_iff_continuous_injective_open.mp this
state_before: case refine_2.intro.intro
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f✝ : X → Y
s : Set X
t : Set Y
f : X → Y
h : ∀ x ∈ s, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f)
x : X
hx : x ∈ s
U : Set X
hU : U ∈ 𝓝 x
emb : OpenEmbedding (U.restrict f)
this : OpenEmbedding ((interior U).restrict f)
⊢ ∃ e, x ∈ e.source ∧ f = ↑e
state_after: case refine_2.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f✝ : X → Y
s : Set X
t : Set Y
f : X → Y
h : ∀ x ∈ s, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f)
x : X
hx : x ∈ s
U : Set X
hU : U ∈ 𝓝 x
emb : OpenEmbedding (U.restrict f)
this : OpenEmbedding ((interior U).restrict f)
cont : Continuous ((interior U).restrict f)
inj : Function.Injective ((interior U).restrict f)
openMap : IsOpenMap ((interior U).restrict f)
⊢ ∃ e, x ∈ e.source ∧ f = ↑e

tactic: haveI : Nonempty X := ⟨x⟩
state_before: case refine_2.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f✝ : X → Y
s : Set X
t : Set Y
f : X → Y
h : ∀ x ∈ s, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f)
x : X
hx : x ∈ s
U : Set X
hU : U ∈ 𝓝 x
emb : OpenEmbedding (U.restrict f)
this : OpenEmbedding ((interior U).restrict f)
cont : Continuous ((interior U).restrict f)
inj : Function.Injective ((interior U).restrict f)
openMap : IsOpenMap ((interior U).restrict f)
⊢ ∃ e, x ∈ e.source ∧ f = ↑e
state_after: case refine_2.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f✝ : X → Y
s : Set X
t : Set Y
f : X → Y
h : ∀ x ∈ s, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f)
x : X
hx : x ∈ s
U : Set X
hU : U ∈ 𝓝 x
emb : OpenEmbedding (U.restrict f)
this✝ : OpenEmbedding ((interior U).restrict f)
cont : Continuous ((interior U).restrict f)
inj : Function.Injective ((interior U).restrict f)
openMap : IsOpenMap ((interior U).restrict f)
this : Nonempty X
⊢ ∃ e, x ∈ e.source ∧ f = ↑e

tactic: exact ⟨PartialHomeomorph.ofContinuousOpenRestrict
  (Set.injOn_iff_injective.mpr inj).toPartialEquiv
  (continuousOn_iff_continuous_restrict.mpr cont) openMap isOpen_interior,
  mem_interior_iff_mem_nhds.mpr hU, rfl⟩
state_before: case refine_2.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f✝ : X → Y
s : Set X
t : Set Y
f : X → Y
h : ∀ x ∈ s, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f)
x : X
hx : x ∈ s
U : Set X
hU : U ∈ 𝓝 x
emb : OpenEmbedding (U.restrict f)
this✝ : OpenEmbedding ((interior U).restrict f)
cont : Continuous ((interior U).restrict f)
inj : Function.Injective ((interior U).restrict f)
openMap : IsOpenMap ((interior U).restrict f)
this : Nonempty X
⊢ ∃ e, x ∈ e.source ∧ f = ↑e
state_after: no goals

tactic: refine emb.comp ⟨embedding_inclusion interior_subset, ?_⟩
state_before: X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f✝ : X → Y
s : Set X
t : Set Y
f : X → Y
h : ∀ x ∈ s, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f)
x : X
hx : x ∈ s
U : Set X
hU : U ∈ 𝓝 x
emb : OpenEmbedding (U.restrict f)
⊢ OpenEmbedding ((interior U).restrict f)
state_after: X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f✝ : X → Y
s : Set X
t : Set Y
f : X → Y
h : ∀ x ∈ s, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f)
x : X
hx : x ∈ s
U : Set X
hU : U ∈ 𝓝 x
emb : OpenEmbedding (U.restrict f)
⊢ IsOpen (Set.range (Set.inclusion ⋯))

tactic: rw [Set.range_inclusion]
state_before: X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f✝ : X → Y
s : Set X
t : Set Y
f : X → Y
h : ∀ x ∈ s, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f)
x : X
hx : x ∈ s
U : Set X
hU : U ∈ 𝓝 x
emb : OpenEmbedding (U.restrict f)
⊢ IsOpen (Set.range (Set.inclusion ⋯))
state_after: X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f✝ : X → Y
s : Set X
t : Set Y
f : X → Y
h : ∀ x ∈ s, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f)
x : X
hx : x ∈ s
U : Set X
hU : U ∈ 𝓝 x
emb : OpenEmbedding (U.restrict f)
⊢ IsOpen {x | ↑x ∈ interior U}

tactic: exact isOpen_induced isOpen_interior
state_before: X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
f✝ : X → Y
s : Set X
t : Set Y
f : X → Y
h : ∀ x ∈ s, ∃ U ∈ 𝓝 x, OpenEmbedding (U.restrict f)
x : X
hx : x ∈ s
U : Set X
hU : U ∈ 𝓝 x
emb : OpenEmbedding (U.restrict f)
⊢ IsOpen {x | ↑x ∈ interior U}
state_after: no goals