Theorem: CategoryTheory.FinitaryPreExtensive.sigma_desc_iso
File: Mathlib/CategoryTheory/Extensive.lean

tactic: suffices IsColimit (Cofan.mk _ ((fun _ ↦ pullback.fst) : (a : α) → pullback f (π a) ⟶ _)) by
  change IsIso (this.coconePointUniqueUpToIso (getColimitCocone _).2).inv
  infer_instance
state_before: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
D : Type u''
inst✝² : Category.{v'', u''} D
X✝ Y✝ : C
inst✝¹ : FinitaryPreExtensive C
α : Type
inst✝ : Finite α
X : C
Z : α → C
π : (a : α) → Z a ⟶ X
Y : C
f : Y ⟶ X
hπ : IsIso (Sigma.desc π)
⊢ IsIso (Sigma.desc fun x => pullback.fst)
state_after: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
D : Type u''
inst✝² : Category.{v'', u''} D
X✝ Y✝ : C
inst✝¹ : FinitaryPreExtensive C
α : Type
inst✝ : Finite α
X : C
Z : α → C
π : (a : α) → Z a ⟶ X
Y : C
f : Y ⟶ X
hπ : IsIso (Sigma.desc π)
⊢ IsColimit (Cofan.mk Y fun x => pullback.fst)

tactic: let this : IsColimit (Cofan.mk X π) := by
  refine @IsColimit.ofPointIso (t := Cofan.mk X π) (P := coproductIsCoproduct Z) ?_
  convert hπ
  simp [coproductIsCoproduct]
state_before: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
D : Type u''
inst✝² : Category.{v'', u''} D
X✝ Y✝ : C
inst✝¹ : FinitaryPreExtensive C
α : Type
inst✝ : Finite α
X : C
Z : α → C
π : (a : α) → Z a ⟶ X
Y : C
f : Y ⟶ X
hπ : IsIso (Sigma.desc π)
⊢ IsColimit (Cofan.mk Y fun x => pullback.fst)
state_after: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
D : Type u''
inst✝² : Category.{v'', u''} D
X✝ Y✝ : C
inst✝¹ : FinitaryPreExtensive C
α : Type
inst✝ : Finite α
X : C
Z : α → C
π : (a : α) → Z a ⟶ X
Y : C
f : Y ⟶ X
hπ : IsIso (Sigma.desc π)
this : IsColimit (Cofan.mk X π) := (coproductIsCoproduct Z).ofPointIso
⊢ IsColimit (Cofan.mk Y fun x => pullback.fst)

tactic: refine (FinitaryPreExtensive.isUniversal_finiteCoproducts this
  (Cofan.mk _ ((fun _ ↦ pullback.fst) : (a : α) → pullback f (π a) ⟶ _))
  (Discrete.natTrans fun i ↦ pullback.snd) f ?_
  (NatTrans.equifibered_of_discrete _) ?_).some
state_before: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
D : Type u''
inst✝² : Category.{v'', u''} D
X✝ Y✝ : C
inst✝¹ : FinitaryPreExtensive C
α : Type
inst✝ : Finite α
X : C
Z : α → C
π : (a : α) → Z a ⟶ X
Y : C
f : Y ⟶ X
hπ : IsIso (Sigma.desc π)
this : IsColimit (Cofan.mk X π) := (coproductIsCoproduct Z).ofPointIso
⊢ IsColimit (Cofan.mk Y fun x => pullback.fst)
state_after: case refine_1
J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
D : Type u''
inst✝² : Category.{v'', u''} D
X✝ Y✝ : C
inst✝¹ : FinitaryPreExtensive C
α : Type
inst✝ : Finite α
X : C
Z : α → C
π : (a : α) → Z a ⟶ X
Y : C
f : Y ⟶ X
hπ : IsIso (Sigma.desc π)
this : IsColimit (Cofan.mk X π) := (coproductIsCoproduct Z).ofPointIso
⊢ (Discrete.natTrans fun i => pullback.snd) ≫ (Cofan.mk X π).ι =
    (Cofan.mk Y fun x => pullback.fst).ι ≫ (Functor.const (Discrete α)).map f

