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

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
inst✝ : PreservesFiniteLimits G
X✝ Y✝ : C
f : X✝ ⟶ Y✝
⊢ HasKernel 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
inst✝ : PreservesFiniteLimits G
X✝ Y✝ : C
f : X✝ ⟶ Y✝
this : i.inv.app X✝ ≫ (F ⋙ G).map f ≫ i.hom.app Y✝ = (𝟭 C).map f
⊢ HasKernel 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
inst✝ : PreservesFiniteLimits G
X✝ Y✝ : C
f : X✝ ⟶ Y✝
this : i.inv.app X✝ ≫ (F ⋙ G).map f ≫ i.hom.app Y✝ = (𝟭 C).map f
⊢ HasKernel 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
inst✝ : PreservesFiniteLimits G
X✝ Y✝ : C
f : X✝ ⟶ Y✝
this : i.inv.app X✝ ≫ G.map (F.map f) ≫ i.hom.app Y✝ = f
⊢ HasKernel f

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
inst✝ : PreservesFiniteLimits G
X✝ Y✝ : C
f : X✝ ⟶ Y✝
this : i.inv.app X✝ ≫ G.map (F.map f) ≫ i.hom.app Y✝ = f
⊢ HasKernel 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
inst✝ : PreservesFiniteLimits G
X✝ Y✝ : C
f : X✝ ⟶ Y✝
this : i.inv.app X✝ ≫ G.map (F.map f) ≫ i.hom.app Y✝ = f
⊢ HasKernel (i.inv.app X✝ ≫ G.map (F.map f) ≫ i.hom.app Y✝)

tactic: haveI : HasKernel (G.map (F.map f) ≫ i.hom.app _) := Limits.hasKernel_comp_mono _ _
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
inst✝ : PreservesFiniteLimits G
X✝ Y✝ : C
f : X✝ ⟶ Y✝
this : i.inv.app X✝ ≫ G.map (F.map f) ≫ i.hom.app Y✝ = f
⊢ HasKernel (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
inst✝ : PreservesFiniteLimits G
X✝ Y✝ : C
f : X✝ ⟶ Y✝
this✝ : i.inv.app X✝ ≫ G.map (F.map f) ≫ i.hom.app Y✝ = f
this : HasKernel (G.map (F.map f) ≫ i.hom.app Y✝)
⊢ HasKernel (i.inv.app X✝ ≫ G.map (F.map f) ≫ i.hom.app Y✝)

tactic: apply Limits.hasKernel_iso_comp
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
inst✝ : PreservesFiniteLimits G
X✝ Y✝ : C
f : X✝ ⟶ Y✝
this✝ : i.inv.app X✝ ≫ G.map (F.map f) ≫ i.hom.app Y✝ = f
this : HasKernel (G.map (F.map f) ≫ i.hom.app Y✝)
⊢ HasKernel (i.inv.app X✝ ≫ G.map (F.map f) ≫ i.hom.app Y✝)
state_after: no goals

tactic: 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
inst✝ : PreservesFiniteLimits G
X✝ Y✝ : C
f : X✝ ⟶ Y✝
this : i.inv.app X✝ ≫ (F ⋙ G).map f ≫ i.hom.app Y✝ = (𝟭 C).map f
⊢ HasKernel 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
inst✝ : PreservesFiniteLimits G
X✝ Y✝ : C
f : X✝ ⟶ Y✝
this : i.inv.app X✝ ≫ G.map (F.map f) ≫ i.hom.app Y✝ = f
⊢ HasKernel f