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

tactic: rw [← f.2 1 0 rfl]
state_before: ι : Type u_1
V : Type u
inst✝⁸ : Category.{v, u} 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.{?u.22921, u_2} W
inst✝ : Abelian W
X : ChainComplex W ℕ
Y : W
f : X ⟶ (ChainComplex.single₀ W).obj Y
hf✝ hf : QuasiIso' f
⊢ X.d 1 0 ≫ f.f 0 = 0
state_after: ι : Type u_1
V : Type u
inst✝⁸ : Category.{v, u} 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.{?u.22921, u_2} W
inst✝ : Abelian W
X : ChainComplex W ℕ
Y : W
f : X ⟶ (ChainComplex.single₀ W).obj Y
hf✝ hf : QuasiIso' f
⊢ f.f 1 ≫ ((ChainComplex.single₀ W).obj Y).d 1 0 = 0

tactic: exact comp_zero
state_before: ι : Type u_1
V : Type u
inst✝⁸ : Category.{v, u} 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.{?u.22921, u_2} W
inst✝ : Abelian W
X : ChainComplex W ℕ
Y : W
f : X ⟶ (ChainComplex.single₀ W).obj Y
hf✝ hf : QuasiIso' f
⊢ f.f 1 ≫ ((ChainComplex.single₀ W).obj Y).d 1 0 = 0
state_after: no goals

tactic: ext
state_before: ι : Type u_1
V : Type u
inst✝⁸ : Category.{v, u} 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.{u_3, u_2} 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 (X.d 1 0) (f.f 0) ⋯
state_after: case h
ι : Type u_1
V : Type u
inst✝⁸ : Category.{v, u} 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.{u_3, u_2} W
inst✝ : Abelian W
X : ChainComplex W ℕ
Y : W
f : X ⟶ (ChainComplex.single₀ W).obj Y
hf✝ hf : QuasiIso' f
⊢ coequalizer.π (X.d 1 0) 0 ≫ (toSingle₀CokernelAtZeroIso f).hom =
    coequalizer.π (X.d 1 0) 0 ≫ cokernel.desc (X.d 1 0) (f.f 0) ⋯

tactic: dsimp only [toSingle₀CokernelAtZeroIso, ChainComplex.homology'ZeroIso, homology'OfZeroRight,
  homology'.mapIso, ChainComplex.homology'Functor0Single₀, cokernel.map]
state_before: case h
ι : Type u_1
V : Type u
inst✝⁸ : Category.{v, u} 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.{u_3, u_2} W
inst✝ : Abelian W
X : ChainComplex W ℕ
Y : W
f : X ⟶ (ChainComplex.single₀ W).obj Y
hf✝ hf : QuasiIso' f
⊢ coequalizer.π (X.d 1 0) 0 ≫ (toSingle₀CokernelAtZeroIso f).hom =
    coequalizer.π (X.d 1 0) 0 ≫ cokernel.desc (X.d 1 0) (f.f 0) ⋯
