Theorem: CategoryTheory.AbelianOfAdjunction.coimageIsoImage_hom
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
inst✝³ : HasCokernels C
inst✝² : HasKernels C
inst✝¹ : PreservesFiniteLimits G
inst✝ : F.PreservesZeroMorphisms
X Y : C
f : X ⟶ Y
⊢ (coimageIsoImage F G i adj f).hom = Abelian.coimageImageComparison 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✝³ : HasCokernels C
inst✝² : HasKernels C
inst✝¹ : PreservesFiniteLimits G
inst✝ : F.PreservesZeroMorphisms
X Y : C
f : X ⟶ Y
⊢ ((((((((𝟙 (Abelian.coimage f) ≫
                      cokernel.desc (kernel.ι f) (i.inv.app X ≫ cokernel.π (kernel.ι f ≫ i.inv.app X)) ⋯ ≫
                        cokernel.desc (kernel.ι f ≫ i.inv.app X)
                            (cokernel.π (i.hom.app (kernel f) ≫ kernel.ι f ≫ i.inv.app X)) ⋯ ≫
                          (cokernelIsoOfEq ⋯).inv ≫ cokernelComparison (F.map (kernel.ι f)) G) ≫
                    G.map (cokernelIsoOfEq ⋯).hom) ≫
                  G.map
                    (cokernel.desc (kernelComparison f F ≫ kernel.ι (F.map f)) (cokernel.π (kernel.ι (F.map f))) ⋯)) ≫
                𝟙 (G.obj (cokernel (kernel.ι (F.map f))))) ≫
              G.map (Abelian.coimageImageComparison (F.map f))) ≫
            𝟙 (G.obj (Abelian.image (F.map f)))) ≫
          (PreservesKernel.iso G (cokernel.π (F.map f))).hom) ≫
        ((((((((kernelIsoOfEq ⋯).hom ≫
                        kernel.lift (cokernel.π (G.map (F.map f)))
                          (kernel.ι (cokernel.π (G.map (F.map f)) ≫ cokernelComparison (F.map f) G)) ⋯) ≫
                      (kernelIsoOfEq ⋯).hom) ≫
                    kernel.lift (cokernel.π (i.hom.app X ≫ f ≫ i.inv.app Y))
                      (kernel.ι (cokernel.π (i.hom.app X ≫ f ≫ i.inv.app Y) ≫ (cokernelIsoOfEq ⋯).hom)) ⋯) ≫
                  (kernelIsoOfEq ⋯).hom) ≫
                kernel.lift (cokernel.π (f ≫ i.inv.app Y))
                  (kernel.ι
                    (cokernel.π (f ≫ i.inv.app Y) ≫
                      cokernel.desc (f ≫ i.inv.app Y) (cokernel.π (i.hom.app X ≫ f ≫ i.inv.app Y)) ⋯))
                  ⋯) ≫
              (kernelIsoOfEq ⋯).hom) ≫
            kernel.lift (cokernel.π f ≫ cokernel.desc f (i.inv.app Y ≫ cokernel.π (f ≫ i.inv.app Y)) ⋯)
              (kernel.ι
                  (inv (i.inv.app Y) ≫ cokernel.π f ≫ cokernel.desc f (i.inv.app Y ≫ cokernel.π (f ≫ i.inv.app Y)) ⋯) ≫
                inv (i.inv.app Y))
              ⋯) ≫
          kernel.lift (cokernel.π f)
            (kernel.ι (cokernel.π f ≫ cokernel.desc f (i.inv.app Y ≫ cokernel.π (f ≫ i.inv.app Y)) ⋯)) ⋯) ≫
      𝟙 (kernel (cokernel.π f)) =
    Abelian.coimageImageComparison f
