l3lab/ntp-mathlib huggingface dataset:
variable (A X) in
/--
Giving a continuous map out of a disjoint union is the same as giving a continuous map out of
each term
-/
@[simps]
def piEquiv : (∀ i, C(A, X i)) ≃ C(A, ∀ i, X i) where
  toFun := pi
  invFun f i := (eval i).comp f
  left_inv := by 

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁶ : TopologicalSpace α
inst✝⁵ : TopologicalSpace β
inst✝⁴ : TopologicalSpace γ
inst✝³ : TopologicalSpace δ
f g : C(α, β)
I : Type u_5
A : Type u_6
X : I → Type u_7
Y : I → Type u_8
inst✝² : TopologicalSpace A
inst✝¹ : (i : I) → TopologicalSpace (X i)
inst✝ : (i : I) → TopologicalSpace (Y i)
⊢ LeftInverse (fun f i => comp (eval i) f) pi

Next tactic:
intro
variable (A X) in
/--
Giving a continuous map out of a disjoint union is the same as giving a continuous map out of
each term
-/
@[simps]
def piEquiv : (∀ i, C(A, X i)) ≃ C(A, ∀ i, X i) where
  toFun := pi
  invFun f i := (eval i).comp f
  left_inv := by intro; 

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁶ : TopologicalSpace α
inst✝⁵ : TopologicalSpace β
inst✝⁴ : TopologicalSpace γ
inst✝³ : TopologicalSpace δ
f g : C(α, β)
I : Type u_5
A : Type u_6
X : I → Type u_7
Y : I → Type u_8
inst✝² : TopologicalSpace A
inst✝¹ : (i : I) → TopologicalSpace (X i)
inst✝ : (i : I) → TopologicalSpace (Y i)
x✝ : (i : I) → C(A, X i)
⊢ (fun f i => comp (eval i) f) (pi x✝) = x✝

Next tactic:
ext
variable (A X) in
/--
Giving a continuous map out of a disjoint union is the same as giving a continuous map out of
each term
-/
@[simps]
def piEquiv : (∀ i, C(A, X i)) ≃ C(A, ∀ i, X i) where
  toFun := pi
  invFun f i := (eval i).comp f
  left_inv := by intro; ext; 

Proof state:
case h.h
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁶ : TopologicalSpace α
inst✝⁵ : TopologicalSpace β
inst✝⁴ : TopologicalSpace γ
inst✝³ : TopologicalSpace δ
f g : C(α, β)
I : Type u_5
A : Type u_6
X : I → Type u_7
Y : I → Type u_8
inst✝² : TopologicalSpace A
inst✝¹ : (i : I) → TopologicalSpace (X i)
inst✝ : (i : I) → TopologicalSpace (Y i)
x✝¹ : (i : I) → C(A, X i)
x✝ : I
a✝ : A
⊢ ((fun f i => comp (eval i) f) (pi x✝¹) x✝) a✝ = (x✝¹ x✝) a✝

Next tactic:
simp [pi]
variable (A X) in
/--
Giving a continuous map out of a disjoint union is the same as giving a continuous map out of
each term
-/
@[simps]
def piEquiv : (∀ i, C(A, X i)) ≃ C(A, ∀ i, X i) where
  toFun := pi
  invFun f i := (eval i).comp f
  left_inv := by intro; ext; simp [pi]
  right_inv := by 

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁶ : TopologicalSpace α
inst✝⁵ : TopologicalSpace β
inst✝⁴ : TopologicalSpace γ
inst✝³ : TopologicalSpace δ
f g : C(α, β)
I : Type u_5
A : Type u_6
X : I → Type u_7
Y : I → Type u_8
inst✝² : TopologicalSpace A
inst✝¹ : (i : I) → TopologicalSpace (X i)
inst✝ : (i : I) → TopologicalSpace (Y i)
⊢ Function.RightInverse (fun f i => comp (eval i) f) pi

