l3lab/ntp-mathlib huggingface dataset:
instance : ReflectsIsomorphisms (N₁ : SimplicialObject C ⥤ Karoubi (ChainComplex C ℕ)) :=
  ⟨fun {X Y} f => by
    intro
    -- restating the result in a way that allows induction on the degree n
    suffices ∀ n : ℕ, IsIso (f.app (op [n])) by
      haveI : ∀ Δ : SimplexCategoryᵒᵖ, IsIso (f.app Δ) := fun Δ => this Δ.unop.len
      apply NatIso.isIso_of_isIso_app
    -- restating the assumption in a more practical form
    have h₁ := HomologicalComplex.congr_hom (Karoubi.hom_ext_iff.mp (IsIso.hom_inv_id (N₁.map f)))
    have h₂ := HomologicalComplex.congr_hom (Karoubi.hom_ext_iff.mp (IsIso.inv_hom_id (N₁.map f)))
    have h₃ := fun n =>
      Karoubi.HomologicalComplex.p_comm_f_assoc (inv (N₁.map f)) n (f.app (op [n]))
    simp only [N₁_map_f, Karoubi.comp_f, HomologicalComplex.comp_f,
      AlternatingFaceMapComplex.map_f, N₁_obj_p, Karoubi.id_eq, assoc] at h₁ h₂ h₃
    -- we have to construct an inverse to f in degree n, by induction on n
    

Proof state:
C : Type u_1
inst✝² : Category.{?u.28, u_1} C
inst✝¹ : Preadditive C
X Y : SimplicialObject C
f : X ⟶ Y
inst✝ : IsIso (N₁.map f)
h₂ :
  ∀ (i : ℕ),
    HomologicalComplex.Hom.f (inv (N₁.map f)).f i ≫ HomologicalComplex.Hom.f PInfty i ≫ f.app (op [i]) =
      HomologicalComplex.Hom.f PInfty i
h₃ :
  ∀ (n : ℕ),
    HomologicalComplex.Hom.f PInfty n ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f n ≫ f.app (op [n]) =
      HomologicalComplex.Hom.f (inv (N₁.map f)).f n ≫ HomologicalComplex.Hom.f PInfty n ≫ f.app (op [n])
h₁ :
  ∀ (i : ℕ),
    HomologicalComplex.Hom.f PInfty i ≫ f.app (op [i]) ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f i =
      HomologicalComplex.Hom.f PInfty i
⊢ ∀ (n : ℕ), IsIso (f.app (op [n]))

Next tactic:
intro n
instance : ReflectsIsomorphisms (N₁ : SimplicialObject C ⥤ Karoubi (ChainComplex C ℕ)) :=
  ⟨fun {X Y} f => by
    intro
    -- restating the result in a way that allows induction on the degree n
    suffices ∀ n : ℕ, IsIso (f.app (op [n])) by
      haveI : ∀ Δ : SimplexCategoryᵒᵖ, IsIso (f.app Δ) := fun Δ => this Δ.unop.len
      apply NatIso.isIso_of_isIso_app
    -- restating the assumption in a more practical form
    have h₁ := HomologicalComplex.congr_hom (Karoubi.hom_ext_iff.mp (IsIso.hom_inv_id (N₁.map f)))
    have h₂ := HomologicalComplex.congr_hom (Karoubi.hom_ext_iff.mp (IsIso.inv_hom_id (N₁.map f)))
    have h₃ := fun n =>
      Karoubi.HomologicalComplex.p_comm_f_assoc (inv (N₁.map f)) n (f.app (op [n]))
    simp only [N₁_map_f, Karoubi.comp_f, HomologicalComplex.comp_f,
      AlternatingFaceMapComplex.map_f, N₁_obj_p, Karoubi.id_eq, assoc] at h₁ h₂ h₃
    -- we have to construct an inverse to f in degree n, by induction on n
    intro n
    

Proof state:
C : Type u_1
inst✝² : Category.{?u.28, u_1} C
inst✝¹ : Preadditive C
X Y : SimplicialObject C
f : X ⟶ Y
inst✝ : IsIso (N₁.map f)
h₂ :
  ∀ (i : ℕ),
    HomologicalComplex.Hom.f (inv (N₁.map f)).f i ≫ HomologicalComplex.Hom.f PInfty i ≫ f.app (op [i]) =
      HomologicalComplex.Hom.f PInfty i
