Theorem: HomologicalComplex.Hom.fromSingle₀KernelAtZeroIso_inv_eq
File: Mathlib/Algebra/Homology/QuasiIso.lean

tactic: rw [f.2 0 1 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.59811, u_2} W
inst✝ : Abelian W
X : CochainComplex W ℕ
Y : W
f : (CochainComplex.single₀ W).obj Y ⟶ X
hf : QuasiIso' f
⊢ f.f 0 ≫ X.d 0 1 = 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.59811, u_2} W
inst✝ : Abelian W
X : CochainComplex W ℕ
Y : W
f : (CochainComplex.single₀ W).obj Y ⟶ X
hf : QuasiIso' f
⊢ ((CochainComplex.single₀ W).obj Y).d 0 1 ≫ f.f 1 = 0

tactic: exact zero_comp
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.59811, u_2} W
inst✝ : Abelian W
X : CochainComplex W ℕ
Y : W
f : (CochainComplex.single₀ W).obj Y ⟶ X
hf : QuasiIso' f
⊢ ((CochainComplex.single₀ W).obj Y).d 0 1 ≫ f.f 1 = 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 : CochainComplex W ℕ
Y : W
f : (CochainComplex.single₀ W).obj Y ⟶ X
hf : QuasiIso' f
⊢ (fromSingle₀KernelAtZeroIso f).inv = kernel.lift (X.d 0 1) (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 : CochainComplex W ℕ
Y : W
f : (CochainComplex.single₀ W).obj Y ⟶ X
hf : QuasiIso' f
⊢ (fromSingle₀KernelAtZeroIso f).inv ≫ equalizer.ι (X.d 0 1) 0 =
    kernel.lift (X.d 0 1) (f.f 0) ⋯ ≫ equalizer.ι (X.d 0 1) 0

tactic: dsimp only [fromSingle₀KernelAtZeroIso, CochainComplex.homology'ZeroIso, homology'OfZeroLeft,
  homology'.mapIso, CochainComplex.homologyFunctor0Single₀, kernel.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 : CochainComplex W ℕ
Y : W
f : (CochainComplex.single₀ W).obj Y ⟶ X
hf : QuasiIso' f
⊢ (fromSingle₀KernelAtZeroIso f).inv ≫ equalizer.ι (X.d 0 1) 0 =
    kernel.lift (X.d 0 1) (f.f 0) ⋯ ≫ equalizer.ι (X.d 0 1) 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 : CochainComplex W ℕ
Y : W
f : (CochainComplex.single₀ W).obj Y ⟶ X
hf : QuasiIso' f
⊢ (({
                hom :=
                  homology'.map ⋯ ⋯
                    (Arrow.isoMk (xPrevIsoSelf X CochainComplex.homology'ZeroIso.proof_9)
                        (Iso.refl (Arrow.mk (dTo X 0)).right) ⋯).hom
                    (Arrow.isoMk (Iso.refl (Arrow.mk (dFrom X 0)).left)
                        (xNextIso X CochainComplex.homology'ZeroIso.proof_11) ⋯).hom
                    ⋯,
                inv :=
                  homology'.map ⋯ ⋯
                    (Arrow.isoMk (xPrevIsoSelf X CochainComplex.homology'ZeroIso.proof_9)
                        (Iso.refl (Arrow.mk (dTo X 0)).right) ⋯).inv
                    (Arrow.isoMk (Iso.refl (Arrow.mk (dFrom X 0)).left)
                        (xNextIso X CochainComplex.homology'ZeroIso.proof_11) ⋯).inv
                    ⋯,
                hom_inv_id := ⋯, inv_hom_id := ⋯ } ≪≫
              (cokernelIsoOfEq ⋯ ≪≫ cokernelZeroIsoTarget) ≪≫ kernelSubobjectIso (X.d 0 1)).symm ≪≫
          (asIso ((homology'Functor W (ComplexShape.up ℕ) 0).map f)).symm ≪≫
            (NatIso.ofComponents (fun X => homology'.congr ⋯ ⋯ ⋯ ⋯ ≪≫ homology'ZeroZero) ⋯).app Y).inv ≫
      equalizer.ι (X.d 0 1) 0 =
    kernel.lift (X.d 0 1) (f.f 0) ⋯ ≫ equalizer.ι (X.d 0 1) 0

tactic: simp only [Iso.trans_inv, Iso.app_inv, Iso.symm_inv, Category.assoc, equalizer_as_kernel,
  kernel.lift_ι]
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 : CochainComplex W ℕ
Y : W
f : (CochainComplex.single₀ W).obj Y ⟶ X
hf : QuasiIso' f
⊢ (({
                hom :=
                  homology'.map ⋯ ⋯
                    (Arrow.isoMk (xPrevIsoSelf X CochainComplex.homology'ZeroIso.proof_9)
                        (Iso.refl (Arrow.mk (dTo X 0)).right) ⋯).hom
                    (Arrow.isoMk (Iso.refl (Arrow.mk (dFrom X 0)).left)
                        (xNextIso X CochainComplex.homology'ZeroIso.proof_11) ⋯).hom
                    ⋯,
                inv :=
                  homology'.map ⋯ ⋯
                    (Arrow.isoMk (xPrevIsoSelf X CochainComplex.homology'ZeroIso.proof_9)
                        (Iso.refl (Arrow.mk (dTo X 0)).right) ⋯).inv
                    (Arrow.isoMk (Iso.refl (Arrow.mk (dFrom X 0)).left)
                        (xNextIso X CochainComplex.homology'ZeroIso.proof_11) ⋯).inv
                    ⋯,
                hom_inv_id := ⋯, inv_hom_id := ⋯ } ≪≫
              (cokernelIsoOfEq ⋯ ≪≫ cokernelZeroIsoTarget) ≪≫ kernelSubobjectIso (X.d 0 1)).symm ≪≫
          (asIso ((homology'Functor W (ComplexShape.up ℕ) 0).map f)).symm ≪≫
            (NatIso.ofComponents (fun X => homology'.congr ⋯ ⋯ ⋯ ⋯ ≪≫ homology'ZeroZero) ⋯).app Y).inv ≫
      equalizer.ι (X.d 0 1) 0 =
    kernel.lift (X.d 0 1) (f.f 0) ⋯ ≫ equalizer.ι (X.d 0 1) 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 : CochainComplex W ℕ
Y : W
f : (CochainComplex.single₀ W).obj Y ⟶ X
hf : QuasiIso' f
⊢ (NatIso.ofComponents (fun X => homology'.congr ⋯ ⋯ ⋯ ⋯ ≪≫ homology'ZeroZero) ⋯).inv.app Y ≫
      (asIso ((homology'Functor W (ComplexShape.up ℕ) 0).map f)).hom ≫
        ({
                hom :=
                  homology'.map ⋯ ⋯
                    (Arrow.isoMk (xPrevIsoSelf X CochainComplex.homology'ZeroIso.proof_9)
                        (Iso.refl (Arrow.mk (dTo X 0)).right) ⋯).hom
                    (Arrow.isoMk (Iso.refl (Arrow.mk (dFrom X 0)).left)
                        (xNextIso X CochainComplex.homology'ZeroIso.proof_11) ⋯).hom
                    ⋯,
                inv :=
                  homology'.map ⋯ ⋯
                    (Arrow.isoMk (xPrevIsoSelf X CochainComplex.homology'ZeroIso.proof_9)
                        (Iso.refl (Arrow.mk (dTo X 0)).right) ⋯).inv
                    (Arrow.isoMk (Iso.refl (Arrow.mk (dFrom X 0)).left)
                        (xNextIso X CochainComplex.homology'ZeroIso.proof_11) ⋯).inv
                    ⋯,
                hom_inv_id := ⋯, inv_hom_id := ⋯ } ≪≫
              (cokernelIsoOfEq ⋯ ≪≫ cokernelZeroIsoTarget) ≪≫ kernelSubobjectIso (X.d 0 1)).hom ≫
          kernel.ι (X.d 0 1) =
    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 : CochainComplex W ℕ
Y : W
f : (CochainComplex.single₀ W).obj Y ⟶ X
hf : QuasiIso' f
⊢ (NatIso.ofComponents (fun X => homology'.congr ⋯ ⋯ ⋯ ⋯ ≪≫ homology'ZeroZero) ⋯).inv.app Y ≫
      (asIso ((homology'Functor W (ComplexShape.up ℕ) 0).map f)).hom ≫
        ({
                hom :=
                  homology'.map ⋯ ⋯
                    (Arrow.isoMk (xPrevIsoSelf X CochainComplex.homology'ZeroIso.proof_9)
                        (Iso.refl (Arrow.mk (dTo X 0)).right) ⋯).hom
                    (Arrow.isoMk (Iso.refl (Arrow.mk (dFrom X 0)).left)
                        (xNextIso X CochainComplex.homology'ZeroIso.proof_11) ⋯).hom
                    ⋯,
                inv :=
                  homology'.map ⋯ ⋯
                    (Arrow.isoMk (xPrevIsoSelf X CochainComplex.homology'ZeroIso.proof_9)
                        (Iso.refl (Arrow.mk (dTo X 0)).right) ⋯).inv
                    (Arrow.isoMk (Iso.refl (Arrow.mk (dFrom X 0)).left)
                        (xNextIso X CochainComplex.homology'ZeroIso.proof_11) ⋯).inv
                    ⋯,
                hom_inv_id := ⋯, inv_hom_id := ⋯ } ≪≫
              (cokernelIsoOfEq ⋯ ≪≫ cokernelZeroIsoTarget) ≪≫ kernelSubobjectIso (X.d 0 1)).hom ≫
          kernel.ι (X.d 0 1) =
    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 : CochainComplex W ℕ
Y : W
f : (CochainComplex.single₀ W).obj Y ⟶ X
hf : QuasiIso' f
⊢ ((inv (kernelSubobject 0).arrow ≫ homology'.π 0 0 ⋯) ≫
        homology'.map ⋯ ⋯ { left := 𝟙 (xPrev ((CochainComplex.single₀ W).obj Y) 0), right := 𝟙 Y, w := ⋯ }
          { left := 𝟙 Y, right := 𝟙 (xNext ((CochainComplex.single₀ W).obj Y) 0), w := ⋯ } ⋯) ≫
      homology'.map ⋯ ⋯ (sqTo f 0) (sqFrom f 0) ⋯ ≫
        (homology'.map ⋯ ⋯
              (Arrow.isoMk (xPrevIsoSelf X CochainComplex.homology'ZeroIso.proof_9) (Iso.refl (X.X 0)) ⋯).hom
              (Arrow.isoMk (Iso.refl (X.X 0)) (xNextIso X CochainComplex.homology'ZeroIso.proof_11) ⋯).hom ⋯ ≫
            ((cokernelIsoOfEq ⋯).hom ≫ cokernelZeroIsoTarget.hom) ≫ (kernelSubobjectIso (X.d 0 1)).hom) ≫
          kernel.ι (X.d 0 1) =
    f.f 0

tactic: simp only [Category.assoc, homology'.π_map, cokernelZeroIsoTarget_hom,
  cokernelIsoOfEq_hom_comp_desc, kernelSubobject_arrow, homology'.π_map_assoc, IsIso.inv_comp_eq]
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 : CochainComplex W ℕ
Y : W
f : (CochainComplex.single₀ W).obj Y ⟶ X
hf : QuasiIso' f
⊢ ((inv (kernelSubobject 0).arrow ≫ homology'.π 0 0 ⋯) ≫
        homology'.map ⋯ ⋯ { left := 𝟙 (xPrev ((CochainComplex.single₀ W).obj Y) 0), right := 𝟙 Y, w := ⋯ }
          { left := 𝟙 Y, right := 𝟙 (xNext ((CochainComplex.single₀ W).obj Y) 0), w := ⋯ } ⋯) ≫
      homology'.map ⋯ ⋯ (sqTo f 0) (sqFrom f 0) ⋯ ≫
        (homology'.map ⋯ ⋯
              (Arrow.isoMk (xPrevIsoSelf X CochainComplex.homology'ZeroIso.proof_9) (Iso.refl (X.X 0)) ⋯).hom
              (Arrow.isoMk (Iso.refl (X.X 0)) (xNextIso X CochainComplex.homology'ZeroIso.proof_11) ⋯).hom ⋯ ≫
            ((cokernelIsoOfEq ⋯).hom ≫ cokernelZeroIsoTarget.hom) ≫ (kernelSubobjectIso (X.d 0 1)).hom) ≫
          kernel.ι (X.d 0 1) =
    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 : CochainComplex W ℕ
Y : W
f : (CochainComplex.single₀ W).obj Y ⟶ X
hf : QuasiIso' f
⊢ kernelSubobjectMap { left := 𝟙 Y, right := 𝟙 (xNext ((CochainComplex.single₀ W).obj Y) 0), w := ⋯ } ≫
      kernelSubobjectMap (sqFrom f 0) ≫
        kernelSubobjectMap
            (Arrow.isoMk (Iso.refl (X.X 0)) (xNextIso X CochainComplex.homology'ZeroIso.proof_11) ⋯).hom ≫
          homology'.π 0 (X.d 0 1) ⋯ ≫
            cokernel.desc (imageToKernel 0 (X.d 0 1) ⋯) (𝟙 (Subobject.underlying.obj (kernelSubobject (X.d 0 1)))) ⋯ ≫
              (kernelSubobject (X.d 0 1)).arrow =
    (kernelSubobject 0).arrow ≫ f.f 0

tactic: simp [homology'.π, kernelSubobjectMap_comp, Iso.refl_hom (X.X 0), Category.comp_id]
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 : CochainComplex W ℕ
Y : W
f : (CochainComplex.single₀ W).obj Y ⟶ X
hf : QuasiIso' f
⊢ kernelSubobjectMap { left := 𝟙 Y, right := 𝟙 (xNext ((CochainComplex.single₀ W).obj Y) 0), w := ⋯ } ≫
      kernelSubobjectMap (sqFrom f 0) ≫
        kernelSubobjectMap
            (Arrow.isoMk (Iso.refl (X.X 0)) (xNextIso X CochainComplex.homology'ZeroIso.proof_11) ⋯).hom ≫
          homology'.π 0 (X.d 0 1) ⋯ ≫
            cokernel.desc (imageToKernel 0 (X.d 0 1) ⋯) (𝟙 (Subobject.underlying.obj (kernelSubobject (X.d 0 1)))) ⋯ ≫
              (kernelSubobject (X.d 0 1)).arrow =
    (kernelSubobject 0).arrow ≫ f.f 0
state_after: no goals