case refine_2
J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
D : Type u''
inst✝² : Category.{v'', u''} D
X✝ Y✝ : C
inst✝¹ : FinitaryPreExtensive C
α : Type
inst✝ : Finite α
X : C
Z : α → C
π : (a : α) → Z a ⟶ X
Y : C
f : Y ⟶ X
hπ : IsIso (Sigma.desc π)
this : IsColimit (Cofan.mk X π) := (coproductIsCoproduct Z).ofPointIso
⊢ ∀ (j : Discrete α),
    IsPullback ((Cofan.mk Y fun x => pullback.fst).ι.app j) ((Discrete.natTrans fun i => pullback.snd).app j) f
      ((Cofan.mk X π).ι.app j)

tactic: change IsIso (this.coconePointUniqueUpToIso (getColimitCocone _).2).inv
state_before: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
D : Type u''
inst✝² : Category.{v'', u''} D
X✝ Y✝ : C
inst✝¹ : FinitaryPreExtensive C
α : Type
inst✝ : Finite α
X : C
Z : α → C
π : (a : α) → Z a ⟶ X
Y : C
f : Y ⟶ X
hπ : IsIso (Sigma.desc π)
this : IsColimit (Cofan.mk Y fun x => pullback.fst)
⊢ IsIso (Sigma.desc fun x => pullback.fst)
state_after: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
D : Type u''
inst✝² : Category.{v'', u''} D
X✝ Y✝ : C
inst✝¹ : FinitaryPreExtensive C
α : Type
inst✝ : Finite α
X : C
Z : α → C
π : (a : α) → Z a ⟶ X
Y : C
f : Y ⟶ X
hπ : IsIso (Sigma.desc π)
this : IsColimit (Cofan.mk Y fun x => pullback.fst)
⊢ IsIso (this.coconePointUniqueUpToIso (getColimitCocone (Discrete.functor fun x => pullback f (π x))).isColimit).inv

tactic: infer_instance
state_before: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
D : Type u''
inst✝² : Category.{v'', u''} D
X✝ Y✝ : C
inst✝¹ : FinitaryPreExtensive C
α : Type
inst✝ : Finite α
X : C
Z : α → C
π : (a : α) → Z a ⟶ X
Y : C
f : Y ⟶ X
hπ : IsIso (Sigma.desc π)
this : IsColimit (Cofan.mk Y fun x => pullback.fst)
⊢ IsIso (this.coconePointUniqueUpToIso (getColimitCocone (Discrete.functor fun x => pullback f (π x))).isColimit).inv
state_after: no goals

tactic: refine @IsColimit.ofPointIso (t := Cofan.mk X π) (P := coproductIsCoproduct Z) ?_
state_before: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
D : Type u''
inst✝² : Category.{v'', u''} D
X✝ Y✝ : C
inst✝¹ : FinitaryPreExtensive C
α : Type
inst✝ : Finite α
X : C
Z : α → C
π : (a : α) → Z a ⟶ X
Y : C
f : Y ⟶ X
hπ : IsIso (Sigma.desc π)
⊢ IsColimit (Cofan.mk X π)
state_after: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
D : Type u''
inst✝² : Category.{v'', u''} D
X✝ Y✝ : C
inst✝¹ : FinitaryPreExtensive C
α : Type
inst✝ : Finite α
X : C
Z : α → C
π : (a : α) → Z a ⟶ X
Y : C
f : Y ⟶ X
hπ : IsIso (Sigma.desc π)
⊢ IsIso ((coproductIsCoproduct Z).desc (Cofan.mk X π))

tactic: convert hπ
state_before: J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
D : Type u''
inst✝² : Category.{v'', u''} D
X✝ Y✝ : C
inst✝¹ : FinitaryPreExtensive C
α : Type
inst✝ : Finite α
X : C
Z : α → C
π : (a : α) → Z a ⟶ X
Y : C
f : Y ⟶ X
hπ : IsIso (Sigma.desc π)
⊢ IsIso ((coproductIsCoproduct Z).desc (Cofan.mk X π))
state_after: case h.e'_5.h
J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
D : Type u''
inst✝² : Category.{v'', u''} D
X✝ Y✝ : C
inst✝¹ : FinitaryPreExtensive C
α : Type
inst✝ : Finite α
X : C
Z : α → C
π : (a : α) → Z a ⟶ X
Y : C
f : Y ⟶ X
hπ : IsIso (Sigma.desc π)
e_3✝ : (Cofan.mk (∐ Z) (Sigma.ι Z)).pt = ∐ Z
e_4✝ : (Cofan.mk X π).pt = X
⊢ (coproductIsCoproduct Z).desc (Cofan.mk X π) = Sigma.desc π