h₃ :
  ∀ (n : ℕ),
    HomologicalComplex.Hom.f PInfty n ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f n ≫ f.app (op [n]) =
      HomologicalComplex.Hom.f (inv (N₁.map f)).f n ≫ HomologicalComplex.Hom.f PInfty n ≫ f.app (op [n])
h₁ :
  ∀ (i : ℕ),
    HomologicalComplex.Hom.f PInfty i ≫ f.app (op [i]) ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f i =
      HomologicalComplex.Hom.f PInfty i
n : ℕ
⊢ IsIso (f.app (op [n]))

Next tactic:
induction' n with n hn
instance : ReflectsIsomorphisms (N₁ : SimplicialObject C ⥤ Karoubi (ChainComplex C ℕ)) :=
  ⟨fun {X Y} f => by
    intro
    -- restating the result in a way that allows induction on the degree n
    suffices ∀ n : ℕ, IsIso (f.app (op [n])) by
      haveI : ∀ Δ : SimplexCategoryᵒᵖ, IsIso (f.app Δ) := fun Δ => this Δ.unop.len
      apply NatIso.isIso_of_isIso_app
    -- restating the assumption in a more practical form
    have h₁ := HomologicalComplex.congr_hom (Karoubi.hom_ext_iff.mp (IsIso.hom_inv_id (N₁.map f)))
    have h₂ := HomologicalComplex.congr_hom (Karoubi.hom_ext_iff.mp (IsIso.inv_hom_id (N₁.map f)))
    have h₃ := fun n =>
      Karoubi.HomologicalComplex.p_comm_f_assoc (inv (N₁.map f)) n (f.app (op [n]))
    simp only [N₁_map_f, Karoubi.comp_f, HomologicalComplex.comp_f,
      AlternatingFaceMapComplex.map_f, N₁_obj_p, Karoubi.id_eq, assoc] at h₁ h₂ h₃
    -- we have to construct an inverse to f in degree n, by induction on n
    intro n
    induction' n with n hn
    -- degree 0
    · 

Proof state:
case zero
C : Type u_1
inst✝² : Category.{?u.28, u_1} C
inst✝¹ : Preadditive C
X Y : SimplicialObject C
f : X ⟶ Y
inst✝ : IsIso (N₁.map f)
h₂ :
  ∀ (i : ℕ),
    HomologicalComplex.Hom.f (inv (N₁.map f)).f i ≫ HomologicalComplex.Hom.f PInfty i ≫ f.app (op [i]) =
      HomologicalComplex.Hom.f PInfty i
h₃ :
  ∀ (n : ℕ),
    HomologicalComplex.Hom.f PInfty n ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f n ≫ f.app (op [n]) =
      HomologicalComplex.Hom.f (inv (N₁.map f)).f n ≫ HomologicalComplex.Hom.f PInfty n ≫ f.app (op [n])
h₁ :
  ∀ (i : ℕ),
    HomologicalComplex.Hom.f PInfty i ≫ f.app (op [i]) ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f i =
      HomologicalComplex.Hom.f PInfty i
⊢ IsIso (f.app (op [Nat.zero]))

Next tactic:
use (inv (N₁.map f)).f.f 0
instance : ReflectsIsomorphisms (N₁ : SimplicialObject C ⥤ Karoubi (ChainComplex C ℕ)) :=
  ⟨fun {X Y} f => by
    intro
    -- restating the result in a way that allows induction on the degree n
    suffices ∀ n : ℕ, IsIso (f.app (op [n])) by
      haveI : ∀ Δ : SimplexCategoryᵒᵖ, IsIso (f.app Δ) := fun Δ => this Δ.unop.len
      apply NatIso.isIso_of_isIso_app
    -- restating the assumption in a more practical form
    have h₁ := HomologicalComplex.congr_hom (Karoubi.hom_ext_iff.mp (IsIso.hom_inv_id (N₁.map f)))
    have h₂ := HomologicalComplex.congr_hom (Karoubi.hom_ext_iff.mp (IsIso.inv_hom_id (N₁.map f)))
    have h₃ := fun n =>
      Karoubi.HomologicalComplex.p_comm_f_assoc (inv (N₁.map f)) n (f.app (op [n]))
    simp only [N₁_map_f, Karoubi.comp_f, HomologicalComplex.comp_f,
      AlternatingFaceMapComplex.map_f, N₁_obj_p, Karoubi.id_eq, assoc] at h₁ h₂ h₃
    -- we have to construct an inverse to f in degree n, by induction on n
    intro n
    induction' n with n hn
    -- degree 0
    · use (inv (N₁.map f)).f.f 0
      