Next tactic:
intro
variable (A X) in
/--
Giving a continuous map out of a disjoint union is the same as giving a continuous map out of
each term
-/
@[simps]
def piEquiv : (∀ i, C(A, X i)) ≃ C(A, ∀ i, X i) where
  toFun := pi
  invFun f i := (eval i).comp f
  left_inv := by intro; ext; simp [pi]
  right_inv := by intro; 

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁶ : TopologicalSpace α
inst✝⁵ : TopologicalSpace β
inst✝⁴ : TopologicalSpace γ
inst✝³ : TopologicalSpace δ
f g : C(α, β)
I : Type u_5
A : Type u_6
X : I → Type u_7
Y : I → Type u_8
inst✝² : TopologicalSpace A
inst✝¹ : (i : I) → TopologicalSpace (X i)
inst✝ : (i : I) → TopologicalSpace (Y i)
x✝ : C(A, (i : I) → X i)
⊢ pi ((fun f i => comp (eval i) f) x✝) = x✝

Next tactic:
ext
variable (A X) in
/--
Giving a continuous map out of a disjoint union is the same as giving a continuous map out of
each term
-/
@[simps]
def piEquiv : (∀ i, C(A, X i)) ≃ C(A, ∀ i, X i) where
  toFun := pi
  invFun f i := (eval i).comp f
  left_inv := by intro; ext; simp [pi]
  right_inv := by intro; ext; 

Proof state:
case h.h
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝⁶ : TopologicalSpace α
inst✝⁵ : TopologicalSpace β
inst✝⁴ : TopologicalSpace γ
inst✝³ : TopologicalSpace δ
f g : C(α, β)
I : Type u_5
A : Type u_6
X : I → Type u_7
Y : I → Type u_8
inst✝² : TopologicalSpace A
inst✝¹ : (i : I) → TopologicalSpace (X i)
inst✝ : (i : I) → TopologicalSpace (Y i)
x✝¹ : C(A, (i : I) → X i)
a✝ : A
x✝ : I
⊢ (pi ((fun f i => comp (eval i) f) x✝¹)) a✝ x✝ = x✝¹ a✝ x✝

Next tactic:
simp [pi]
/-- A family `φ i` of continuous maps `C(S i, β)`, where the domains `S i` contain a neighbourhood
of each point in `α` and the functions `φ i` agree pairwise on intersections, can be glued to
construct a continuous map in `C(α, β)`. -/
noncomputable def liftCover : C(α, β) :=
  haveI H : ⋃ i, S i = Set.univ :=
    Set.iUnion_eq_univ_iff.2 fun x ↦ (hS x).imp fun _ ↦ mem_of_mem_nhds
  mk (Set.liftCover S (fun i ↦ φ i) hφ H) <| continuous_of_cover_nhds hS fun i ↦ by
    

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
inst✝ : TopologicalSpace δ
f g : C(α, β)
ι : Type u_5
S : ι → Set α
φ : (i : ι) → C(↑(S i), β)
hφ :
  ∀ (i j : ι) (x : α) (hxi : x ∈ S i) (hxj : x ∈ S j),
    (φ i) { val := x, property := hxi } = (φ j) { val := x, property := hxj }
hS : ∀ (x : α), ∃ i, S i ∈ nhds x
H : ⋃ i, S i = Set.univ
i : ι
⊢ ContinuousOn (Set.liftCover S (fun i => ⇑(φ i)) hφ H) (S i)

Next tactic:
rw [continuousOn_iff_continuous_restrict]
/-- A family `φ i` of continuous maps `C(S i, β)`, where the domains `S i` contain a neighbourhood
of each point in `α` and the functions `φ i` agree pairwise on intersections, can be glued to
construct a continuous map in `C(α, β)`. -/
noncomputable def liftCover : C(α, β) :=
  haveI H : ⋃ i, S i = Set.univ :=
    Set.iUnion_eq_univ_iff.2 fun x ↦ (hS x).imp fun _ ↦ mem_of_mem_nhds
  mk (Set.liftCover S (fun i ↦ φ i) hφ H) <| continuous_of_cover_nhds hS fun i ↦ by
    rw [continuousOn_iff_continuous_restrict]
    

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
inst✝ : TopologicalSpace δ
f g : C(α, β)
ι : Type u_5
S : ι → Set α
φ : (i : ι) → C(↑(S i), β)
hφ :
  ∀ (i j : ι) (x : α) (hxi : x ∈ S i) (hxj : x ∈ S j),
    (φ i) { val := x, property := hxi } = (φ j) { val := x, property := hxj }