tactic: simp [coproductIsCoproduct]
state_before: case h.e'_5.h
J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
D : Type u''
inst✝² : Category.{v'', u''} D
X✝ Y✝ : C
inst✝¹ : FinitaryPreExtensive C
α : Type
inst✝ : Finite α
X : C
Z : α → C
π : (a : α) → Z a ⟶ X
Y : C
f : Y ⟶ X
hπ : IsIso (Sigma.desc π)
e_3✝ : (Cofan.mk (∐ Z) (Sigma.ι Z)).pt = ∐ Z
e_4✝ : (Cofan.mk X π).pt = X
⊢ (coproductIsCoproduct Z).desc (Cofan.mk X π) = Sigma.desc π
state_after: no goals

tactic: ext
state_before: case refine_1
J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
D : Type u''
inst✝² : Category.{v'', u''} D
X✝ Y✝ : C
inst✝¹ : FinitaryPreExtensive C
α : Type
inst✝ : Finite α
X : C
Z : α → C
π : (a : α) → Z a ⟶ X
Y : C
f : Y ⟶ X
hπ : IsIso (Sigma.desc π)
this : IsColimit (Cofan.mk X π) := (coproductIsCoproduct Z).ofPointIso
⊢ (Discrete.natTrans fun i => pullback.snd) ≫ (Cofan.mk X π).ι =
    (Cofan.mk Y fun x => pullback.fst).ι ≫ (Functor.const (Discrete α)).map f
state_after: case refine_1.w.h
J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
D : Type u''
inst✝² : Category.{v'', u''} D
X✝ Y✝ : C
inst✝¹ : FinitaryPreExtensive C
α : Type
inst✝ : Finite α
X : C
Z : α → C
π : (a : α) → Z a ⟶ X
Y : C
f : Y ⟶ X
hπ : IsIso (Sigma.desc π)
this : IsColimit (Cofan.mk X π) := (coproductIsCoproduct Z).ofPointIso
x✝ : Discrete α
⊢ ((Discrete.natTrans fun i => pullback.snd) ≫ (Cofan.mk X π).ι).app x✝ =
    ((Cofan.mk Y fun x => pullback.fst).ι ≫ (Functor.const (Discrete α)).map f).app x✝

tactic: simp [pullback.condition]
state_before: case refine_1.w.h
J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
D : Type u''
inst✝² : Category.{v'', u''} D
X✝ Y✝ : C
inst✝¹ : FinitaryPreExtensive C
α : Type
inst✝ : Finite α
X : C
Z : α → C
π : (a : α) → Z a ⟶ X
Y : C
f : Y ⟶ X
hπ : IsIso (Sigma.desc π)
this : IsColimit (Cofan.mk X π) := (coproductIsCoproduct Z).ofPointIso
x✝ : Discrete α
⊢ ((Discrete.natTrans fun i => pullback.snd) ≫ (Cofan.mk X π).ι).app x✝ =
    ((Cofan.mk Y fun x => pullback.fst).ι ≫ (Functor.const (Discrete α)).map f).app x✝
state_after: no goals

tactic: exact fun j ↦ IsPullback.of_hasPullback f (π j.as)
state_before: case refine_2
J : Type v'
inst✝⁴ : Category.{u', v'} J
C : Type u
inst✝³ : Category.{v, u} C
D : Type u''
inst✝² : Category.{v'', u''} D
X✝ Y✝ : C
inst✝¹ : FinitaryPreExtensive C
α : Type
inst✝ : Finite α
X : C
Z : α → C
π : (a : α) → Z a ⟶ X
Y : C
f : Y ⟶ X
hπ : IsIso (Sigma.desc π)
this : IsColimit (Cofan.mk X π) := (coproductIsCoproduct Z).ofPointIso
⊢ ∀ (j : Discrete α),
    IsPullback ((Cofan.mk Y fun x => pullback.fst).ι.app j) ((Discrete.natTrans fun i => pullback.snd).app j) f
      ((Cofan.mk X π).ι.app j)
state_after: no goals