Proof state:
case h
C : Type u_1
inst✝² : Category.{?u.28, u_1} C
inst✝¹ : Preadditive C
X Y : SimplicialObject C
f : X ⟶ Y
inst✝ : IsIso (N₁.map f)
h₂ :
  ∀ (i : ℕ),
    HomologicalComplex.Hom.f (inv (N₁.map f)).f i ≫ HomologicalComplex.Hom.f PInfty i ≫ f.app (op [i]) =
      HomologicalComplex.Hom.f PInfty i
h₃ :
  ∀ (n : ℕ),
    HomologicalComplex.Hom.f PInfty n ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f n ≫ f.app (op [n]) =
      HomologicalComplex.Hom.f (inv (N₁.map f)).f n ≫ HomologicalComplex.Hom.f PInfty n ≫ f.app (op [n])
h₁ :
  ∀ (i : ℕ),
    HomologicalComplex.Hom.f PInfty i ≫ f.app (op [i]) ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f i =
      HomologicalComplex.Hom.f PInfty i
⊢ f.app (op [Nat.zero]) ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f 0 = 𝟙 (X.obj (op [Nat.zero])) ∧
    HomologicalComplex.Hom.f (inv (N₁.map f)).f 0 ≫ f.app (op [Nat.zero]) = 𝟙 (Y.obj (op [Nat.zero]))

Next tactic:
have h₁₀ := h₁ 0
instance : ReflectsIsomorphisms (N₁ : SimplicialObject C ⥤ Karoubi (ChainComplex C ℕ)) :=
  ⟨fun {X Y} f => by
    intro
    -- restating the result in a way that allows induction on the degree n
    suffices ∀ n : ℕ, IsIso (f.app (op [n])) by
      haveI : ∀ Δ : SimplexCategoryᵒᵖ, IsIso (f.app Δ) := fun Δ => this Δ.unop.len
      apply NatIso.isIso_of_isIso_app
    -- restating the assumption in a more practical form
    have h₁ := HomologicalComplex.congr_hom (Karoubi.hom_ext_iff.mp (IsIso.hom_inv_id (N₁.map f)))
    have h₂ := HomologicalComplex.congr_hom (Karoubi.hom_ext_iff.mp (IsIso.inv_hom_id (N₁.map f)))
    have h₃ := fun n =>
      Karoubi.HomologicalComplex.p_comm_f_assoc (inv (N₁.map f)) n (f.app (op [n]))
    simp only [N₁_map_f, Karoubi.comp_f, HomologicalComplex.comp_f,
      AlternatingFaceMapComplex.map_f, N₁_obj_p, Karoubi.id_eq, assoc] at h₁ h₂ h₃
    -- we have to construct an inverse to f in degree n, by induction on n
    intro n
    induction' n with n hn
    -- degree 0
    · use (inv (N₁.map f)).f.f 0
      have h₁₀ := h₁ 0
      

Proof state:
case h
C : Type u_1
inst✝² : Category.{?u.28, u_1} C
inst✝¹ : Preadditive C
X Y : SimplicialObject C
f : X ⟶ Y
inst✝ : IsIso (N₁.map f)
h₂ :
  ∀ (i : ℕ),
    HomologicalComplex.Hom.f (inv (N₁.map f)).f i ≫ HomologicalComplex.Hom.f PInfty i ≫ f.app (op [i]) =
      HomologicalComplex.Hom.f PInfty i
h₃ :
  ∀ (n : ℕ),
    HomologicalComplex.Hom.f PInfty n ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f n ≫ f.app (op [n]) =
      HomologicalComplex.Hom.f (inv (N₁.map f)).f n ≫ HomologicalComplex.Hom.f PInfty n ≫ f.app (op [n])
h₁ :
  ∀ (i : ℕ),
    HomologicalComplex.Hom.f PInfty i ≫ f.app (op [i]) ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f i =
      HomologicalComplex.Hom.f PInfty i
