Theorem: HomologicalComplex.Hom.toSingle₀CokernelAtZeroIso_hom_eq
File: Mathlib/Algebra/Homology/QuasiIso.lean

tactic: rw [← f.2 1 0 rfl]
state_before: ι : Type ?u.23209
V : Type u
inst✝⁸ : Category V
inst✝⁷ : HasZeroMorphisms V
inst✝⁶ : HasZeroObject V
inst✝⁵ : HasEqualizers V
inst✝⁴ : HasImages V
inst✝³ : HasImageMaps V
inst✝² : HasCokernels V
c : ComplexShape ι
C D E : HomologicalComplex V c
W : Type ?u.23383
inst✝¹ : Category W
inst✝ : Abelian W
X : ChainComplex W ℕ
Y : W
f : X ⟶ (ChainComplex.single₀ W).obj Y
hf✝ hf : QuasiIso f
⊢ d X 1 0 ≫ HomologicalComplex.Hom.f f 0 = 0

tactic: exact comp_zero
state_before: ι : Type ?u.23209
V : Type u
inst✝⁸ : Category V
inst✝⁷ : HasZeroMorphisms V
inst✝⁶ : HasZeroObject V
inst✝⁵ : HasEqualizers V
inst✝⁴ : HasImages V
inst✝³ : HasImageMaps V
inst✝² : HasCokernels V
c : ComplexShape ι
C D E : HomologicalComplex V c
W : Type ?u.23383
inst✝¹ : Category W
inst✝ : Abelian W
X : ChainComplex W ℕ
Y : W
f : X ⟶ (ChainComplex.single₀ W).obj Y
hf✝ hf : QuasiIso f
⊢ HomologicalComplex.Hom.f f 1 ≫ d ((ChainComplex.single₀ W).obj Y) 1 0 = 0

tactic: apply coequalizer.hom_ext
state_before: ι : Type ?u.23209
V : Type u
inst✝⁸ : Category V
inst✝⁷ : HasZeroMorphisms V
inst✝⁶ : HasZeroObject V
inst✝⁵ : HasEqualizers V
inst✝⁴ : HasImages V
inst✝³ : HasImageMaps V
inst✝² : HasCokernels V
c : ComplexShape ι
C D E : HomologicalComplex V c
W : Type u_2
inst✝¹ : Category W
inst✝ : Abelian W
X : ChainComplex W ℕ
Y : W
f : X ⟶ (ChainComplex.single₀ W).obj Y
hf✝ hf : QuasiIso f
⊢ (toSingle₀CokernelAtZeroIso f).hom =
    cokernel.desc (d X 1 0) (HomologicalComplex.Hom.f f 0) (_ : d X 1 0 ≫ HomologicalComplex.Hom.f f 0 = 0)

tactic: dsimp only [toSingle₀CokernelAtZeroIso, ChainComplex.homologyZeroIso, homologyOfZeroRight,
  homology.mapIso, ChainComplex.homologyFunctor0Single₀, cokernel.map]
state_before: case h
ι : Type ?u.23209
V : Type u
inst✝⁸ : Category V
inst✝⁷ : HasZeroMorphisms V
inst✝⁶ : HasZeroObject V
inst✝⁵ : HasEqualizers V
inst✝⁴ : HasImages V
inst✝³ : HasImageMaps V
inst✝² : HasCokernels V
c : ComplexShape ι
C D E : HomologicalComplex V c
W : Type u_2
inst✝¹ : Category W
inst✝ : Abelian W
X : ChainComplex W ℕ
Y : W
f : X ⟶ (ChainComplex.single₀ W).obj Y
hf✝ hf : QuasiIso f
⊢ coequalizer.π (d X 1 0) 0 ≫ (toSingle₀CokernelAtZeroIso f).hom =
    coequalizer.π (d X 1 0) 0 ≫
      cokernel.desc (d X 1 0) (HomologicalComplex.Hom.f f 0) (_ : d X 1 0 ≫ HomologicalComplex.Hom.f f 0 = 0)