tactic: dsimp [coimageIsoImage, cokernelIso, cokernelEpiComp, cokernelCompIsIso_inv,
    coimageIsoImageAux, kernelCompMono]
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✝³ : HasCokernels C
inst✝² : HasKernels C
inst✝¹ : PreservesFiniteLimits G
inst✝ : F.PreservesZeroMorphisms
X Y : C
f : X ⟶ Y
⊢ ((((((((𝟙 (Abelian.coimage f) ≫
                      cokernel.desc (kernel.ι f) (i.inv.app X ≫ cokernel.π (kernel.ι f ≫ i.inv.app X)) ⋯ ≫
                        cokernel.desc (kernel.ι f ≫ i.inv.app X)
                            (cokernel.π (i.hom.app (kernel f) ≫ kernel.ι f ≫ i.inv.app X)) ⋯ ≫
                          (cokernelIsoOfEq ⋯).inv ≫ cokernelComparison (F.map (kernel.ι f)) G) ≫
                    G.map (cokernelIsoOfEq ⋯).hom) ≫
                  G.map
                    (cokernel.desc (kernelComparison f F ≫ kernel.ι (F.map f)) (cokernel.π (kernel.ι (F.map f))) ⋯)) ≫
                𝟙 (G.obj (cokernel (kernel.ι (F.map f))))) ≫
              G.map (Abelian.coimageImageComparison (F.map f))) ≫
            𝟙 (G.obj (Abelian.image (F.map f)))) ≫
          (PreservesKernel.iso G (cokernel.π (F.map f))).hom) ≫
        ((((((((kernelIsoOfEq ⋯).hom ≫
                        kernel.lift (cokernel.π (G.map (F.map f)))
                          (kernel.ι (cokernel.π (G.map (F.map f)) ≫ cokernelComparison (F.map f) G)) ⋯) ≫
                      (kernelIsoOfEq ⋯).hom) ≫
                    kernel.lift (cokernel.π (i.hom.app X ≫ f ≫ i.inv.app Y))
                      (kernel.ι (cokernel.π (i.hom.app X ≫ f ≫ i.inv.app Y) ≫ (cokernelIsoOfEq ⋯).hom)) ⋯) ≫
                  (kernelIsoOfEq ⋯).hom) ≫
                kernel.lift (cokernel.π (f ≫ i.inv.app Y))
                  (kernel.ι
                    (cokernel.π (f ≫ i.inv.app Y) ≫
                      cokernel.desc (f ≫ i.inv.app Y) (cokernel.π (i.hom.app X ≫ f ≫ i.inv.app Y)) ⋯))
                  ⋯) ≫
              (kernelIsoOfEq ⋯).hom) ≫
            kernel.lift (cokernel.π f ≫ cokernel.desc f (i.inv.app Y ≫ cokernel.π (f ≫ i.inv.app Y)) ⋯)
              (kernel.ι
                  (inv (i.inv.app Y) ≫ cokernel.π f ≫ cokernel.desc f (i.inv.app Y ≫ cokernel.π (f ≫ i.inv.app Y)) ⋯) ≫
                inv (i.inv.app Y))
              ⋯) ≫
          kernel.lift (cokernel.π f)
            (kernel.ι (cokernel.π f ≫ cokernel.desc f (i.inv.app Y ≫ cokernel.π (f ≫ i.inv.app Y)) ⋯)) ⋯) ≫
      𝟙 (kernel (cokernel.π f)) =
    Abelian.coimageImageComparison f
state_after: no goals
tactic: simpa only [← cancel_mono (Abelian.image.ι f), ← cancel_epi (Abelian.coimage.π f),
    Category.assoc, Category.id_comp, cokernel.π_desc_assoc,
    π_comp_cokernelIsoOfEq_inv_assoc, PreservesKernel.iso_hom,
    π_comp_cokernelComparison_assoc, ← G.map_comp_assoc, kernel.lift_ι,
    Abelian.coimage_image_factorisation, lift_comp_kernelIsoOfEq_hom_assoc,
    kernelIsIsoComp_hom, kernel.lift_ι_assoc, kernelIsoOfEq_hom_comp_ι_assoc,
    kernelComparison_comp_ι_assoc, π_comp_cokernelIsoOfEq_hom_assoc,
    asIso_hom, NatIso.inv_inv_app] using NatIso.naturality_1 i f