h₁₀ :
  HomologicalComplex.Hom.f PInfty 0 ≫ f.app (op [0]) ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f 0 =
    HomologicalComplex.Hom.f PInfty 0
⊢ f.app (op [Nat.zero]) ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f 0 = 𝟙 (X.obj (op [Nat.zero])) ∧
    HomologicalComplex.Hom.f (inv (N₁.map f)).f 0 ≫ f.app (op [Nat.zero]) = 𝟙 (Y.obj (op [Nat.zero]))

Next tactic:
have h₂₀ := h₂ 0
instance : ReflectsIsomorphisms (N₁ : SimplicialObject C ⥤ Karoubi (ChainComplex C ℕ)) :=
  ⟨fun {X Y} f => by
    intro
    -- restating the result in a way that allows induction on the degree n
    suffices ∀ n : ℕ, IsIso (f.app (op [n])) by
      haveI : ∀ Δ : SimplexCategoryᵒᵖ, IsIso (f.app Δ) := fun Δ => this Δ.unop.len
      apply NatIso.isIso_of_isIso_app
    -- restating the assumption in a more practical form
    have h₁ := HomologicalComplex.congr_hom (Karoubi.hom_ext_iff.mp (IsIso.hom_inv_id (N₁.map f)))
    have h₂ := HomologicalComplex.congr_hom (Karoubi.hom_ext_iff.mp (IsIso.inv_hom_id (N₁.map f)))
    have h₃ := fun n =>
      Karoubi.HomologicalComplex.p_comm_f_assoc (inv (N₁.map f)) n (f.app (op [n]))
    simp only [N₁_map_f, Karoubi.comp_f, HomologicalComplex.comp_f,
      AlternatingFaceMapComplex.map_f, N₁_obj_p, Karoubi.id_eq, assoc] at h₁ h₂ h₃
    -- we have to construct an inverse to f in degree n, by induction on n
    intro n
    induction' n with n hn
    -- degree 0
    · use (inv (N₁.map f)).f.f 0
      have h₁₀ := h₁ 0
      have h₂₀ := h₂ 0
      

Proof state:
case h
C : Type u_1
inst✝² : Category.{?u.28, u_1} C
inst✝¹ : Preadditive C
X Y : SimplicialObject C
f : X ⟶ Y
inst✝ : IsIso (N₁.map f)
h₂ :
  ∀ (i : ℕ),
    HomologicalComplex.Hom.f (inv (N₁.map f)).f i ≫ HomologicalComplex.Hom.f PInfty i ≫ f.app (op [i]) =
      HomologicalComplex.Hom.f PInfty i
h₃ :
  ∀ (n : ℕ),
    HomologicalComplex.Hom.f PInfty n ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f n ≫ f.app (op [n]) =
      HomologicalComplex.Hom.f (inv (N₁.map f)).f n ≫ HomologicalComplex.Hom.f PInfty n ≫ f.app (op [n])
h₁ :
  ∀ (i : ℕ),
    HomologicalComplex.Hom.f PInfty i ≫ f.app (op [i]) ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f i =
      HomologicalComplex.Hom.f PInfty i
h₁₀ :
  HomologicalComplex.Hom.f PInfty 0 ≫ f.app (op [0]) ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f 0 =
    HomologicalComplex.Hom.f PInfty 0
h₂₀ :
  HomologicalComplex.Hom.f (inv (N₁.map f)).f 0 ≫ HomologicalComplex.Hom.f PInfty 0 ≫ f.app (op [0]) =
    HomologicalComplex.Hom.f PInfty 0
⊢ f.app (op [Nat.zero]) ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f 0 = 𝟙 (X.obj (op [Nat.zero])) ∧
    HomologicalComplex.Hom.f (inv (N₁.map f)).f 0 ≫ f.app (op [Nat.zero]) = 𝟙 (Y.obj (op [Nat.zero]))

