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

tactic: refine isTopologicalBasis_of_isOpen_of_nhds ?_ fun x U hx hU ↦ ?_
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
hf : IsLocalHomeomorph f
⊢ IsTopologicalBasis {U | ∃ V, IsOpen V ∧ ∃ s, f ∘ ⇑s = Subtype.val ∧ Set.range ⇑s = U}
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
hf : IsLocalHomeomorph f
⊢ ∀ u ∈ {U | ∃ V, IsOpen V ∧ ∃ s, f ∘ ⇑s = Subtype.val ∧ Set.range ⇑s = U}, IsOpen u

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
hf : IsLocalHomeomorph f
x : X
U : Set X
hx : x ∈ U
hU : IsOpen U
⊢ ∃ v ∈ {U | ∃ V, IsOpen V ∧ ∃ s, f ∘ ⇑s = Subtype.val ∧ Set.range ⇑s = U}, x ∈ v ∧ v ⊆ U

tactic: rintro _ ⟨U, hU, s, hs, rfl⟩
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
hf : IsLocalHomeomorph f
⊢ ∀ u ∈ {U | ∃ V, IsOpen V ∧ ∃ s, f ∘ ⇑s = Subtype.val ∧ Set.range ⇑s = U}, IsOpen u
state_after: case refine_1.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
hf : IsLocalHomeomorph f
U : Set Y
hU : IsOpen U
s : C(↑U, X)
hs : f ∘ ⇑s = Subtype.val
⊢ IsOpen (Set.range ⇑s)

tactic: refine (openEmbedding_of_comp hf (hs ▸ ⟨embedding_subtype_val, ?_⟩) s.continuous).isOpen_range
state_before: case refine_1.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
hf : IsLocalHomeomorph f
U : Set Y
hU : IsOpen U
s : C(↑U, X)
hs : f ∘ ⇑s = Subtype.val
⊢ IsOpen (Set.range ⇑s)
state_after: case refine_1.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
hf : IsLocalHomeomorph f
U : Set Y
hU : IsOpen U
s : C(↑U, X)
hs : f ∘ ⇑s = Subtype.val
⊢ IsOpen (Set.range Subtype.val)

tactic: rwa [Subtype.range_val]
state_before: case refine_1.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
hf : IsLocalHomeomorph f
U : Set Y
hU : IsOpen U
s : C(↑U, X)
hs : f ∘ ⇑s = Subtype.val
⊢ IsOpen (Set.range Subtype.val)
state_after: no goals

tactic: obtain ⟨f, hxf, rfl⟩ := hf x
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
hf : IsLocalHomeomorph f
x : X
U : Set X
hx : x ∈ U
hU : IsOpen U
⊢ ∃ v ∈ {U | ∃ V, IsOpen V ∧ ∃ s, f ∘ ⇑s = Subtype.val ∧ Set.range ⇑s = U}, x ∈ v ∧ v ⊆ U
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
s : Set X
t : Set Y
x : X
U : Set X
hx : x ∈ U
hU : IsOpen U
f : PartialHomeomorph X Y
hxf : x ∈ f.source
hf : IsLocalHomeomorph ↑f
⊢ ∃ v ∈ {U | ∃ V, IsOpen V ∧ ∃ s, ↑f ∘ ⇑s = Subtype.val ∧ Set.range ⇑s = U}, x ∈ v ∧ v ⊆ U