tactic: dsimp [asIso]
state_before: case h
ι : Type ?u.23209
V : Type u
inst✝⁸ : Category V
inst✝⁷ : HasZeroMorphisms V
inst✝⁶ : HasZeroObject V
inst✝⁵ : HasEqualizers V
inst✝⁴ : HasImages V
inst✝³ : HasImageMaps V
inst✝² : HasCokernels V
c : ComplexShape ι
C D E : HomologicalComplex V c
W : Type u_2
inst✝¹ : Category W
inst✝ : Abelian W
X : ChainComplex W ℕ
Y : W
f : X ⟶ (ChainComplex.single₀ W).obj Y
hf✝ hf : QuasiIso f
⊢ coequalizer.π (d X 1 0) 0 ≫
      ((Iso.mk
                (homology.map (_ : dTo X 0 ≫ dFrom X 0 = 0) (_ : d X 1 0 ≫ 0 = 0)
                  (Arrow.isoMk (xPrevIso X ChainComplex.homologyZeroIso.proof_10)
                      (Iso.refl (Arrow.mk (dTo X 0)).right)).hom
                  (Arrow.isoMk (Iso.refl (Arrow.mk (dFrom X 0)).left) (Iso.refl (Arrow.mk (dFrom X 0)).right)).hom
                  (_ :
                    (Arrow.isoMk (xPrevIso X (_ : 0 + 1 = 0 + 1)) (Iso.refl (Arrow.mk (dTo X 0)).right)).hom.right =
                      (Arrow.isoMk (xPrevIso X (_ : 0 + 1 = 0 + 1)) (Iso.refl (Arrow.mk (dTo X 0)).right)).hom.right))
                (homology.map (_ : d X 1 0 ≫ 0 = 0) (_ : dTo X 0 ≫ dFrom X 0 = 0)
                  (Arrow.isoMk (xPrevIso X ChainComplex.homologyZeroIso.proof_10)
                      (Iso.refl (Arrow.mk (dTo X 0)).right)).inv
                  (Arrow.isoMk (Iso.refl (Arrow.mk (dFrom X 0)).left) (Iso.refl (Arrow.mk (dFrom X 0)).right)).inv
                  (_ :
                    (Arrow.isoMk (xPrevIso X ChainComplex.homologyZeroIso.proof_10)
                            (Iso.refl (Arrow.mk (dTo X 0)).right)).inv.right =
                      (Arrow.isoMk (Iso.refl (Arrow.mk (dFrom X 0)).left)
                            (Iso.refl (Arrow.mk (dFrom X 0)).right)).inv.left)) ≪≫
              cokernel.mapIso (imageToKernel (d X 1 0) 0 (_ : d X 1 0 ≫ 0 = 0)) (image.ι (d X 1 0))
                  (imageSubobjectIso (d X 1 0)) (kernelSubobjectIso 0 ≪≫ kernelZeroIsoSource)
                  (_ :
                    imageToKernel (d X 1 0) 0 (_ : d X 1 0 ≫ 0 = 0) ≫ (kernelSubobjectIso 0).hom ≫ kernel.ι 0 =
                      (imageSubobjectIso (d X 1 0)).hom ≫ image.ι (d X 1 0)) ≪≫
                cokernelImageι (d X 1 0)).symm ≪≫
          asIso ((homologyFunctor W (ComplexShape.down ℕ) 0).map f) ≪≫
            (NatIso.ofComponents fun X =>
                  homology.congr
                      (_ : dTo ((ChainComplex.single₀ W).obj X) 0 ≫ dFrom ((ChainComplex.single₀ W).obj X) 0 = 0)
                      (_ : 0 ≫ 0 = 0) (_ : 0 = 0)
                      (_ : d ((ChainComplex.single₀ W).obj X) 0 (ComplexShape.next (ComplexShape.down ℕ) 0) = 0) ≪≫
                    homologyZeroZero).app
              Y).hom =
    coequalizer.π (d X 1 0) 0 ≫
      cokernel.desc (d X 1 0) (HomologicalComplex.Hom.f f 0) (_ : d X 1 0 ≫ HomologicalComplex.Hom.f f 0 = 0)