Next tactic:
dsimp at h₁₀ h₂₀
instance : ReflectsIsomorphisms (N₁ : SimplicialObject C ⥤ Karoubi (ChainComplex C ℕ)) :=
  ⟨fun {X Y} f => by
    intro
    -- restating the result in a way that allows induction on the degree n
    suffices ∀ n : ℕ, IsIso (f.app (op [n])) by
      haveI : ∀ Δ : SimplexCategoryᵒᵖ, IsIso (f.app Δ) := fun Δ => this Δ.unop.len
      apply NatIso.isIso_of_isIso_app
    -- restating the assumption in a more practical form
    have h₁ := HomologicalComplex.congr_hom (Karoubi.hom_ext_iff.mp (IsIso.hom_inv_id (N₁.map f)))
    have h₂ := HomologicalComplex.congr_hom (Karoubi.hom_ext_iff.mp (IsIso.inv_hom_id (N₁.map f)))
    have h₃ := fun n =>
      Karoubi.HomologicalComplex.p_comm_f_assoc (inv (N₁.map f)) n (f.app (op [n]))
    simp only [N₁_map_f, Karoubi.comp_f, HomologicalComplex.comp_f,
      AlternatingFaceMapComplex.map_f, N₁_obj_p, Karoubi.id_eq, assoc] at h₁ h₂ h₃
    -- we have to construct an inverse to f in degree n, by induction on n
    intro n
    induction' n with n hn
    -- degree 0
    · use (inv (N₁.map f)).f.f 0
      have h₁₀ := h₁ 0
      have h₂₀ := h₂ 0
      dsimp at h₁₀ h₂₀
      

Proof state:
case h
C : Type u_1
inst✝² : Category.{?u.28, u_1} C
inst✝¹ : Preadditive C
X Y : SimplicialObject C
f : X ⟶ Y
inst✝ : IsIso (N₁.map f)
h₂ :
  ∀ (i : ℕ),
    HomologicalComplex.Hom.f (inv (N₁.map f)).f i ≫ HomologicalComplex.Hom.f PInfty i ≫ f.app (op [i]) =
      HomologicalComplex.Hom.f PInfty i
h₃ :
  ∀ (n : ℕ),
    HomologicalComplex.Hom.f PInfty n ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f n ≫ f.app (op [n]) =
      HomologicalComplex.Hom.f (inv (N₁.map f)).f n ≫ HomologicalComplex.Hom.f PInfty n ≫ f.app (op [n])
h₁ :
  ∀ (i : ℕ),
    HomologicalComplex.Hom.f PInfty i ≫ f.app (op [i]) ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f i =
      HomologicalComplex.Hom.f PInfty i
h₁₀ : 𝟙 (X.obj (op [0])) ≫ f.app (op [0]) ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f 0 = 𝟙 (X.obj (op [0]))
h₂₀ : HomologicalComplex.Hom.f (inv (N₁.map f)).f 0 ≫ 𝟙 (X.obj (op [0])) ≫ f.app (op [0]) = 𝟙 (Y.obj (op [0]))
⊢ f.app (op [Nat.zero]) ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f 0 = 𝟙 (X.obj (op [Nat.zero])) ∧
    HomologicalComplex.Hom.f (inv (N₁.map f)).f 0 ≫ f.app (op [Nat.zero]) = 𝟙 (Y.obj (op [Nat.zero]))

Next tactic:
simp only [id_comp, comp_id] at h₁₀ h₂₀
instance : ReflectsIsomorphisms (N₁ : SimplicialObject C ⥤ Karoubi (ChainComplex C ℕ)) :=
  ⟨fun {X Y} f => by
    intro
    -- restating the result in a way that allows induction on the degree n
    suffices ∀ n : ℕ, IsIso (f.app (op [n])) by
      haveI : ∀ Δ : SimplexCategoryᵒᵖ, IsIso (f.app Δ) := fun Δ => this Δ.unop.len
      apply NatIso.isIso_of_isIso_app
    -- restating the assumption in a more practical form
    have h₁ := HomologicalComplex.congr_hom (Karoubi.hom_ext_iff.mp (IsIso.hom_inv_id (N₁.map f)))
    have h₂ := HomologicalComplex.congr_hom (Karoubi.hom_ext_iff.mp (IsIso.inv_hom_id (N₁.map f)))
    have h₃ := fun n =>
      Karoubi.HomologicalComplex.p_comm_f_assoc (inv (N₁.map f)) n (f.app (op [n]))
    simp only [N₁_map_f, Karoubi.comp_f, HomologicalComplex.comp_f,
      AlternatingFaceMapComplex.map_f, N₁_obj_p, Karoubi.id_eq, assoc] at h₁ h₂ h₃
    -- we have to construct an inverse to f in degree n, by induction on n
    intro n
    induction' n with n hn
    -- degree 0
    · use (inv (N₁.map f)).f.f 0
      have h₁₀ := h₁ 0
      have h₂₀ := h₂ 0
      dsimp at h₁₀ h₂₀
      simp only [id_comp, comp_id] at h₁₀ h₂₀
      