hS : ∀ (x : α), ∃ i, S i ∈ nhds x
H : ⋃ i, S i = Set.univ
i : ι
⊢ Continuous (Set.restrict (S i) (Set.liftCover S (fun i => ⇑(φ i)) hφ H))

Next tactic:
simpa (config := { unfoldPartialApp := true }) only [Set.restrict, Set.liftCover_coe] using
      (φ i).continuous
@[simp]
theorem liftCover_coe {i : ι} (x : S i) : liftCover S φ hφ hS x = φ i x := by
  

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
inst✝ : TopologicalSpace δ
f g : C(α, β)
ι : Type u_5
S : ι → Set α
φ : (i : ι) → C(↑(S i), β)
hφ :
  ∀ (i j : ι) (x : α) (hxi : x ∈ S i) (hxj : x ∈ S j),
    (φ i) { val := x, property := hxi } = (φ j) { val := x, property := hxj }
hS : ∀ (x : α), ∃ i, S i ∈ nhds x
i : ι
x : ↑(S i)
⊢ (liftCover S φ hφ hS) ↑x = (φ i) x

Next tactic:
rw [liftCover, coe_mk, Set.liftCover_coe _]
theorem liftCover_restrict {i : ι} : (liftCover S φ hφ hS).restrict (S i) = φ i := by
  

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
inst✝ : TopologicalSpace δ
f g : C(α, β)
ι : Type u_5
S : ι → Set α
φ : (i : ι) → C(↑(S i), β)
hφ :
  ∀ (i j : ι) (x : α) (hxi : x ∈ S i) (hxj : x ∈ S j),
    (φ i) { val := x, property := hxi } = (φ j) { val := x, property := hxj }
hS : ∀ (x : α), ∃ i, S i ∈ nhds x
i : ι
⊢ restrict (S i) (liftCover S φ hφ hS) = φ i

Next tactic:
ext
theorem liftCover_restrict {i : ι} : (liftCover S φ hφ hS).restrict (S i) = φ i := by
  ext
  

Proof state:
case h
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
inst✝ : TopologicalSpace δ
f g : C(α, β)
ι : Type u_5
S : ι → Set α
φ : (i : ι) → C(↑(S i), β)
hφ :
  ∀ (i j : ι) (x : α) (hxi : x ∈ S i) (hxj : x ∈ S j),
    (φ i) { val := x, property := hxi } = (φ j) { val := x, property := hxj }
hS : ∀ (x : α), ∃ i, S i ∈ nhds x
i : ι
a✝ : ↑(S i)
⊢ (restrict (S i) (liftCover S φ hφ hS)) a✝ = (φ i) a✝

Next tactic:
simp only [coe_restrict, Function.comp_apply, liftCover_coe]
/-- A family `F s` of continuous maps `C(s, β)`, where (1) the domains `s` are taken from a set `A`
of sets in `α` which contain a neighbourhood of each point in `α` and (2) the functions `F s` agree
pairwise on intersections, can be glued to construct a continuous map in `C(α, β)`. -/
noncomputable def liftCover' : C(α, β) := by
  

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
inst✝ : TopologicalSpace δ
f g : C(α, β)
ι : Type u_5
S : ι → Set α
φ : (i : ι) → C(↑(S i), β)
hφ :
  ∀ (i j : ι) (x : α) (hxi : x ∈ S i) (hxj : x ∈ S j),
    (φ i) { val := x, property := hxi } = (φ j) { val := x, property := hxj }
