-- Mathlib/CategoryTheory/Limits/FilteredColimitCommutesProduct.lean
theorem Types.isIso_colimitPointwiseProductToProductColimit (F : ∀ i, I i ⥤ Type u) :
    IsIso (colimitPointwiseProductToProductColimit F)

Proof state:
case intro.intro.intro
α : Type u
I : α → Type u
inst✝¹ : (i : α) → SmallCategory (I i)
inst✝ : ∀ (i : α), IsFiltered (I i)
F : (i : α) → I i ⥤ Type u
ky : (i : α) → I i
yk₀ : (pointwiseProduct F).obj ky
ky' : (i : α) → I i
yk₀' : (pointwiseProduct F).obj ky'
k : (i : α) → I i := IsFiltered.max ky ky'
yk : ∏ᶜ fun s => (F s).obj (k s) := (pointwiseProduct F).map (IsFiltered.leftToMax ky ky') yk₀
yk' : ∏ᶜ fun s => (F s).obj (k s) := (pointwiseProduct F).map (IsFiltered.rightToMax ky ky') yk₀'
hyk₀ : colimit.ι (pointwiseProduct F) ky yk₀ = colimit.ι (pointwiseProduct F) k yk
hyk₀' : colimit.ι (pointwiseProduct F) ky' yk₀' = colimit.ι (pointwiseProduct F) k yk'
hy :
  colimitPointwiseProductToProductColimit F (colimit.ι (pointwiseProduct F) k yk) =
    colimitPointwiseProductToProductColimit F (colimit.ι (pointwiseProduct F) k yk')
s : α
hy₁ :
  Pi.π (fun s => colimit (F s)) s (colimitPointwiseProductToProductColimit F (colimit.ι (pointwiseProduct F) k yk)) =
    colimit.ι (F s) (k s) (Pi.π (fun s => (F s).obj (k s)) s yk)
i₀ : I s
f₀ g₀ : k s ⟶ i₀
h₀ : (F s).map f₀ (Pi.π (fun s => (F s).obj (k s)) s yk) = (F s).map g₀ (Pi.π (fun s => (F s).obj (k s)) s yk')
⊢ ∃ i' hi', (F s).map hi' (Pi.π (fun s => (F s).obj (k s)) s yk) = (F s).map hi' (Pi.π (fun s => (F s).obj (k s)) s yk')

Tactic:
refine ⟨IsFiltered.coeq f₀ g₀, f₀ ≫ IsFiltered.coeqHom f₀ g₀, ?_⟩

Result:
case intro.intro.intro
α : Type u
I : α → Type u
inst✝¹ : (i : α) → SmallCategory (I i)
inst✝ : ∀ (i : α), IsFiltered (I i)
F : (i : α) → I i ⥤ Type u
ky : (i : α) → I i
yk₀ : (pointwiseProduct F).obj ky
ky' : (i : α) → I i
yk₀' : (pointwiseProduct F).obj ky'
k : (i : α) → I i := IsFiltered.max ky ky'
yk : ∏ᶜ fun s => (F s).obj (k s) := (pointwiseProduct F).map (IsFiltered.leftToMax ky ky') yk₀
yk' : ∏ᶜ fun s => (F s).obj (k s) := (pointwiseProduct F).map (IsFiltered.rightToMax ky ky') yk₀'
hyk₀ : colimit.ι (pointwiseProduct F) ky yk₀ = colimit.ι (pointwiseProduct F) k yk
hyk₀' : colimit.ι (pointwiseProduct F) ky' yk₀' = colimit.ι (pointwiseProduct F) k yk'
hy :
  colimitPointwiseProductToProductColimit F (colimit.ι (pointwiseProduct F) k yk) =
    colimitPointwiseProductToProductColimit F (colimit.ι (pointwiseProduct F) k yk')
s : α
hy₁ :
  Pi.π (fun s => colimit (F s)) s (colimitPointwiseProductToProductColimit F (colimit.ι (pointwiseProduct F) k yk)) =
    colimit.ι (F s) (k s) (Pi.π (fun s => (F s).obj (k s)) s yk)
i₀ : I s
f₀ g₀ : k s ⟶ i₀
h₀ : (F s).map f₀ (Pi.π (fun s => (F s).obj (k s)) s yk) = (F s).map g₀ (Pi.π (fun s => (F s).obj (k s)) s yk')
⊢ (F s).map (f₀ ≫ IsFiltered.coeqHom f₀ g₀) (Pi.π (fun s => (F s).obj (k s)) s yk) =
    (F s).map (f₀ ≫ IsFiltered.coeqHom f₀ g₀) (Pi.π (fun s => (F s).obj (k s)) s yk')

Proof state:
α : Type u
I : α → Type u
inst✝¹ : (i : α) → SmallCategory (I i)
inst✝ : ∀ (i : α), IsFiltered (I i)
F : (i : α) → I i ⥤ Type u
ky : (i : α) → I i
yk₀ : (pointwiseProduct F).obj ky
ky' : (i : α) → I i
yk₀' : (pointwiseProduct F).obj ky'
k : (i : α) → I i := IsFiltered.max ky ky'
yk : ∏ᶜ fun s => (F s).obj (k s) := (pointwiseProduct F).map (IsFiltered.leftToMax ky ky') yk₀
yk' : ∏ᶜ fun s => (F s).obj (k s) := (pointwiseProduct F).map (IsFiltered.rightToMax ky ky') yk₀'
hyk₀ : colimit.ι (pointwiseProduct F) ky yk₀ = colimit.ι (pointwiseProduct F) k yk
hyk₀' : colimit.ι (pointwiseProduct F) ky' yk₀' = colimit.ι (pointwiseProduct F) k yk'
hy :
  colimitPointwiseProductToProductColimit F (colimit.ι (pointwiseProduct F) k yk) =
    colimitPointwiseProductToProductColimit F (colimit.ι (pointwiseProduct F) k yk')
s : α
hy₁ :
  (colimit.ι (pointwiseProduct F) k ≫ colimitPointwiseProductToProductColimit F ≫ Pi.π (fun s => colimit (F s)) s) yk =
    (Pi.π (fun s => (F s).obj (k s)) s ≫ colimit.ι (F s) (k s)) yk
⊢ ∃ i' hi', (F s).map hi' (Pi.π (fun s => (F s).obj (k s)) s yk) = (F s).map hi' (Pi.π (fun s => (F s).obj (k s)) s yk')

Tactic:
have hy₂ := congrFun (ι_colimitPointwiseProductToProductColimit_π F k s) yk'

Result:
α : Type u
I : α → Type u
inst✝¹ : (i : α) → SmallCategory (I i)
inst✝ : ∀ (i : α), IsFiltered (I i)
F : (i : α) → I i ⥤ Type u
ky : (i : α) → I i
yk₀ : (pointwiseProduct F).obj ky
ky' : (i : α) → I i
yk₀' : (pointwiseProduct F).obj ky'
k : (i : α) → I i := IsFiltered.max ky ky'
yk : ∏ᶜ fun s => (F s).obj (k s) := (pointwiseProduct F).map (IsFiltered.leftToMax ky ky') yk₀
yk' : ∏ᶜ fun s => (F s).obj (k s) := (pointwiseProduct F).map (IsFiltered.rightToMax ky ky') yk₀'
hyk₀ : colimit.ι (pointwiseProduct F) ky yk₀ = colimit.ι (pointwiseProduct F) k yk
hyk₀' : colimit.ι (pointwiseProduct F) ky' yk₀' = colimit.ι (pointwiseProduct F) k yk'
hy :
  colimitPointwiseProductToProductColimit F (colimit.ι (pointwiseProduct F) k yk) =
    colimitPointwiseProductToProductColimit F (colimit.ι (pointwiseProduct F) k yk')
s : α
hy₁ :
  (colimit.ι (pointwiseProduct F) k ≫ colimitPointwiseProductToProductColimit F ≫ Pi.π (fun s => colimit (F s)) s) yk =
    (Pi.π (fun s => (F s).obj (k s)) s ≫ colimit.ι (F s) (k s)) yk
hy₂ :
  (colimit.ι (pointwiseProduct F) k ≫ colimitPointwiseProductToProductColimit F ≫ Pi.π (fun s => colimit (F s)) s) yk' =
    (Pi.π (fun s => (F s).obj (k s)) s ≫ colimit.ι (F s) (k s)) yk'
⊢ ∃ i' hi', (F s).map hi' (Pi.π (fun s => (F s).obj (k s)) s yk) = (F s).map hi' (Pi.π (fun s => (F s).obj (k s)) s yk')

Proof state:
case refine_2
α : Type u
I : α → Type u
inst✝¹ : (i : α) → SmallCategory (I i)
inst✝ : ∀ (i : α), IsFiltered (I i)
F : (i : α) → I i ⥤ Type u
x : ∏ᶜ fun s => colimit (F s)
⊢ ∃ a, colimitPointwiseProductToProductColimit F a = x

Tactic:
have hch : ∀ (s : α), ∃ (i : I s) (xi : (F s).obj i), colimit.ι (F s) i xi =
    Pi.π (fun s => colimit (F s)) s x := fun s => Types.jointly_surjective' _

Result:
case refine_2
α : Type u
I : α → Type u
inst✝¹ : (i : α) → SmallCategory (I i)
inst✝ : ∀ (i : α), IsFiltered (I i)
F : (i : α) → I i ⥤ Type u
x : ∏ᶜ fun s => colimit (F s)
hch : ∀ (s : α), ∃ i xi, colimit.ι (F s) i xi = Pi.π (fun s => colimit (F s)) s x
⊢ ∃ a, colimitPointwiseProductToProductColimit F a = x