Proof state:
case h
C : Type u_1
inst✝² : Category.{?u.28, u_1} C
inst✝¹ : Preadditive C
X Y : SimplicialObject C
f : X ⟶ Y
inst✝ : IsIso (N₁.map f)
h₂ :
  ∀ (i : ℕ),
    HomologicalComplex.Hom.f (inv (N₁.map f)).f i ≫ HomologicalComplex.Hom.f PInfty i ≫ f.app (op [i]) =
      HomologicalComplex.Hom.f PInfty i
h₃ :
  ∀ (n : ℕ),
    HomologicalComplex.Hom.f PInfty n ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f n ≫ f.app (op [n]) =
      HomologicalComplex.Hom.f (inv (N₁.map f)).f n ≫ HomologicalComplex.Hom.f PInfty n ≫ f.app (op [n])
h₁ :
  ∀ (i : ℕ),
    HomologicalComplex.Hom.f PInfty i ≫ f.app (op [i]) ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f i =
      HomologicalComplex.Hom.f PInfty i
h₁₀ : f.app (op [0]) ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f 0 = 𝟙 (X.obj (op [0]))
h₂₀ : HomologicalComplex.Hom.f (inv (N₁.map f)).f 0 ≫ f.app (op [0]) = 𝟙 (Y.obj (op [0]))
⊢ f.app (op [Nat.zero]) ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f 0 = 𝟙 (X.obj (op [Nat.zero])) ∧
    HomologicalComplex.Hom.f (inv (N₁.map f)).f 0 ≫ f.app (op [Nat.zero]) = 𝟙 (Y.obj (op [Nat.zero]))

Next tactic:
tauto
instance : ReflectsIsomorphisms (N₁ : SimplicialObject C ⥤ Karoubi (ChainComplex C ℕ)) :=
  ⟨fun {X Y} f => by
    intro
    -- restating the result in a way that allows induction on the degree n
    suffices ∀ n : ℕ, IsIso (f.app (op [n])) by
      haveI : ∀ Δ : SimplexCategoryᵒᵖ, IsIso (f.app Δ) := fun Δ => this Δ.unop.len
      apply NatIso.isIso_of_isIso_app
    -- restating the assumption in a more practical form
    have h₁ := HomologicalComplex.congr_hom (Karoubi.hom_ext_iff.mp (IsIso.hom_inv_id (N₁.map f)))
    have h₂ := HomologicalComplex.congr_hom (Karoubi.hom_ext_iff.mp (IsIso.inv_hom_id (N₁.map f)))
    have h₃ := fun n =>
      Karoubi.HomologicalComplex.p_comm_f_assoc (inv (N₁.map f)) n (f.app (op [n]))
    simp only [N₁_map_f, Karoubi.comp_f, HomologicalComplex.comp_f,
      AlternatingFaceMapComplex.map_f, N₁_obj_p, Karoubi.id_eq, assoc] at h₁ h₂ h₃
    -- we have to construct an inverse to f in degree n, by induction on n
    intro n
    induction' n with n hn
    -- degree 0
    · use (inv (N₁.map f)).f.f 0
      have h₁₀ := h₁ 0
      have h₂₀ := h₂ 0
      dsimp at h₁₀ h₂₀
      simp only [id_comp, comp_id] at h₁₀ h₂₀
      tauto
    · 

Proof state:
case succ
C : Type u_1
inst✝² : Category.{?u.28, u_1} C
inst✝¹ : Preadditive C
X Y : SimplicialObject C
f : X ⟶ Y
inst✝ : IsIso (N₁.map f)
h₂ :
  ∀ (i : ℕ),
    HomologicalComplex.Hom.f (inv (N₁.map f)).f i ≫ HomologicalComplex.Hom.f PInfty i ≫ f.app (op [i]) =
      HomologicalComplex.Hom.f PInfty i
h₃ :
  ∀ (n : ℕ),
    HomologicalComplex.Hom.f PInfty n ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f n ≫ f.app (op [n]) =
      HomologicalComplex.Hom.f (inv (N₁.map f)).f n ≫ HomologicalComplex.Hom.f PInfty n ≫ f.app (op [n])