state_after: case h
ι : Type u_1
V : Type u
inst✝⁸ : Category.{v, u} 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.{u_3, u_2} W
inst✝ : Abelian W
X : ChainComplex W ℕ
Y : W
f : X ⟶ (ChainComplex.single₀ W).obj Y
hf✝ hf : QuasiIso' f
⊢ coequalizer.π (X.d 1 0) 0 ≫
      (({
                hom :=
                  homology'.map ⋯ ⋯
                    (Arrow.isoMk (xPrevIso X ChainComplex.homology'ZeroIso.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
                    ⋯,
                inv :=
                  homology'.map ⋯ ⋯
                    (Arrow.isoMk (xPrevIso X ChainComplex.homology'ZeroIso.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
                    ⋯,
                hom_inv_id := ⋯, inv_hom_id := ⋯ } ≪≫
              cokernel.mapIso (imageToKernel (X.d 1 0) 0 ⋯) (image.ι (X.d 1 0)) (imageSubobjectIso (X.d 1 0))
                  (kernelSubobjectIso 0 ≪≫ kernelZeroIsoSource) ⋯ ≪≫
                cokernelImageι (X.d 1 0)).symm ≪≫
          asIso ((homology'Functor W (ComplexShape.down ℕ) 0).map f) ≪≫
            (NatIso.ofComponents (fun X => homology'.congr ⋯ ⋯ ⋯ ⋯ ≪≫ homology'ZeroZero) ⋯).app Y).hom =
    coequalizer.π (X.d 1 0) 0 ≫ cokernel.desc (X.d 1 0) (f.f 0) ⋯

tactic: dsimp [asIso]
state_before: case h
ι : Type u_1
V : Type u
inst✝⁸ : Category.{v, u} 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.{u_3, u_2} W
inst✝ : Abelian W
X : ChainComplex W ℕ
Y : W
f : X ⟶ (ChainComplex.single₀ W).obj Y
hf✝ hf : QuasiIso' f
⊢ coequalizer.π (X.d 1 0) 0 ≫
      (({
                hom :=
                  homology'.map ⋯ ⋯
                    (Arrow.isoMk (xPrevIso X ChainComplex.homology'ZeroIso.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
                    ⋯,
                inv :=
                  homology'.map ⋯ ⋯
                    (Arrow.isoMk (xPrevIso X ChainComplex.homology'ZeroIso.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
                    ⋯,
                hom_inv_id := ⋯, inv_hom_id := ⋯ } ≪≫
              cokernel.mapIso (imageToKernel (X.d 1 0) 0 ⋯) (image.ι (X.d 1 0)) (imageSubobjectIso (X.d 1 0))
                  (kernelSubobjectIso 0 ≪≫ kernelZeroIsoSource) ⋯ ≪≫
                cokernelImageι (X.d 1 0)).symm ≪≫
          asIso ((homology'Functor W (ComplexShape.down ℕ) 0).map f) ≪≫
            (NatIso.ofComponents (fun X => homology'.congr ⋯ ⋯ ⋯ ⋯ ≪≫ homology'ZeroZero) ⋯).app Y).hom =
    coequalizer.π (X.d 1 0) 0 ≫ cokernel.desc (X.d 1 0) (f.f 0) ⋯
state_after: case h
ι : Type u_1
V : Type u
inst✝⁸ : Category.{v, u} 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.{u_3, u_2} W
inst✝ : Abelian W
X : ChainComplex W ℕ
Y : W
f : X ⟶ (ChainComplex.single₀ W).obj Y
hf✝ hf : QuasiIso' f
⊢ cokernel.π (X.d 1 0) ≫
      ((cokernel.desc (X.d 1 0) (cokernel.π (image.ι (X.d 1 0))) ⋯ ≫
            cokernel.map (image.ι (X.d 1 0)) (imageToKernel (X.d 1 0) 0 ⋯) (imageSubobjectIso (X.d 1 0)).inv
              (kernelZeroIsoSource.inv ≫ (kernelSubobjectIso 0).inv) ⋯) ≫
          homology'.map ⋯ ⋯ (Arrow.isoMk (xPrevIso X ChainComplex.homology'ZeroIso.proof_10) (Iso.refl (X.X 0)) ⋯).inv
            (Arrow.isoMk (Iso.refl (X.X 0)) (Iso.refl (xNext X 0)) ⋯).inv ⋯) ≫
        homology'.map ⋯ ⋯ (sqTo f 0) (sqFrom f 0) ⋯ ≫
          homology'.map ⋯ ⋯ { left := 𝟙 (xPrev ((ChainComplex.single₀ W).obj Y) 0), right := 𝟙 Y, w := ⋯ }
              { left := 𝟙 Y, right := 𝟙 (xNext ((ChainComplex.single₀ W).obj Y) 0), w := ⋯ } ⋯ ≫
            homology'.desc 0 0 ⋯ (kernelSubobject 0).arrow ⋯ =
    cokernel.π (X.d 1 0) ≫ cokernel.desc (X.d 1 0) (f.f 0) ⋯

tactic: simp only [cokernel.π_desc, Category.assoc, homology'.map_desc, cokernel.π_desc_assoc]
state_before: case h
ι : Type u_1
V : Type u
inst✝⁸ : Category.{v, u} 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.{u_3, u_2} W
inst✝ : Abelian W
X : ChainComplex W ℕ
Y : W
f : X ⟶ (ChainComplex.single₀ W).obj Y
hf✝ hf : QuasiIso' f
⊢ cokernel.π (X.d 1 0) ≫
      ((cokernel.desc (X.d 1 0) (cokernel.π (image.ι (X.d 1 0))) ⋯ ≫
            cokernel.map (image.ι (X.d 1 0)) (imageToKernel (X.d 1 0) 0 ⋯) (imageSubobjectIso (X.d 1 0)).inv
              (kernelZeroIsoSource.inv ≫ (kernelSubobjectIso 0).inv) ⋯) ≫
          homology'.map ⋯ ⋯ (Arrow.isoMk (xPrevIso X ChainComplex.homology'ZeroIso.proof_10) (Iso.refl (X.X 0)) ⋯).inv
            (Arrow.isoMk (Iso.refl (X.X 0)) (Iso.refl (xNext X 0)) ⋯).inv ⋯) ≫
        homology'.map ⋯ ⋯ (sqTo f 0) (sqFrom f 0) ⋯ ≫
          homology'.map ⋯ ⋯ { left := 𝟙 (xPrev ((ChainComplex.single₀ W).obj Y) 0), right := 𝟙 Y, w := ⋯ }
              { left := 𝟙 Y, right := 𝟙 (xNext ((ChainComplex.single₀ W).obj Y) 0), w := ⋯ } ⋯ ≫
            homology'.desc 0 0 ⋯ (kernelSubobject 0).arrow ⋯ =
    cokernel.π (X.d 1 0) ≫ cokernel.desc (X.d 1 0) (f.f 0) ⋯
state_after: case h
ι : Type u_1
V : Type u
inst✝⁸ : Category.{v, u} 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.{u_3, u_2} 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 (X.d 1 0) 0 ⋯) ≫
          homology'.desc (X.d 1 0) 0 ⋯
            (kernelSubobjectMap (Arrow.isoMk (Iso.refl (X.X 0)) (Iso.refl (xNext X 0)) ⋯).inv ≫
              kernelSubobjectMap (sqFrom f 0) ≫
                kernelSubobjectMap { left := 𝟙 Y, right := 𝟙 (xNext ((ChainComplex.single₀ W).obj Y) 0), w := ⋯ } ≫
                  (kernelSubobject 0).arrow)
            ⋯ =
    f.f 0

tactic: simp [homology'.desc, Iso.refl_inv (X.X 0)]
state_before: case h
ι : Type u_1
V : Type u
inst✝⁸ : Category.{v, u} 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.{u_3, u_2} 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 (X.d 1 0) 0 ⋯) ≫
          homology'.desc (X.d 1 0) 0 ⋯
            (kernelSubobjectMap (Arrow.isoMk (Iso.refl (X.X 0)) (Iso.refl (xNext X 0)) ⋯).inv ≫
              kernelSubobjectMap (sqFrom f 0) ≫
                kernelSubobjectMap { left := 𝟙 Y, right := 𝟙 (xNext ((ChainComplex.single₀ W).obj Y) 0), w := ⋯ } ≫
                  (kernelSubobject 0).arrow)
            ⋯ =
    f.f 0
state_after: no goals