Theorem: CategoryTheory.AbelianOfAdjunction.hasCokernels
File: Mathlib/CategoryTheory/Abelian/Transfer.lean

Proof steps:
state_before: C : Type u₁
inst✝⁴ : Category.{v, u₁} C
inst✝³ : Preadditive C
D : Type u₂
inst✝² : Category.{v, u₂} D
inst✝¹ : Abelian D
F : C ⥤ D
G : D ⥤ C
inst✝ : G.PreservesZeroMorphisms
i : F ⋙ G ≅ 𝟭 C
adj : G ⊣ F
X✝ Y✝ : C
f : X✝ ⟶ Y✝
⊢ HasCokernel f
state_after: C : Type u₁
inst✝⁴ : Category.{v, u₁} C
inst✝³ : Preadditive C
D : Type u₂
inst✝² : Category.{v, u₂} D
inst✝¹ : Abelian D
F : C ⥤ D
G : D ⥤ C
inst✝ : G.PreservesZeroMorphisms
i : F ⋙ G ≅ 𝟭 C
adj : G ⊣ F
X✝ Y✝ : C
f : X✝ ⟶ Y✝
this : PreservesColimits G
⊢ HasCokernel f
tactic: have : PreservesColimits G := adj.leftAdjointPreservesColimits
state_before: C : Type u₁
inst✝⁴ : Category.{v, u₁} C
inst✝³ : Preadditive C
D : Type u₂
inst✝² : Category.{v, u₂} D
inst✝¹ : Abelian D
F : C ⥤ D
G : D ⥤ C
inst✝ : G.PreservesZeroMorphisms
i : F ⋙ G ≅ 𝟭 C
adj : G ⊣ F
X✝ Y✝ : C
f : X✝ ⟶ Y✝
this : PreservesColimits G
⊢ HasCokernel f
state_after: C : Type u₁
inst✝⁴ : Category.{v, u₁} C
inst✝³ : Preadditive C
D : Type u₂
inst✝² : Category.{v, u₂} D
inst✝¹ : Abelian D
F : C ⥤ D
G : D ⥤ C
inst✝ : G.PreservesZeroMorphisms
i : F ⋙ G ≅ 𝟭 C
adj : G ⊣ F
X✝ Y✝ : C
f : X✝ ⟶ Y✝
this✝ : PreservesColimits G
this : i.inv.app X✝ ≫ (F ⋙ G).map f ≫ i.hom.app Y✝ = (𝟭 C).map f
⊢ HasCokernel f
tactic: have := NatIso.naturality_1 i f
state_before: C : Type u₁
inst✝⁴ : Category.{v, u₁} C
inst✝³ : Preadditive C
D : Type u₂
inst✝² : Category.{v, u₂} D
inst✝¹ : Abelian D
F : C ⥤ D
G : D ⥤ C
inst✝ : G.PreservesZeroMorphisms
i : F ⋙ G ≅ 𝟭 C
adj : G ⊣ F
X✝ Y✝ : C
f : X✝ ⟶ Y✝
this✝ : PreservesColimits G
this : i.inv.app X✝ ≫ (F ⋙ G).map f ≫ i.hom.app Y✝ = (𝟭 C).map f
⊢ HasCokernel f
state_after: C : Type u₁
inst✝⁴ : Category.{v, u₁} C
inst✝³ : Preadditive C
D : Type u₂
inst✝² : Category.{v, u₂} D
inst✝¹ : Abelian D
F : C ⥤ D
G : D ⥤ C
inst✝ : G.PreservesZeroMorphisms
i : F ⋙ G ≅ 𝟭 C
adj : G ⊣ F
X✝ Y✝ : C
f : X✝ ⟶ Y✝
this✝ : PreservesColimits G
this : i.inv.app X✝ ≫ G.map (F.map f) ≫ i.hom.app Y✝ = f
⊢ HasCokernel f
tactic: simp? at this says
        simp only [Functor.id_obj, Functor.comp_obj, Functor.comp_map, Functor.id_map] at this