h₁ :
  ∀ (i : ℕ),
    HomologicalComplex.Hom.f PInfty i ≫ f.app (op [i]) ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f i =
      HomologicalComplex.Hom.f PInfty i
n : ℕ
hn : IsIso (f.app (op [n]))
⊢ IsIso (f.app (op [Nat.succ n]))

Next tactic:
haveI := hn
instance : ReflectsIsomorphisms (N₁ : SimplicialObject C ⥤ Karoubi (ChainComplex C ℕ)) :=
  ⟨fun {X Y} f => by
    intro
    -- restating the result in a way that allows induction on the degree n
    suffices ∀ n : ℕ, IsIso (f.app (op [n])) by
      haveI : ∀ Δ : SimplexCategoryᵒᵖ, IsIso (f.app Δ) := fun Δ => this Δ.unop.len
      apply NatIso.isIso_of_isIso_app
    -- restating the assumption in a more practical form
    have h₁ := HomologicalComplex.congr_hom (Karoubi.hom_ext_iff.mp (IsIso.hom_inv_id (N₁.map f)))
    have h₂ := HomologicalComplex.congr_hom (Karoubi.hom_ext_iff.mp (IsIso.inv_hom_id (N₁.map f)))
    have h₃ := fun n =>
      Karoubi.HomologicalComplex.p_comm_f_assoc (inv (N₁.map f)) n (f.app (op [n]))
    simp only [N₁_map_f, Karoubi.comp_f, HomologicalComplex.comp_f,
      AlternatingFaceMapComplex.map_f, N₁_obj_p, Karoubi.id_eq, assoc] at h₁ h₂ h₃
    -- we have to construct an inverse to f in degree n, by induction on n
    intro n
    induction' n with n hn
    -- degree 0
    · use (inv (N₁.map f)).f.f 0
      have h₁₀ := h₁ 0
      have h₂₀ := h₂ 0
      dsimp at h₁₀ h₂₀
      simp only [id_comp, comp_id] at h₁₀ h₂₀
      tauto
    · haveI := hn
      

Proof state:
case succ
C : Type u_1
inst✝² : Category.{?u.28, u_1} C
inst✝¹ : Preadditive C
X Y : SimplicialObject C
f : X ⟶ Y
inst✝ : IsIso (N₁.map f)
h₂ :
  ∀ (i : ℕ),
    HomologicalComplex.Hom.f (inv (N₁.map f)).f i ≫ HomologicalComplex.Hom.f PInfty i ≫ f.app (op [i]) =
      HomologicalComplex.Hom.f PInfty i
h₃ :
  ∀ (n : ℕ),
    HomologicalComplex.Hom.f PInfty n ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f n ≫ f.app (op [n]) =
      HomologicalComplex.Hom.f (inv (N₁.map f)).f n ≫ HomologicalComplex.Hom.f PInfty n ≫ f.app (op [n])
h₁ :
  ∀ (i : ℕ),
    HomologicalComplex.Hom.f PInfty i ≫ f.app (op [i]) ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f i =
      HomologicalComplex.Hom.f PInfty i
n : ℕ
hn this : IsIso (f.app (op [n]))
⊢ IsIso (f.app (op [Nat.succ n]))

Next tactic:
use φ { a := PInfty.f (n + 1) ≫ (inv (N₁.map f)).f.f (n + 1)
              b := fun i => inv (f.app (op [n])) ≫ X.σ i }