hS : ∀ (x : α), ∃ i, S i ∈ nhds x
A : Set (Set α)
F : (s : Set α) → s ∈ A → C(↑s, β)
hF :
  ∀ (s : Set α) (hs : s ∈ A) (t : Set α) (ht : t ∈ A) (x : α) (hxi : x ∈ s) (hxj : x ∈ t),
    (F s hs) { val := x, property := hxi } = (F t ht) { val := x, property := hxj }
hA : ∀ (x : α), ∃ i ∈ A, i ∈ nhds x
⊢ C(α, β)

Next tactic:
let S : A → Set α := (↑)
/-- A family `F s` of continuous maps `C(s, β)`, where (1) the domains `s` are taken from a set `A`
of sets in `α` which contain a neighbourhood of each point in `α` and (2) the functions `F s` agree
pairwise on intersections, can be glued to construct a continuous map in `C(α, β)`. -/
noncomputable def liftCover' : C(α, β) := by
  let S : A → Set α := (↑)
  

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
inst✝ : TopologicalSpace δ
f g : C(α, β)
ι : Type u_5
S✝ : ι → Set α
φ : (i : ι) → C(↑(S✝ i), β)
hφ :
  ∀ (i j : ι) (x : α) (hxi : x ∈ S✝ i) (hxj : x ∈ S✝ j),
    (φ i) { val := x, property := hxi } = (φ j) { val := x, property := hxj }
hS : ∀ (x : α), ∃ i, S✝ i ∈ nhds x
A : Set (Set α)
F : (s : Set α) → s ∈ A → C(↑s, β)
hF :
  ∀ (s : Set α) (hs : s ∈ A) (t : Set α) (ht : t ∈ A) (x : α) (hxi : x ∈ s) (hxj : x ∈ t),
    (F s hs) { val := x, property := hxi } = (F t ht) { val := x, property := hxj }
hA : ∀ (x : α), ∃ i ∈ A, i ∈ nhds x
S : ↑A → Set α := Subtype.val
⊢ C(α, β)

Next tactic:
let F : ∀ i : A, C(i, β) := fun i => F i i.prop
/-- A family `F s` of continuous maps `C(s, β)`, where (1) the domains `s` are taken from a set `A`
of sets in `α` which contain a neighbourhood of each point in `α` and (2) the functions `F s` agree
pairwise on intersections, can be glued to construct a continuous map in `C(α, β)`. -/
noncomputable def liftCover' : C(α, β) := by
  let S : A → Set α := (↑)
  let F : ∀ i : A, C(i, β) := fun i => F i i.prop
  

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
inst✝ : TopologicalSpace δ
f g : C(α, β)
ι : Type u_5
S✝ : ι → Set α
φ : (i : ι) → C(↑(S✝ i), β)
hφ :
  ∀ (i j : ι) (x : α) (hxi : x ∈ S✝ i) (hxj : x ∈ S✝ j),
    (φ i) { val := x, property := hxi } = (φ j) { val := x, property := hxj }
hS : ∀ (x : α), ∃ i, S✝ i ∈ nhds x
A : Set (Set α)
F✝ : (s : Set α) → s ∈ A → C(↑s, β)
hF :
  ∀ (s : Set α) (hs : s ∈ A) (t : Set α) (ht : t ∈ A) (x : α) (hxi : x ∈ s) (hxj : x ∈ t),
    (F✝ s hs) { val := x, property := hxi } = (F✝ t ht) { val := x, property := hxj }
hA : ∀ (x : α), ∃ i ∈ A, i ∈ nhds x
S : ↑A → Set α := Subtype.val
F : (i : ↑A) → C(↑↑i, β) := fun i => F✝ ↑i (_ : ↑i ∈ A)
⊢ C(α, β)

