/-- In any abelian category with enough projectives,
`ProjectiveResolution.of Z` constructs an projective resolution of the object `Z`.
-/
irreducible_def of : ProjectiveResolution Z where
  complex := ofComplex Z
  π := (ChainComplex.toSingle₀Equiv _ _).symm ⟨Projective.π Z, by
          rw [ofComplex_d_1_0, assoc, kernel.condition, comp_zero]⟩
  quasiIso := ⟨fun n => by
    cases n
    · rw [ChainComplex.quasiIsoAt₀_iff, ShortComplex.quasiIso_iff_of_zeros']
      · dsimp
        refine' (ShortComplex.exact_and_epi_g_iff_of_iso _).2
          ⟨exact_d_f (Projective.π Z), by dsimp; infer_instance⟩
        exact ShortComplex.isoMk (Iso.refl _) (Iso.refl _) (Iso.refl _)
          (by simp [ofComplex]) (by 

Proof state:
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : Abelian C
inst✝¹ : HasProjectiveResolutions C
inst✝ : EnoughProjectives C
Z : C
⊢ (Iso.refl
          (ShortComplex.mk (HomologicalComplex.d (ofComplex Z) 1 0)
              (HomologicalComplex.Hom.f
                ((ChainComplex.toSingle₀Equiv (ofComplex Z) Z).symm
                  { val := Projective.π Z,
                    property := (_ : HomologicalComplex.d (ofComplex Z) 1 0 ≫ Projective.π Z = 0) })
                0)
              (_ :
                HomologicalComplex.d (ofComplex Z) 1 0 ≫
                    HomologicalComplex.Hom.f
                      ((ChainComplex.toSingle₀Equiv (ofComplex Z) Z).symm
                        { val := Projective.π Z,
                          property := (_ : HomologicalComplex.d (ofComplex Z) 1 0 ≫ Projective.π Z = 0) })
                      0 =
                  0)).X₂).hom ≫
      (ShortComplex.mk (d (Projective.π Z)) (Projective.π Z)
          (_ : (Projective.π (kernel (Projective.π Z)) ≫ kernel.ι (Projective.π Z)) ≫ Projective.π Z = 0)).g =
    (ShortComplex.mk (HomologicalComplex.d (ofComplex Z) 1 0)
          (HomologicalComplex.Hom.f
            ((ChainComplex.toSingle₀Equiv (ofComplex Z) Z).symm
              { val := Projective.π Z, property := (_ : HomologicalComplex.d (ofComplex Z) 1 0 ≫ Projective.π Z = 0) })
            0)
          (_ :
            HomologicalComplex.d (ofComplex Z) 1 0 ≫
                HomologicalComplex.Hom.f
                  ((ChainComplex.toSingle₀Equiv (ofComplex Z) Z).symm
                    { val := Projective.π Z,
                      property := (_ : HomologicalComplex.d (ofComplex Z) 1 0 ≫ Projective.π Z = 0) })
                  0 =
              0)).g ≫
      (Iso.refl
          (ShortComplex.mk (HomologicalComplex.d (ofComplex Z) 1 0)
              (HomologicalComplex.Hom.f
                ((ChainComplex.toSingle₀Equiv (ofComplex Z) Z).symm
                  { val := Projective.π Z,
                    property := (_ : HomologicalComplex.d (ofComplex Z) 1 0 ≫ Projective.π Z = 0) })
                0)
              (_ :
                HomologicalComplex.d (ofComplex Z) 1 0 ≫
                    HomologicalComplex.Hom.f
                      ((ChainComplex.toSingle₀Equiv (ofComplex Z) Z).symm
                        { val := Projective.π Z,
                          property := (_ : HomologicalComplex.d (ofComplex Z) 1 0 ≫ Projective.π Z = 0) })
                      0 =
                  0)).X₃).hom

Next tactic:
simp