instance : ReflectsIsomorphisms (N₁ : SimplicialObject C ⥤ Karoubi (ChainComplex C ℕ)) :=
  ⟨fun {X Y} f => by
    intro
    -- restating the result in a way that allows induction on the degree n
    suffices ∀ n : ℕ, IsIso (f.app (op [n])) by
      haveI : ∀ Δ : SimplexCategoryᵒᵖ, IsIso (f.app Δ) := fun Δ => this Δ.unop.len
      apply NatIso.isIso_of_isIso_app
    -- restating the assumption in a more practical form
    have h₁ := HomologicalComplex.congr_hom (Karoubi.hom_ext_iff.mp (IsIso.hom_inv_id (N₁.map f)))
    have h₂ := HomologicalComplex.congr_hom (Karoubi.hom_ext_iff.mp (IsIso.inv_hom_id (N₁.map f)))
    have h₃ := fun n =>
      Karoubi.HomologicalComplex.p_comm_f_assoc (inv (N₁.map f)) n (f.app (op [n]))
    simp only [N₁_map_f, Karoubi.comp_f, HomologicalComplex.comp_f,
      AlternatingFaceMapComplex.map_f, N₁_obj_p, Karoubi.id_eq, assoc] at h₁ h₂ h₃
    -- we have to construct an inverse to f in degree n, by induction on n
    intro n
    induction' n with n hn
    -- degree 0
    · use (inv (N₁.map f)).f.f 0
      have h₁₀ := h₁ 0
      have h₂₀ := h₂ 0
      dsimp at h₁₀ h₂₀
      simp only [id_comp, comp_id] at h₁₀ h₂₀
      tauto
    · haveI := hn
      use φ { a := PInfty.f (n + 1) ≫ (inv (N₁.map f)).f.f (n + 1)
              b := fun i => inv (f.app (op [n])) ≫ X.σ i }
      

Proof state:
case h
C : Type u_1
inst✝² : Category.{?u.28, u_1} C
inst✝¹ : Preadditive C
X Y : SimplicialObject C
f : X ⟶ Y
inst✝ : IsIso (N₁.map f)
h₂ :
  ∀ (i : ℕ),
    HomologicalComplex.Hom.f (inv (N₁.map f)).f i ≫ HomologicalComplex.Hom.f PInfty i ≫ f.app (op [i]) =
      HomologicalComplex.Hom.f PInfty i
h₃ :
  ∀ (n : ℕ),
    HomologicalComplex.Hom.f PInfty n ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f n ≫ f.app (op [n]) =
      HomologicalComplex.Hom.f (inv (N₁.map f)).f n ≫ HomologicalComplex.Hom.f PInfty n ≫ f.app (op [n])
h₁ :
  ∀ (i : ℕ),
    HomologicalComplex.Hom.f PInfty i ≫ f.app (op [i]) ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f i =
      HomologicalComplex.Hom.f PInfty i
n : ℕ
hn this : IsIso (f.app (op [n]))
⊢ f.app (op [Nat.succ n]) ≫
        φ
          { a := HomologicalComplex.Hom.f PInfty (n + 1) ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f (n + 1),
            b := fun i => inv (f.app (op [n])) ≫ SimplicialObject.σ X i } =
      𝟙 (X.obj (op [Nat.succ n])) ∧
    φ
          { a := HomologicalComplex.Hom.f PInfty (n + 1) ≫ HomologicalComplex.Hom.f (inv (N₁.map f)).f (n + 1),
            b := fun i => inv (f.app (op [n])) ≫ SimplicialObject.σ X i } ≫
        f.app (op [Nat.succ n]) =
      𝟙 (Y.obj (op [Nat.succ n]))

Next tactic:
simp only [MorphComponents.id, ← id_φ, ← preComp_φ, preComp, ← postComp_φ, postComp,
        PInfty_f_naturality_assoc, IsIso.hom_inv_id_assoc, assoc, IsIso.inv_hom_id_assoc,
        SimplicialObject.σ_naturality, h₁, h₂, h₃, and_self]
theorem compatibility_N₂_N₁_karoubi :
    N₂ ⋙ (karoubiChainComplexEquivalence C ℕ).functor =
      karoubiFunctorCategoryEmbedding SimplexCategoryᵒᵖ C ⋙
        N₁ ⋙ (karoubiChainComplexEquivalence (Karoubi C) ℕ).functor ⋙
            Functor.mapHomologicalComplex (KaroubiKaroubi.equivalence C).inverse _ := by
  

Proof state:
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Preadditive C
⊢ N₂ ⋙ (karoubiChainComplexEquivalence C ℕ).functor =
    karoubiFunctorCategoryEmbedding SimplexCategoryᵒᵖ C ⋙
      N₁ ⋙
        (karoubiChainComplexEquivalence (Karoubi C) ℕ).functor ⋙
          Functor.mapHomologicalComplex (KaroubiKaroubi.equivalence C).inverse (ComplexShape.down ℕ)

Next tactic:
refine' CategoryTheory.Functor.ext (fun P => _) fun P Q f => _