Theorem: CategoryTheory.Limits.IsColimit.coconePointsIsoOfEquivalence_inv
File: Mathlib/CategoryTheory/Limits/IsLimit.lean

Proof steps:
state_before: J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F✝ : J ⥤ C
t✝ : Cocone F✝
F : J ⥤ C
s : Cocone F
G : K ⥤ C
t : Cocone G
P : IsColimit s
Q : IsColimit t
e : J ≌ K
w : e.functor ⋙ G ≅ F
w' : e.inverse ⋙ F ≅ G := (isoWhiskerLeft e.inverse w).symm ≪≫ e.invFunIdAssoc G
⊢ P.desc ((Cocones.equivalenceOfReindexing e w).functor.obj t) ≫
      Q.desc ((Cocones.equivalenceOfReindexing e.symm w').functor.obj s) =
    𝟙 s.pt
state_after: J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F✝ : J ⥤ C
t✝ : Cocone F✝
F : J ⥤ C
s : Cocone F
G : K ⥤ C
t : Cocone G
P : IsColimit s
Q : IsColimit t
e : J ≌ K
w : e.functor ⋙ G ≅ F
w' : e.inverse ⋙ F ≅ G := (isoWhiskerLeft e.inverse w).symm ≪≫ e.invFunIdAssoc G
⊢ ∀ (j : J),
    s.ι.app j ≫
        P.desc ((Cocones.equivalenceOfReindexing e w).functor.obj t) ≫
          Q.desc ((Cocones.equivalenceOfReindexing e.symm w').functor.obj s) =
      s.ι.app j ≫ 𝟙 s.pt
tactic: apply hom_ext P
state_before: J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F✝ : J ⥤ C
t✝ : Cocone F✝
F : J ⥤ C
s : Cocone F
G : K ⥤ C
t : Cocone G
P : IsColimit s
Q : IsColimit t
e : J ≌ K
w : e.functor ⋙ G ≅ F
w' : e.inverse ⋙ F ≅ G := (isoWhiskerLeft e.inverse w).symm ≪≫ e.invFunIdAssoc G
⊢ ∀ (j : J),
    s.ι.app j ≫
        P.desc ((Cocones.equivalenceOfReindexing e w).functor.obj t) ≫
          Q.desc ((Cocones.equivalenceOfReindexing e.symm w').functor.obj s) =
      s.ι.app j ≫ 𝟙 s.pt
state_after: J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F✝ : J ⥤ C
t✝ : Cocone F✝
F : J ⥤ C
s : Cocone F
G : K ⥤ C
t : Cocone G
P : IsColimit s
Q : IsColimit t
e : J ≌ K
w : e.functor ⋙ G ≅ F
w' : e.inverse ⋙ F ≅ G := (isoWhiskerLeft e.inverse w).symm ≪≫ e.invFunIdAssoc G
j : J
⊢ s.ι.app j ≫
      P.desc ((Cocones.equivalenceOfReindexing e w).functor.obj t) ≫
        Q.desc ((Cocones.equivalenceOfReindexing e.symm w').functor.obj s) =
    s.ι.app j ≫ 𝟙 s.pt
tactic: intro j
state_before: J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F✝ : J ⥤ C
t✝ : Cocone F✝
F : J ⥤ C
s : Cocone F
G : K ⥤ C
t : Cocone G
P : IsColimit s
Q : IsColimit t
e : J ≌ K
w : e.functor ⋙ G ≅ F
w' : e.inverse ⋙ F ≅ G := (isoWhiskerLeft e.inverse w).symm ≪≫ e.invFunIdAssoc G
j : J
⊢ s.ι.app j ≫
      P.desc ((Cocones.equivalenceOfReindexing e w).functor.obj t) ≫
        Q.desc ((Cocones.equivalenceOfReindexing e.symm w').functor.obj s) =
    s.ι.app j ≫ 𝟙 s.pt
state_after: J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F✝ : J ⥤ C
t✝ : Cocone F✝
F : J ⥤ C
s : Cocone F
G : K ⥤ C
t : Cocone G
P : IsColimit s
Q : IsColimit t
e : J ≌ K
w : e.functor ⋙ G ≅ F
w' : e.inverse ⋙ F ≅ G := (isoWhiskerLeft e.inverse w).symm ≪≫ e.invFunIdAssoc G
j : J
⊢ s.ι.app j ≫
      P.desc ((Cocones.precompose w.inv).obj (Cocone.whisker e.functor t)) ≫
        Q.desc
          ((Cocones.precompose ((e.invFunIdAssoc G).inv ≫ whiskerLeft e.inverse w.hom)).obj
            (Cocone.whisker e.inverse s)) =
    s.ι.app j ≫ 𝟙 s.pt
tactic: dsimp [w']
state_before: J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F✝ : J ⥤ C
t✝ : Cocone F✝
F : J ⥤ C
s : Cocone F
G : K ⥤ C
t : Cocone G
P : IsColimit s
Q : IsColimit t
e : J ≌ K
w : e.functor ⋙ G ≅ F
w' : e.inverse ⋙ F ≅ G := (isoWhiskerLeft e.inverse w).symm ≪≫ e.invFunIdAssoc G
j : J
⊢ s.ι.app j ≫
      P.desc ((Cocones.precompose w.inv).obj (Cocone.whisker e.functor t)) ≫
        Q.desc
          ((Cocones.precompose ((e.invFunIdAssoc G).inv ≫ whiskerLeft e.inverse w.hom)).obj
            (Cocone.whisker e.inverse s)) =
    s.ι.app j ≫ 𝟙 s.pt
state_after: J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F✝ : J ⥤ C
t✝ : Cocone F✝
F : J ⥤ C
s : Cocone F
G : K ⥤ C
t : Cocone G
P : IsColimit s
Q : IsColimit t
e : J ≌ K
w : e.functor ⋙ G ≅ F
w' : e.inverse ⋙ F ≅ G := (isoWhiskerLeft e.inverse w).symm ≪≫ e.invFunIdAssoc G
j : J
⊢ w.inv.app j ≫
      G.map (e.counitInv.app (e.functor.obj j)) ≫
        w.hom.app (e.inverse.obj (e.functor.obj j)) ≫ s.ι.app (e.inverse.obj (e.functor.obj j)) =
    s.ι.app j
tactic: simp only [Limits.Cocone.whisker_ι, fac, invFunIdAssoc_inv_app, whiskerLeft_app, assoc,
        comp_id, Limits.Cocones.precompose_obj_ι, fac_assoc, NatTrans.comp_app]
state_before: J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F✝ : J ⥤ C
t✝ : Cocone F✝
F : J ⥤ C
s : Cocone F
G : K ⥤ C
t : Cocone G
P : IsColimit s
Q : IsColimit t
e : J ≌ K
w : e.functor ⋙ G ≅ F
w' : e.inverse ⋙ F ≅ G := (isoWhiskerLeft e.inverse w).symm ≪≫ e.invFunIdAssoc G
j : J
⊢ w.inv.app j ≫
      G.map (e.counitInv.app (e.functor.obj j)) ≫
        w.hom.app (e.inverse.obj (e.functor.obj j)) ≫ s.ι.app (e.inverse.obj (e.functor.obj j)) =
    s.ι.app j
state_after: J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F✝ : J ⥤ C
t✝ : Cocone F✝
F : J ⥤ C
s : Cocone F
G : K ⥤ C
t : Cocone G
P : IsColimit s
Q : IsColimit t
e : J ≌ K
w : e.functor ⋙ G ≅ F
w' : e.inverse ⋙ F ≅ G := (isoWhiskerLeft e.inverse w).symm ≪≫ e.invFunIdAssoc G
j : J
⊢ F.map (e.unit.app j) ≫
      w.inv.app ((e.functor ⋙ e.inverse).obj j) ≫
        w.hom.app (e.inverse.obj (e.functor.obj j)) ≫ s.ι.app (e.inverse.obj (e.functor.obj j)) =
    s.ι.app j
tactic: rw [counitInv_app_functor, ← Functor.comp_map, ← w.inv.naturality_assoc]
state_before: J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F✝ : J ⥤ C
t✝ : Cocone F✝
F : J ⥤ C
s : Cocone F
G : K ⥤ C
t : Cocone G
P : IsColimit s
Q : IsColimit t
e : J ≌ K
w : e.functor ⋙ G ≅ F
w' : e.inverse ⋙ F ≅ G := (isoWhiskerLeft e.inverse w).symm ≪≫ e.invFunIdAssoc G
j : J
⊢ F.map (e.unit.app j) ≫
      w.inv.app ((e.functor ⋙ e.inverse).obj j) ≫
        w.hom.app (e.inverse.obj (e.functor.obj j)) ≫ s.ι.app (e.inverse.obj (e.functor.obj j)) =
    s.ι.app j
state_after: J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F✝ : J ⥤ C
t✝ : Cocone F✝
F : J ⥤ C
s : Cocone F
G : K ⥤ C
t : Cocone G
P : IsColimit s
Q : IsColimit t
e : J ≌ K
w : e.functor ⋙ G ≅ F
w' : e.inverse ⋙ F ≅ G := (isoWhiskerLeft e.inverse w).symm ≪≫ e.invFunIdAssoc G
j : J
⊢ F.map (e.unit.app j) ≫
      w.inv.app (e.inverse.obj (e.functor.obj j)) ≫
        w.hom.app (e.inverse.obj (e.functor.obj j)) ≫ s.ι.app (e.inverse.obj (e.functor.obj j)) =
    s.ι.app j
tactic: dsimp
state_before: J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F✝ : J ⥤ C
t✝ : Cocone F✝
F : J ⥤ C
s : Cocone F
G : K ⥤ C
t : Cocone G
P : IsColimit s
Q : IsColimit t
e : J ≌ K
w : e.functor ⋙ G ≅ F
w' : e.inverse ⋙ F ≅ G := (isoWhiskerLeft e.inverse w).symm ≪≫ e.invFunIdAssoc G
j : J
⊢ F.map (e.unit.app j) ≫
      w.inv.app (e.inverse.obj (e.functor.obj j)) ≫
        w.hom.app (e.inverse.obj (e.functor.obj j)) ≫ s.ι.app (e.inverse.obj (e.functor.obj j)) =
    s.ι.app j
state_after: no goals
tactic: simp
state_before: J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F✝ : J ⥤ C
t✝ : Cocone F✝
F : J ⥤ C
s : Cocone F
G : K ⥤ C
t : Cocone G
P : IsColimit s
Q : IsColimit t
e : J ≌ K
w : e.functor ⋙ G ≅ F
w' : e.inverse ⋙ F ≅ G := (isoWhiskerLeft e.inverse w).symm ≪≫ e.invFunIdAssoc G
⊢ Q.desc ((Cocones.equivalenceOfReindexing e.symm w').functor.obj s) ≫
      P.desc ((Cocones.equivalenceOfReindexing e w).functor.obj t) =
    𝟙 t.pt
state_after: J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F✝ : J ⥤ C
t✝ : Cocone F✝
F : J ⥤ C
s : Cocone F
G : K ⥤ C
t : Cocone G
P : IsColimit s
Q : IsColimit t
e : J ≌ K
w : e.functor ⋙ G ≅ F
w' : e.inverse ⋙ F ≅ G := (isoWhiskerLeft e.inverse w).symm ≪≫ e.invFunIdAssoc G
⊢ ∀ (j : K),
    t.ι.app j ≫
        Q.desc ((Cocones.equivalenceOfReindexing e.symm w').functor.obj s) ≫
          P.desc ((Cocones.equivalenceOfReindexing e w).functor.obj t) =
      t.ι.app j ≫ 𝟙 t.pt
tactic: apply hom_ext Q
state_before: J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F✝ : J ⥤ C
t✝ : Cocone F✝
F : J ⥤ C
s : Cocone F
G : K ⥤ C
t : Cocone G
P : IsColimit s
Q : IsColimit t
e : J ≌ K
w : e.functor ⋙ G ≅ F
w' : e.inverse ⋙ F ≅ G := (isoWhiskerLeft e.inverse w).symm ≪≫ e.invFunIdAssoc G
⊢ ∀ (j : K),
    t.ι.app j ≫
        Q.desc ((Cocones.equivalenceOfReindexing e.symm w').functor.obj s) ≫
          P.desc ((Cocones.equivalenceOfReindexing e w).functor.obj t) =
      t.ι.app j ≫ 𝟙 t.pt
state_after: no goals
tactic: aesop_cat