Next tactic:
refine' liftCover S F (fun i j => hF i i.prop j j.prop) _
/-- A family `F s` of continuous maps `C(s, β)`, where (1) the domains `s` are taken from a set `A`
of sets in `α` which contain a neighbourhood of each point in `α` and (2) the functions `F s` agree
pairwise on intersections, can be glued to construct a continuous map in `C(α, β)`. -/
noncomputable def liftCover' : C(α, β) := by
  let S : A → Set α := (↑)
  let F : ∀ i : A, C(i, β) := fun i => F i i.prop
  refine' liftCover S F (fun i j => hF i i.prop j j.prop) _
  

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
inst✝ : TopologicalSpace δ
f g : C(α, β)
ι : Type u_5
S✝ : ι → Set α
φ : (i : ι) → C(↑(S✝ i), β)
hφ :
  ∀ (i j : ι) (x : α) (hxi : x ∈ S✝ i) (hxj : x ∈ S✝ j),
    (φ i) { val := x, property := hxi } = (φ j) { val := x, property := hxj }
hS : ∀ (x : α), ∃ i, S✝ i ∈ nhds x
A : Set (Set α)
F✝ : (s : Set α) → s ∈ A → C(↑s, β)
hF :
  ∀ (s : Set α) (hs : s ∈ A) (t : Set α) (ht : t ∈ A) (x : α) (hxi : x ∈ s) (hxj : x ∈ t),
    (F✝ s hs) { val := x, property := hxi } = (F✝ t ht) { val := x, property := hxj }
hA : ∀ (x : α), ∃ i ∈ A, i ∈ nhds x
S : ↑A → Set α := Subtype.val
F : (i : ↑A) → C(↑↑i, β) := fun i => F✝ ↑i (_ : ↑i ∈ A)
⊢ ∀ (x : α), ∃ i, S i ∈ nhds x

Next tactic:
intro x
/-- A family `F s` of continuous maps `C(s, β)`, where (1) the domains `s` are taken from a set `A`
of sets in `α` which contain a neighbourhood of each point in `α` and (2) the functions `F s` agree
pairwise on intersections, can be glued to construct a continuous map in `C(α, β)`. -/
noncomputable def liftCover' : C(α, β) := by
  let S : A → Set α := (↑)
  let F : ∀ i : A, C(i, β) := fun i => F i i.prop
  refine' liftCover S F (fun i j => hF i i.prop j j.prop) _
  intro x
  

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
inst✝ : TopologicalSpace δ
f g : C(α, β)
ι : Type u_5
S✝ : ι → Set α
φ : (i : ι) → C(↑(S✝ i), β)
hφ :
  ∀ (i j : ι) (x : α) (hxi : x ∈ S✝ i) (hxj : x ∈ S✝ j),
    (φ i) { val := x, property := hxi } = (φ j) { val := x, property := hxj }
hS : ∀ (x : α), ∃ i, S✝ i ∈ nhds x
A : Set (Set α)
F✝ : (s : Set α) → s ∈ A → C(↑s, β)
hF :
  ∀ (s : Set α) (hs : s ∈ A) (t : Set α) (ht : t ∈ A) (x : α) (hxi : x ∈ s) (hxj : x ∈ t),
    (F✝ s hs) { val := x, property := hxi } = (F✝ t ht) { val := x, property := hxj }
hA : ∀ (x : α), ∃ i ∈ A, i ∈ nhds x
S : ↑A → Set α := Subtype.val
F : (i : ↑A) → C(↑↑i, β) := fun i => F✝ ↑i (_ : ↑i ∈ A)
x : α
⊢ ∃ i, S i ∈ nhds x

Next tactic:
obtain ⟨s, hs, hsx⟩ := hA x
/-- A family `F s` of continuous maps `C(s, β)`, where (1) the domains `s` are taken from a set `A`
of sets in `α` which contain a neighbourhood of each point in `α` and (2) the functions `F s` agree
pairwise on intersections, can be glued to construct a continuous map in `C(α, β)`. -/
noncomputable def liftCover' : C(α, β) := by
  let S : A → Set α := (↑)
  let F : ∀ i : A, C(i, β) := fun i => F i i.prop
  refine' liftCover S F (fun i j => hF i i.prop j j.prop) _
  intro x
  obtain ⟨s, hs, hsx⟩ := hA x
  

Proof state:
case intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
inst✝ : TopologicalSpace δ
f g : C(α, β)
ι : Type u_5
S✝ : ι → Set α
φ : (i : ι) → C(↑(S✝ i), β)
hφ :
  ∀ (i j : ι) (x : α) (hxi : x ∈ S✝ i) (hxj : x ∈ S✝ j),
    (φ i) { val := x, property := hxi } = (φ j) { val := x, property := hxj }