tactic: refine ⟨f.source ∩ U, ⟨f.target ∩ f.symm ⁻¹' U, f.symm.isOpen_inter_preimage hU,
  ⟨_, continuousOn_iff_continuous_restrict.mp (f.continuousOn_invFun.mono fun _ h ↦ h.1)⟩,
  ?_, (Set.range_restrict _ _).trans ?_⟩, ⟨hxf, hx⟩, fun _ h ↦ h.2⟩
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
s : Set X
t : Set Y
x : X
U : Set X
hx : x ∈ U
hU : IsOpen U
f : PartialHomeomorph X Y
hxf : x ∈ f.source
hf : IsLocalHomeomorph ↑f
⊢ ∃ v ∈ {U | ∃ V, IsOpen V ∧ ∃ s, ↑f ∘ ⇑s = Subtype.val ∧ Set.range ⇑s = U}, x ∈ v ∧ v ⊆ U
state_after: case refine_2.intro.intro.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
s : Set X
t : Set Y
x : X
U : Set X
hx : x ∈ U
hU : IsOpen U
f : PartialHomeomorph X Y
hxf : x ∈ f.source
hf : IsLocalHomeomorph ↑f
⊢ ↑f ∘ ⇑{ toFun := (f.target ∩ ↑f.symm ⁻¹' U).restrict f.invFun, continuous_toFun := ⋯ } = Subtype.val

case refine_2.intro.intro.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
s : Set X
t : Set Y
x : X
U : Set X
hx : x ∈ U
hU : IsOpen U
f : PartialHomeomorph X Y
hxf : x ∈ f.source
hf : IsLocalHomeomorph ↑f
⊢ f.toPartialEquiv.2 '' (f.target ∩ ↑f.symm ⁻¹' U) = f.source ∩ U

tactic: ext y
state_before: case refine_2.intro.intro.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
s : Set X
t : Set Y
x : X
U : Set X
hx : x ∈ U
hU : IsOpen U
f : PartialHomeomorph X Y
hxf : x ∈ f.source
hf : IsLocalHomeomorph ↑f
⊢ ↑f ∘ ⇑{ toFun := (f.target ∩ ↑f.symm ⁻¹' U).restrict f.invFun, continuous_toFun := ⋯ } = Subtype.val
state_after: case refine_2.intro.intro.refine_1.h
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
s : Set X
t : Set Y
x : X
U : Set X
hx : x ∈ U
hU : IsOpen U
f : PartialHomeomorph X Y
hxf : x ∈ f.source
hf : IsLocalHomeomorph ↑f
y : ↑(f.target ∩ ↑f.symm ⁻¹' U)
⊢ (↑f ∘ ⇑{ toFun := (f.target ∩ ↑f.symm ⁻¹' U).restrict f.invFun, continuous_toFun := ⋯ }) y = ↑y

tactic: exact f.right_inv y.2.1
state_before: case refine_2.intro.intro.refine_1.h
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
g : Y → Z
s : Set X
t : Set Y
x : X
U : Set X
hx : x ∈ U
hU : IsOpen U
f : PartialHomeomorph X Y
hxf : x ∈ f.source
hf : IsLocalHomeomorph ↑f
y : ↑(f.target ∩ ↑f.symm ⁻¹' U)
⊢ (↑f ∘ ⇑{ toFun := (f.target ∩ ↑f.symm ⁻¹' U).restrict f.invFun, continuous_toFun := ⋯ }) y = ↑y
state_after: no goals

tactic: apply (f.symm_image_target_inter_eq _).trans
state_before: case refine_2.intro.intro.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
s : Set X
t : Set Y
x : X
U : Set X
hx : x ∈ U
hU : IsOpen U
f : PartialHomeomorph X Y
hxf : x ∈ f.source
hf : IsLocalHomeomorph ↑f
⊢ f.toPartialEquiv.2 '' (f.target ∩ ↑f.symm ⁻¹' U) = f.source ∩ U
state_after: case refine_2.intro.intro.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
s : Set X
t : Set Y
x : X
U : Set X
hx : x ∈ U
hU : IsOpen U
f : PartialHomeomorph X Y
hxf : x ∈ f.source
hf : IsLocalHomeomorph ↑f
⊢ f.source ∩ ↑f ⁻¹' (f.target ∩ ↑f.symm ⁻¹' U) = f.source ∩ U

tactic: rw [Set.preimage_inter, ← Set.inter_assoc, Set.inter_eq_self_of_subset_left
  f.source_preimage_target, f.source_inter_preimage_inv_preimage]
state_before: case refine_2.intro.intro.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
s : Set X
t : Set Y
x : X
U : Set X
hx : x ∈ U
hU : IsOpen U
f : PartialHomeomorph X Y
hxf : x ∈ f.source
hf : IsLocalHomeomorph ↑f
⊢ f.source ∩ ↑f ⁻¹' (f.target ∩ ↑f.symm ⁻¹' U) = f.source ∩ U
state_after: no goals