state_before: C : Type u₁
inst✝⁴ : Category.{v, u₁} C
inst✝³ : Preadditive C
D : Type u₂
inst✝² : Category.{v, u₂} D
inst✝¹ : Abelian D
F : C ⥤ D
G : D ⥤ C
inst✝ : G.PreservesZeroMorphisms
i : F ⋙ G ≅ 𝟭 C
adj : G ⊣ F
X✝ Y✝ : C
f : X✝ ⟶ Y✝
this✝ : PreservesColimits G
this : i.inv.app X✝ ≫ G.map (F.map f) ≫ i.hom.app Y✝ = f
⊢ HasCokernel f
state_after: C : Type u₁
inst✝⁴ : Category.{v, u₁} C
inst✝³ : Preadditive C
D : Type u₂
inst✝² : Category.{v, u₂} D
inst✝¹ : Abelian D
F : C ⥤ D
G : D ⥤ C
inst✝ : G.PreservesZeroMorphisms
i : F ⋙ G ≅ 𝟭 C
adj : G ⊣ F
X✝ Y✝ : C
f : X✝ ⟶ Y✝
this✝ : PreservesColimits G
this : i.inv.app X✝ ≫ G.map (F.map f) ≫ i.hom.app Y✝ = f
⊢ HasCokernel (i.inv.app X✝ ≫ G.map (F.map f) ≫ i.hom.app Y✝)
tactic: rw [← this]
state_before: C : Type u₁
inst✝⁴ : Category.{v, u₁} C
inst✝³ : Preadditive C
D : Type u₂
inst✝² : Category.{v, u₂} D
inst✝¹ : Abelian D
F : C ⥤ D
G : D ⥤ C
inst✝ : G.PreservesZeroMorphisms
i : F ⋙ G ≅ 𝟭 C
adj : G ⊣ F
X✝ Y✝ : C
f : X✝ ⟶ Y✝
this✝ : PreservesColimits G
this : i.inv.app X✝ ≫ G.map (F.map f) ≫ i.hom.app Y✝ = f
⊢ HasCokernel (i.inv.app X✝ ≫ G.map (F.map f) ≫ i.hom.app Y✝)
state_after: C : Type u₁
inst✝⁴ : Category.{v, u₁} C
inst✝³ : Preadditive C
D : Type u₂
inst✝² : Category.{v, u₂} D
inst✝¹ : Abelian D
F : C ⥤ D
G : D ⥤ C
inst✝ : G.PreservesZeroMorphisms
i : F ⋙ G ≅ 𝟭 C
adj : G ⊣ F
X✝ Y✝ : C
f : X✝ ⟶ Y✝
this✝¹ : PreservesColimits G
this✝ : i.inv.app X✝ ≫ G.map (F.map f) ≫ i.hom.app Y✝ = f
this : HasCokernel (G.map (F.map f) ≫ i.hom.app Y✝)
⊢ HasCokernel (i.inv.app X✝ ≫ G.map (F.map f) ≫ i.hom.app Y✝)
tactic: haveI : HasCokernel (G.map (F.map f) ≫ i.hom.app _) := Limits.hasCokernel_comp_iso _ _
state_before: C : Type u₁
inst✝⁴ : Category.{v, u₁} C
inst✝³ : Preadditive C
D : Type u₂
inst✝² : Category.{v, u₂} D
inst✝¹ : Abelian D
F : C ⥤ D
G : D ⥤ C
inst✝ : G.PreservesZeroMorphisms
i : F ⋙ G ≅ 𝟭 C
adj : G ⊣ F
X✝ Y✝ : C
f : X✝ ⟶ Y✝
this✝¹ : PreservesColimits G
this✝ : i.inv.app X✝ ≫ G.map (F.map f) ≫ i.hom.app Y✝ = f
this : HasCokernel (G.map (F.map f) ≫ i.hom.app Y✝)
⊢ HasCokernel (i.inv.app X✝ ≫ G.map (F.map f) ≫ i.hom.app Y✝)
state_after: no goals
tactic: apply Limits.hasCokernel_epi_comp