hS : ∀ (x : α), ∃ i, S✝ i ∈ nhds x
A : Set (Set α)
F✝ : (s : Set α) → s ∈ A → C(↑s, β)
hF :
  ∀ (s : Set α) (hs : s ∈ A) (t : Set α) (ht : t ∈ A) (x : α) (hxi : x ∈ s) (hxj : x ∈ t),
    (F✝ s hs) { val := x, property := hxi } = (F✝ t ht) { val := x, property := hxj }
hA : ∀ (x : α), ∃ i ∈ A, i ∈ nhds x
S : ↑A → Set α := Subtype.val
F : (i : ↑A) → C(↑↑i, β) := fun i => F✝ ↑i (_ : ↑i ∈ A)
x : α
s : Set α
hs : s ∈ A
hsx : s ∈ nhds x
⊢ ∃ i, S i ∈ nhds x

Next tactic:
exact ⟨⟨s, hs⟩, hsx⟩
@[simp]
theorem liftCover_coe' {s : Set α} {hs : s ∈ A} (x : s) : liftCover' A F hF hA x = F s hs x :=
  let x' : ((↑) : A → Set α) ⟨s, hs⟩ := x
  by 

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
inst✝ : TopologicalSpace δ
f g : C(α, β)
ι : Type u_5
S : ι → Set α
φ : (i : ι) → C(↑(S i), β)
hφ :
  ∀ (i j : ι) (x : α) (hxi : x ∈ S i) (hxj : x ∈ S j),
    (φ i) { val := x, property := hxi } = (φ j) { val := x, property := hxj }
hS : ∀ (x : α), ∃ i, S i ∈ nhds x
A : Set (Set α)
F : (s : Set α) → s ∈ A → C(↑s, β)
hF :
  ∀ (s : Set α) (hs : s ∈ A) (t : Set α) (ht : t ∈ A) (x : α) (hxi : x ∈ s) (hxj : x ∈ t),
    (F s hs) { val := x, property := hxi } = (F t ht) { val := x, property := hxj }
