/-- In any abelian category with enough injectives,
`InjectiveResolution.of Z` constructs an injective resolution of the object `Z`.
-/
irreducible_def of : InjectiveResolution Z where
  cocomplex := ofCocomplex Z
  ι := (CochainComplex.fromSingle₀Equiv _ _).symm ⟨Injective.ι Z,
    by rw [ofCocomplex_d_0_1, cokernel.condition_assoc, zero_comp]⟩
  quasiIso := ⟨fun n => by
    cases n
    · rw [CochainComplex.quasiIsoAt₀_iff, ShortComplex.quasiIso_iff_of_zeros]
      · refine' (ShortComplex.exact_and_mono_f_iff_of_iso _).2
          ⟨exact_f_d (Injective.ι Z), by dsimp; infer_instance⟩
        exact ShortComplex.isoMk (Iso.refl _) (Iso.refl _) (Iso.refl _) (by simp)
          (by 

Proof state:
C : Type u
inst✝² : Category.{v, u} C
inst✝¹ : Abelian C
inst✝ : EnoughInjectives C
Z : C
⊢ (Iso.refl
          (ShortComplex.mk
              ((HomologicalComplex.shortComplexFunctor' C (ComplexShape.up ℕ) 0 0 1).map
                  ((CochainComplex.fromSingle₀Equiv (ofCocomplex Z) Z).symm
                    { val := Injective.ι Z,
                      property := (_ : Injective.ι Z ≫ HomologicalComplex.d (ofCocomplex Z) 0 1 = 0) })).τ₂
              ((HomologicalComplex.shortComplexFunctor' C (ComplexShape.up ℕ) 0 0 1).obj (ofCocomplex Z)).g
              (_ :
                ((HomologicalComplex.shortComplexFunctor' C (ComplexShape.up ℕ) 0 0 1).map
                        ((CochainComplex.fromSingle₀Equiv (ofCocomplex Z) Z).symm
                          { val := Injective.ι Z,
                            property := (_ : Injective.ι Z ≫ HomologicalComplex.d (ofCocomplex Z) 0 1 = 0) })).τ₂ ≫
                    ((HomologicalComplex.shortComplexFunctor' C (ComplexShape.up ℕ) 0 0 1).obj (ofCocomplex Z)).g =
                  0)).X₂).hom ≫
      (ShortComplex.mk (Injective.ι Z) (d (Injective.ι Z))
          (_ : Injective.ι Z ≫ cokernel.π (Injective.ι Z) ≫ Injective.ι (cokernel (Injective.ι Z)) = 0)).g =
    (ShortComplex.mk
          ((HomologicalComplex.shortComplexFunctor' C (ComplexShape.up ℕ) 0 0 1).map
              ((CochainComplex.fromSingle₀Equiv (ofCocomplex Z) Z).symm
                { val := Injective.ι Z,
                  property := (_ : Injective.ι Z ≫ HomologicalComplex.d (ofCocomplex Z) 0 1 = 0) })).τ₂
          ((HomologicalComplex.shortComplexFunctor' C (ComplexShape.up ℕ) 0 0 1).obj (ofCocomplex Z)).g
          (_ :
            ((HomologicalComplex.shortComplexFunctor' C (ComplexShape.up ℕ) 0 0 1).map
                    ((CochainComplex.fromSingle₀Equiv (ofCocomplex Z) Z).symm
                      { val := Injective.ι Z,
                        property := (_ : Injective.ι Z ≫ HomologicalComplex.d (ofCocomplex Z) 0 1 = 0) })).τ₂ ≫
                ((HomologicalComplex.shortComplexFunctor' C (ComplexShape.up ℕ) 0 0 1).obj (ofCocomplex Z)).g =
              0)).g ≫
      (Iso.refl
          (ShortComplex.mk
              ((HomologicalComplex.shortComplexFunctor' C (ComplexShape.up ℕ) 0 0 1).map
                  ((CochainComplex.fromSingle₀Equiv (ofCocomplex Z) Z).symm
                    { val := Injective.ι Z,
                      property := (_ : Injective.ι Z ≫ HomologicalComplex.d (ofCocomplex Z) 0 1 = 0) })).τ₂
              ((HomologicalComplex.shortComplexFunctor' C (ComplexShape.up ℕ) 0 0 1).obj (ofCocomplex Z)).g
              (_ :
                ((HomologicalComplex.shortComplexFunctor' C (ComplexShape.up ℕ) 0 0 1).map
                        ((CochainComplex.fromSingle₀Equiv (ofCocomplex Z) Z).symm
                          { val := Injective.ι Z,
                            property := (_ : Injective.ι Z ≫ HomologicalComplex.d (ofCocomplex Z) 0 1 = 0) })).τ₂ ≫
                    ((HomologicalComplex.shortComplexFunctor' C (ComplexShape.up ℕ) 0 0 1).obj (ofCocomplex Z)).g =
                  0)).X₃).hom

Next tactic:
simp [ofCocomplex]