Theorem: QuotientMap.continuous_lift_prod_left
File: Mathlib/Topology/CompactOpen.lean

tactic: let Gf : C(X₀, C(Y, Z)) := ContinuousMap.curry ⟨_, hg⟩
state_before: X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.1, p.2)
⊢ Continuous g
state_after: X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.1, p.2)
Gf : C(X₀, C(Y, Z)) := { toFun := fun p => g (f p.1, p.2), continuous_toFun := hg }.curry
⊢ Continuous g

tactic: have h : ∀ x : X, Continuous fun y => g (x, y) := by
  intro x
  obtain ⟨x₀, rfl⟩ := hf.surjective x
  exact (Gf x₀).continuous
state_before: X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.1, p.2)
Gf : C(X₀, C(Y, Z)) := { toFun := fun p => g (f p.1, p.2), continuous_toFun := hg }.curry
⊢ Continuous g
state_after: X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.1, p.2)
Gf : C(X₀, C(Y, Z)) := { toFun := fun p => g (f p.1, p.2), continuous_toFun := hg }.curry
h : ∀ (x : X), Continuous fun y => g (x, y)
⊢ Continuous g

tactic: let G : X → C(Y, Z) := fun x => ⟨_, h x⟩
state_before: X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.1, p.2)
Gf : C(X₀, C(Y, Z)) := { toFun := fun p => g (f p.1, p.2), continuous_toFun := hg }.curry
h : ∀ (x : X), Continuous fun y => g (x, y)
⊢ Continuous g
state_after: X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.1, p.2)
Gf : C(X₀, C(Y, Z)) := { toFun := fun p => g (f p.1, p.2), continuous_toFun := hg }.curry
h : ∀ (x : X), Continuous fun y => g (x, y)
G : X → C(Y, Z) := fun x => { toFun := fun y => g (x, y), continuous_toFun := ⋯ }
⊢ Continuous g

tactic: have : Continuous G := by
  rw [hf.continuous_iff]
  exact Gf.continuous
state_before: X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.1, p.2)
Gf : C(X₀, C(Y, Z)) := { toFun := fun p => g (f p.1, p.2), continuous_toFun := hg }.curry
h : ∀ (x : X), Continuous fun y => g (x, y)
G : X → C(Y, Z) := fun x => { toFun := fun y => g (x, y), continuous_toFun := ⋯ }
⊢ Continuous g
state_after: X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.1, p.2)
Gf : C(X₀, C(Y, Z)) := { toFun := fun p => g (f p.1, p.2), continuous_toFun := hg }.curry
h : ∀ (x : X), Continuous fun y => g (x, y)
G : X → C(Y, Z) := fun x => { toFun := fun y => g (x, y), continuous_toFun := ⋯ }
this : Continuous G
⊢ Continuous g

tactic: exact ContinuousMap.continuous_uncurry_of_continuous ⟨G, this⟩
state_before: X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.1, p.2)
Gf : C(X₀, C(Y, Z)) := { toFun := fun p => g (f p.1, p.2), continuous_toFun := hg }.curry
h : ∀ (x : X), Continuous fun y => g (x, y)
G : X → C(Y, Z) := fun x => { toFun := fun y => g (x, y), continuous_toFun := ⋯ }
this : Continuous G
⊢ Continuous g
state_after: no goals

tactic: intro x
state_before: X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.1, p.2)
Gf : C(X₀, C(Y, Z)) := { toFun := fun p => g (f p.1, p.2), continuous_toFun := hg }.curry
⊢ ∀ (x : X), Continuous fun y => g (x, y)
state_after: X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.1, p.2)
Gf : C(X₀, C(Y, Z)) := { toFun := fun p => g (f p.1, p.2), continuous_toFun := hg }.curry
x : X
⊢ Continuous fun y => g (x, y)

tactic: obtain ⟨x₀, rfl⟩ := hf.surjective x
state_before: X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.1, p.2)
Gf : C(X₀, C(Y, Z)) := { toFun := fun p => g (f p.1, p.2), continuous_toFun := hg }.curry
x : X
⊢ Continuous fun y => g (x, y)
state_after: case intro
X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.1, p.2)
Gf : C(X₀, C(Y, Z)) := { toFun := fun p => g (f p.1, p.2), continuous_toFun := hg }.curry
x₀ : X₀
⊢ Continuous fun y => g (f x₀, y)

tactic: exact (Gf x₀).continuous
state_before: case intro
X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.1, p.2)
Gf : C(X₀, C(Y, Z)) := { toFun := fun p => g (f p.1, p.2), continuous_toFun := hg }.curry
x₀ : X₀
⊢ Continuous fun y => g (f x₀, y)
state_after: no goals

tactic: rw [hf.continuous_iff]
state_before: X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.1, p.2)
Gf : C(X₀, C(Y, Z)) := { toFun := fun p => g (f p.1, p.2), continuous_toFun := hg }.curry
h : ∀ (x : X), Continuous fun y => g (x, y)
G : X → C(Y, Z) := fun x => { toFun := fun y => g (x, y), continuous_toFun := ⋯ }
⊢ Continuous G
state_after: X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.1, p.2)
Gf : C(X₀, C(Y, Z)) := { toFun := fun p => g (f p.1, p.2), continuous_toFun := hg }.curry
h : ∀ (x : X), Continuous fun y => g (x, y)
G : X → C(Y, Z) := fun x => { toFun := fun y => g (x, y), continuous_toFun := ⋯ }
⊢ Continuous (G ∘ f)

tactic: exact Gf.continuous
state_before: X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.1, p.2)
Gf : C(X₀, C(Y, Z)) := { toFun := fun p => g (f p.1, p.2), continuous_toFun := hg }.curry
h : ∀ (x : X), Continuous fun y => g (x, y)
G : X → C(Y, Z) := fun x => { toFun := fun y => g (x, y), continuous_toFun := ⋯ }
⊢ Continuous (G ∘ f)
state_after: no goals