hA : ∀ (x : α), ∃ i ∈ A, i ∈ nhds x
s : Set α
hs : s ∈ A
x : ↑s
x' : ↑↑{ val := s, property := hs } := x
⊢ (liftCover' A F hF hA) ↑x = (F s hs) x

Next tactic:
delta liftCover'
@[simp]
theorem liftCover_coe' {s : Set α} {hs : s ∈ A} (x : s) : liftCover' A F hF hA x = F s hs x :=
  let x' : ((↑) : A → Set α) ⟨s, hs⟩ := x
  by delta liftCover'; 

Proof state:
α : Type u_1
β : Type u_2
γ : Type u_3
δ : Type u_4
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
inst✝ : TopologicalSpace δ
f g : C(α, β)
ι : Type u_5
S : ι → Set α
φ : (i : ι) → C(↑(S i), β)
hφ :
  ∀ (i j : ι) (x : α) (hxi : x ∈ S i) (hxj : x ∈ S j),
    (φ i) { val := x, property := hxi } = (φ j) { val := x, property := hxj }
hS : ∀ (x : α), ∃ i, S i ∈ nhds x
A : Set (Set α)
F : (s : Set α) → s ∈ A → C(↑s, β)
hF :
  ∀ (s : Set α) (hs : s ∈ A) (t : Set α) (ht : t ∈ A) (x : α) (hxi : x ∈ s) (hxj : x ∈ t),
    (F s hs) { val := x, property := hxi } = (F t ht) { val := x, property := hxj }
hA : ∀ (x : α), ∃ i ∈ A, i ∈ nhds x
s : Set α
hs : s ∈ A
x : ↑s
x' : ↑↑{ val := s, property := hs } := x
⊢ (let S := Subtype.val;
      let F_1 := fun i => F ↑i (_ : ↑i ∈ A);
      liftCover S F_1
        (_ :
          ∀ (i j : ↑A) (x : α) (hxi : x ∈ ↑i) (hxj : x ∈ ↑j),
            (F ↑i (_ : ↑i ∈ A)) { val := x, property := hxi } = (F ↑j (_ : ↑j ∈ A)) { val := x, property := hxj })
        (_ : ∀ (x : α), ∃ i, ↑i ∈ nhds x))
      ↑x =
    (F s hs) x

Next tactic:
exact liftCover_coe x'
/--
The homeomorphism from the quotient of a quotient map to its codomain. This is
`Setoid.quotientKerEquivOfSurjective` as a homeomorphism.
-/
@[simps!]
noncomputable def homeomorph (hf : QuotientMap f) : Quotient (Setoid.ker f) ≃ₜ Y where
  toEquiv := Setoid.quotientKerEquivOfSurjective _ hf.surjective
  continuous_toFun := quotientMap_quot_mk.continuous_iff.mpr hf.continuous
  continuous_invFun := by
    

Proof state:
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
f : C(X, Y)
hf : QuotientMap ⇑f
⊢ Continuous (Setoid.quotientKerEquivOfSurjective ⇑f (_ : Surjective ⇑f)).invFun

Next tactic:
rw [hf.continuous_iff]
/--
The homeomorphism from the quotient of a quotient map to its codomain. This is
`Setoid.quotientKerEquivOfSurjective` as a homeomorphism.
-/
@[simps!]
noncomputable def homeomorph (hf : QuotientMap f) : Quotient (Setoid.ker f) ≃ₜ Y where
  toEquiv := Setoid.quotientKerEquivOfSurjective _ hf.surjective
  continuous_toFun := quotientMap_quot_mk.continuous_iff.mpr hf.continuous
  continuous_invFun := by
    rw [hf.continuous_iff]
    

Proof state:
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
f : C(X, Y)
hf : QuotientMap ⇑f
⊢ Continuous ((Setoid.quotientKerEquivOfSurjective ⇑f (_ : Surjective ⇑f)).invFun ∘ ⇑f)

Next tactic:
convert continuous_quotient_mk'
/--
The homeomorphism from the quotient of a quotient map to its codomain. This is
`Setoid.quotientKerEquivOfSurjective` as a homeomorphism.
-/
@[simps!]
noncomputable def homeomorph (hf : QuotientMap f) : Quotient (Setoid.ker f) ≃ₜ Y where
  toEquiv := Setoid.quotientKerEquivOfSurjective _ hf.surjective
  continuous_toFun := quotientMap_quot_mk.continuous_iff.mpr hf.continuous
  continuous_invFun := by
    rw [hf.continuous_iff]
    convert continuous_quotient_mk'
    

Proof state:
case h.e'_5
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
f : C(X, Y)
hf : QuotientMap ⇑f
⊢ (Setoid.quotientKerEquivOfSurjective ⇑f (_ : Surjective ⇑f)).invFun ∘ ⇑f = Quotient.mk'

Next tactic:
ext
/--
The homeomorphism from the quotient of a quotient map to its codomain. This is
`Setoid.quotientKerEquivOfSurjective` as a homeomorphism.
-/
@[simps!]
noncomputable def homeomorph (hf : QuotientMap f) : Quotient (Setoid.ker f) ≃ₜ Y where
  toEquiv := Setoid.quotientKerEquivOfSurjective _ hf.surjective
  continuous_toFun := quotientMap_quot_mk.continuous_iff.mpr hf.continuous
  continuous_invFun := by
    rw [hf.continuous_iff]
    convert continuous_quotient_mk'
    ext
    

Proof state:
case h.e'_5.h
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
f : C(X, Y)
hf : QuotientMap ⇑f
x✝ : X
⊢ ((Setoid.quotientKerEquivOfSurjective ⇑f (_ : Surjective ⇑f)).invFun ∘ ⇑f) x✝ = Quotient.mk' x✝

Next tactic:
simp only [Equiv.invFun_as_coe, Function.comp_apply,
      (Setoid.quotientKerEquivOfSurjective f hf.surjective).symm_apply_eq]
/--
The homeomorphism from the quotient of a quotient map to its codomain. This is
`Setoid.quotientKerEquivOfSurjective` as a homeomorphism.
-/
@[simps!]
noncomputable def homeomorph (hf : QuotientMap f) : Quotient (Setoid.ker f) ≃ₜ Y where
  toEquiv := Setoid.quotientKerEquivOfSurjective _ hf.surjective
  continuous_toFun := quotientMap_quot_mk.continuous_iff.mpr hf.continuous
  continuous_invFun := by
    rw [hf.continuous_iff]
    convert continuous_quotient_mk'
    ext
    simp only [Equiv.invFun_as_coe, Function.comp_apply,
      (Setoid.quotientKerEquivOfSurjective f hf.surjective).symm_apply_eq]
    

Proof state:
case h.e'_5.h
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
f : C(X, Y)
hf : QuotientMap ⇑f
x✝ : X
⊢ f x✝ = (Setoid.quotientKerEquivOfSurjective ⇑f (_ : Surjective ⇑f)) (Quotient.mk' x✝)

Next tactic:
rfl
/--
The obvious triangle induced by `QuotientMap.lift` commutes:
```
     g
  X --→ Z
  |   ↗
f |  / hf.lift g h
  v /
  Y
```
-/
@[simp]
theorem lift_comp : (hf.lift g h).comp f = g := by
  

Proof state:
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
f : C(X, Y)
hf : QuotientMap ⇑f
g : C(X, Z)
h : FactorsThrough ⇑g ⇑f
⊢ ContinuousMap.comp (lift hf g h) f = g

Next tactic:
ext
/--
The obvious triangle induced by `QuotientMap.lift` commutes:
```
     g
  X --→ Z
  |   ↗
f |  / hf.lift g h
  v /
  Y
```
-/
@[simp]
theorem lift_comp : (hf.lift g h).comp f = g := by
  ext
  

Proof state:
case h
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
f : C(X, Y)
hf : QuotientMap ⇑f
g : C(X, Z)
h : FactorsThrough ⇑g ⇑f
a✝ : X
⊢ (ContinuousMap.comp (lift hf g h) f) a✝ = g a✝

Next tactic:
simpa using h (Function.rightInverse_surjInv _ _)
/-- `QuotientMap.lift` as an equivalence. -/
@[simps]
noncomputable def liftEquiv : { g : C(X, Z) // Function.FactorsThrough g f} ≃ C(Y, Z) where
  toFun g := hf.lift g g.prop
  invFun g := ⟨g.comp f, fun _ _ h ↦ by 

Proof state:
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
f : C(X, Y)
hf : QuotientMap ⇑f
g✝ : C(X, Z)
h✝ : FactorsThrough ⇑g✝ ⇑f
g : C(Y, Z)
x✝¹ x✝ : X
h : f x✝¹ = f x✝
⊢ (ContinuousMap.comp g f) x✝¹ = (ContinuousMap.comp g f) x✝

Next tactic:
simp only [ContinuousMap.comp_apply]
/-- `QuotientMap.lift` as an equivalence. -/
@[simps]
noncomputable def liftEquiv : { g : C(X, Z) // Function.FactorsThrough g f} ≃ C(Y, Z) where
  toFun g := hf.lift g g.prop
  invFun g := ⟨g.comp f, fun _ _ h ↦ by simp only [ContinuousMap.comp_apply]; 

Proof state:
X : Type u_1
Y : Type u_2
Z : Type u_3
inst✝² : TopologicalSpace X
inst✝¹ : TopologicalSpace Y
inst✝ : TopologicalSpace Z
f : C(X, Y)
hf : QuotientMap ⇑f
g✝ : C(X, Z)
h✝ : FactorsThrough ⇑g✝ ⇑f
g : C(Y, Z)
x✝¹ x✝ : X
h : f x✝¹ = f x✝
⊢ g (f x✝¹) = g (f x✝)

Next tactic:
rw [h]