tactic: simp only [cokernel.π_desc, Category.assoc, homology.map_desc, cokernel.π_desc_assoc]
state_before: case h
ι : Type ?u.23209
V : Type u
inst✝⁸ : Category V
inst✝⁷ : HasZeroMorphisms V
inst✝⁶ : HasZeroObject V
inst✝⁵ : HasEqualizers V
inst✝⁴ : HasImages V
inst✝³ : HasImageMaps V
inst✝² : HasCokernels V
c : ComplexShape ι
C D E : HomologicalComplex V c
W : Type u_2
inst✝¹ : Category W
inst✝ : Abelian W
X : ChainComplex W ℕ
Y : W
f : X ⟶ (ChainComplex.single₀ W).obj Y
hf✝ hf : QuasiIso f
⊢ cokernel.π (d X 1 0) ≫
      ((cokernel.desc (d X 1 0) (cokernel.π (image.ι (d X 1 0))) (_ : d X 1 0 ≫ cokernel.π (image.ι (d X 1 0)) = 0) ≫
            cokernel.map (image.ι (d X 1 0)) (imageToKernel (d X 1 0) 0 (_ : d X 1 0 ≫ 0 = 0))
              (imageSubobjectIso (d X 1 0)).inv (kernelZeroIsoSource.inv ≫ (kernelSubobjectIso 0).inv)
              (_ :
                image.ι (d X 1 0) ≫ (kernelSubobjectIso 0 ≪≫ kernelZeroIsoSource).inv =
                  (imageSubobjectIso (d X 1 0)).inv ≫ imageToKernel (d X 1 0) 0 (_ : d X 1 0 ≫ 0 = 0))) ≫
          homology.map (_ : d X 1 0 ≫ 0 = 0) (_ : dTo X 0 ≫ dFrom X 0 = 0)
            (Arrow.isoMk (xPrevIso X ChainComplex.homologyZeroIso.proof_10) (Iso.refl (HomologicalComplex.X X 0))).inv
            (Arrow.isoMk (Iso.refl (HomologicalComplex.X X 0)) (Iso.refl (xNext X 0))).inv
            (_ :
              (Arrow.isoMk (xPrevIso X ChainComplex.homologyZeroIso.proof_10)
                      (Iso.refl (HomologicalComplex.X X 0))).inv.right =
                (Arrow.isoMk (Iso.refl (HomologicalComplex.X X 0)) (Iso.refl (xNext X 0))).inv.left)) ≫
        homology.map (_ : dTo X 0 ≫ dFrom X 0 = 0)
            (_ : dTo ((ChainComplex.single₀ W).obj Y) 0 ≫ dFrom ((ChainComplex.single₀ W).obj Y) 0 = 0) (sqTo f 0)
            (sqFrom f 0) (_ : (sqTo f 0).right = (sqTo f 0).right) ≫
          homology.map (_ : dTo ((ChainComplex.single₀ W).obj Y) 0 ≫ dFrom ((ChainComplex.single₀ W).obj Y) 0 = 0)
              (_ : 0 ≫ 0 = 0) (CommaMorphism.mk (𝟙 (xPrev ((ChainComplex.single₀ W).obj Y) 0)) (𝟙 Y))
              (CommaMorphism.mk (𝟙 Y) (𝟙 (xNext ((ChainComplex.single₀ W).obj Y) 0)))
              (_ :
                (CommaMorphism.mk (𝟙 (Arrow.mk 0).left) (𝟙 (Arrow.mk 0).right)).right =
                  (CommaMorphism.mk (𝟙 (Arrow.mk 0).left) (𝟙 (Arrow.mk 0).right)).right) ≫
            homology.desc 0 0 (_ : 0 ≫ 0 = 0) (Subobject.arrow (kernelSubobject 0))
              (_ : imageToKernel 0 0 (_ : 0 ≫ 0 = 0) ≫ Subobject.arrow (kernelSubobject 0) = 0) =
    cokernel.π (d X 1 0) ≫
      cokernel.desc (d X 1 0) (HomologicalComplex.Hom.f f 0) (_ : d X 1 0 ≫ HomologicalComplex.Hom.f f 0 = 0)

tactic: simp [homology.desc, Iso.refl_inv (X.X 0)]
state_before: case h
ι : Type ?u.23209
V : Type u
inst✝⁸ : Category V
inst✝⁷ : HasZeroMorphisms V
inst✝⁶ : HasZeroObject V
inst✝⁵ : HasEqualizers V
inst✝⁴ : HasImages V
inst✝³ : HasImageMaps V
inst✝² : HasCokernels V
c : ComplexShape ι
C D E : HomologicalComplex V c
W : Type u_2
inst✝¹ : Category W
inst✝ : Abelian W
X : ChainComplex W ℕ
Y : W
f : X ⟶ (ChainComplex.single₀ W).obj Y
hf✝ hf : QuasiIso f
⊢ kernelZeroIsoSource.inv ≫
      (kernelSubobjectIso 0).inv ≫
        cokernel.π (imageToKernel (d X 1 0) 0 (_ : d X 1 0 ≫ 0 = 0)) ≫
          homology.desc (d X 1 0) 0 (_ : d X 1 0 ≫ 0 = 0)
            (kernelSubobjectMap (Arrow.isoMk (Iso.refl (HomologicalComplex.X X 0)) (Iso.refl (xNext X 0))).inv ≫
              kernelSubobjectMap (sqFrom f 0) ≫
                kernelSubobjectMap (CommaMorphism.mk (𝟙 Y) (𝟙 (xNext ((ChainComplex.single₀ W).obj Y) 0))) ≫
                  Subobject.arrow (kernelSubobject 0))
            (_ :
              imageToKernel (d X 1 0) 0 (_ : d X 1 0 ≫ 0 = 0) ≫
                  kernelSubobjectMap (Arrow.isoMk (Iso.refl (HomologicalComplex.X X 0)) (Iso.refl (xNext X 0))).inv ≫
                    kernelSubobjectMap (sqFrom f 0) ≫
                      kernelSubobjectMap (CommaMorphism.mk (𝟙 Y) (𝟙 (xNext ((ChainComplex.single₀ W).obj Y) 0))) ≫
                        Subobject.arrow (kernelSubobject 0) =
                0) =
    HomologicalComplex.Hom.f f 0