l3lab/ntp-mathlib huggingface dataset:
lemma mk₃_surjective (X : ComposableArrows C 3) :
    ∃ (X₀ X₁ X₂ X₃ : C) (f₀ : X₀ ⟶ X₁) (f₁ : X₁ ⟶ X₂) (f₂ : X₂ ⟶ X₃), X = mk₃ f₀ f₁ f₂ :=
  ⟨_, _, _, _, X.map' 0 1, X.map' 1 2, X.map' 2 3,
    ext₃ rfl rfl rfl rfl (by simp) (by simp) (by 

Proof state:
C : Type u_1
inst✝ : Category.{u_2, u_1} C
n m : ℕ
F G : ComposableArrows C n
X : ComposableArrows C 3
⊢ map' X 2 3 =
    eqToHom (_ : obj' X 2 = obj' X 2) ≫
      map' (mk₃ (map' X 0 1) (map' X 1 2) (map' X 2 3)) 2 3 ≫
        eqToHom (_ : obj' (mk₃ (map' X 0 1) (map' X 1 2) (map' X 2 3)) 3 = obj' X 3)

Next tactic:
simp
@[simp]
lemma homMk₄_app_two :
    (homMk₄ app₀ app₁ app₂ app₃ app₄ w₀ w₁ w₂ w₃).app ⟨2, by 

Proof state:
C : Type u_1
inst✝ : Category.{?u.1400714, u_1} C
n m : ℕ
F G : ComposableArrows C n
f g : ComposableArrows C 4
app₀ : obj' f 0 ⟶ obj' g 0
app₁ : obj' f 1 ⟶ obj' g 1
app₂ : obj' f 2 ⟶ obj' g 2
app₃ : obj' f 3 ⟶ obj' g 3
app₄ : obj' f 4 ⟶ obj' g 4
w₀ : map' f 0 1 ≫ app₁ = app₀ ≫ map' g 0 1
w₁ : map' f 1 2 ≫ app₂ = app₁ ≫ map' g 1 2
w₂ : map' f 2 3 ≫ app₃ = app₂ ≫ map' g 2 3
w₃ : map' f 3 4 ≫ app₄ = app₃ ≫ map' g 3 4
⊢ 2 < 4 + 1

Next tactic:
linarith
@[simp]
lemma homMk₄_app_three :
    (homMk₄ app₀ app₁ app₂ app₃ app₄ w₀ w₁ w₂ w₃).app ⟨3, by 

Proof state:
C : Type u_1
inst✝ : Category.{?u.1439614, u_1} C
n m : ℕ
F G : ComposableArrows C n
f g : ComposableArrows C 4
app₀ : obj' f 0 ⟶ obj' g 0
app₁ : obj' f 1 ⟶ obj' g 1
app₂ : obj' f 2 ⟶ obj' g 2
app₃ : obj' f 3 ⟶ obj' g 3
app₄ : obj' f 4 ⟶ obj' g 4
w₀ : map' f 0 1 ≫ app₁ = app₀ ≫ map' g 0 1
w₁ : map' f 1 2 ≫ app₂ = app₁ ≫ map' g 1 2
w₂ : map' f 2 3 ≫ app₃ = app₂ ≫ map' g 2 3
w₃ : map' f 3 4 ≫ app₄ = app₃ ≫ map' g 3 4
⊢ 3 < 4 + 1

Next tactic:
linarith
@[simp]
lemma homMk₄_app_four :
    (homMk₄ app₀ app₁ app₂ app₃ app₄ w₀ w₁ w₂ w₃).app ⟨4, by 

Proof state:
C : Type u_1
inst✝ : Category.{?u.1478526, u_1} C
n m : ℕ
F G : ComposableArrows C n
f g : ComposableArrows C 4
app₀ : obj' f 0 ⟶ obj' g 0
app₁ : obj' f 1 ⟶ obj' g 1
app₂ : obj' f 2 ⟶ obj' g 2
app₃ : obj' f 3 ⟶ obj' g 3
app₄ : obj' f 4 ⟶ obj' g 4
w₀ : map' f 0 1 ≫ app₁ = app₀ ≫ map' g 0 1
w₁ : map' f 1 2 ≫ app₂ = app₁ ≫ map' g 1 2
w₂ : map' f 2 3 ≫ app₃ = app₂ ≫ map' g 2 3
w₃ : map' f 3 4 ≫ app₄ = app₃ ≫ map' g 3 4
⊢ 4 < 4 + 1

Next tactic:
linarith
/-- Constructor for isomorphisms in `ComposableArrows C 4`. -/
@[simps]
def isoMk₄ {f g : ComposableArrows C 4}
    (app₀ : f.obj' 0 ≅ g.obj' 0) (app₁ : f.obj' 1 ≅ g.obj' 1) (app₂ : f.obj' 2 ≅ g.obj' 2)
    (app₃ : f.obj' 3 ≅ g.obj' 3) (app₄ : f.obj' 4 ≅ g.obj' 4)
    (w₀ : f.map' 0 1 ≫ app₁.hom = app₀.hom ≫ g.map' 0 1)
    (w₁ : f.map' 1 2 ≫ app₂.hom = app₁.hom ≫ g.map' 1 2)
    (w₂ : f.map' 2 3 ≫ app₃.hom = app₂.hom ≫ g.map' 2 3)
    (w₃ : f.map' 3 4 ≫ app₄.hom = app₃.hom ≫ g.map' 3 4) :
    f ≅ g where
  hom := homMk₄ app₀.hom app₁.hom app₂.hom app₃.hom app₄.hom w₀ w₁ w₂ w₃
  inv := homMk₄ app₀.inv app₁.inv app₂.inv app₃.inv app₄.inv
    (by 

Proof state:
C : Type u_1
inst✝ : Category.{?u.1533275, u_1} C
n m : ℕ
F G : ComposableArrows C n
f g : ComposableArrows C 4
app₀ : obj' f 0 ≅ obj' g 0
app₁ : obj' f 1 ≅ obj' g 1
app₂ : obj' f 2 ≅ obj' g 2
app₃ : obj' f 3 ≅ obj' g 3
app₄ : obj' f 4 ≅ obj' g 4
w₀ : map' f 0 1 ≫ app₁.hom = app₀.hom ≫ map' g 0 1
w₁ : map' f 1 2 ≫ app₂.hom = app₁.hom ≫ map' g 1 2
w₂ : map' f 2 3 ≫ app₃.hom = app₂.hom ≫ map' g 2 3
w₃ : map' f 3 4 ≫ app₄.hom = app₃.hom ≫ map' g 3 4
⊢ map' g 0 1 ≫ app₁.inv = app₀.inv ≫ map' f 0 1

Next tactic:
rw [← cancel_epi app₀.hom, ← reassoc_of% w₀, app₁.hom_inv_id,
      comp_id, app₀.hom_inv_id_assoc]
/-- Constructor for isomorphisms in `ComposableArrows C 4`. -/
@[simps]
def isoMk₄ {f g : ComposableArrows C 4}
    (app₀ : f.obj' 0 ≅ g.obj' 0) (app₁ : f.obj' 1 ≅ g.obj' 1) (app₂ : f.obj' 2 ≅ g.obj' 2)
    (app₃ : f.obj' 3 ≅ g.obj' 3) (app₄ : f.obj' 4 ≅ g.obj' 4)
    (w₀ : f.map' 0 1 ≫ app₁.hom = app₀.hom ≫ g.map' 0 1)
    (w₁ : f.map' 1 2 ≫ app₂.hom = app₁.hom ≫ g.map' 1 2)
    (w₂ : f.map' 2 3 ≫ app₃.hom = app₂.hom ≫ g.map' 2 3)
    (w₃ : f.map' 3 4 ≫ app₄.hom = app₃.hom ≫ g.map' 3 4) :
    f ≅ g where
  hom := homMk₄ app₀.hom app₁.hom app₂.hom app₃.hom app₄.hom w₀ w₁ w₂ w₃
  inv := homMk₄ app₀.inv app₁.inv app₂.inv app₃.inv app₄.inv
    (by rw [← cancel_epi app₀.hom, ← reassoc_of% w₀, app₁.hom_inv_id,
      comp_id, app₀.hom_inv_id_assoc])
    (by 

Proof state:
C : Type u_1
inst✝ : Category.{?u.1533275, u_1} C
n m : ℕ
F G : ComposableArrows C n
f g : ComposableArrows C 4
app₀ : obj' f 0 ≅ obj' g 0
app₁ : obj' f 1 ≅ obj' g 1
app₂ : obj' f 2 ≅ obj' g 2
app₃ : obj' f 3 ≅ obj' g 3
app₄ : obj' f 4 ≅ obj' g 4
w₀ : map' f 0 1 ≫ app₁.hom = app₀.hom ≫ map' g 0 1
w₁ : map' f 1 2 ≫ app₂.hom = app₁.hom ≫ map' g 1 2
w₂ : map' f 2 3 ≫ app₃.hom = app₂.hom ≫ map' g 2 3
w₃ : map' f 3 4 ≫ app₄.hom = app₃.hom ≫ map' g 3 4
⊢ map' g 1 2 ≫ app₂.inv = app₁.inv ≫ map' f 1 2

Next tactic:
rw [← cancel_epi app₁.hom, ← reassoc_of% w₁, app₂.hom_inv_id,
      comp_id, app₁.hom_inv_id_assoc]
/-- Constructor for isomorphisms in `ComposableArrows C 4`. -/
@[simps]
def isoMk₄ {f g : ComposableArrows C 4}
    (app₀ : f.obj' 0 ≅ g.obj' 0) (app₁ : f.obj' 1 ≅ g.obj' 1) (app₂ : f.obj' 2 ≅ g.obj' 2)
    (app₃ : f.obj' 3 ≅ g.obj' 3) (app₄ : f.obj' 4 ≅ g.obj' 4)
    (w₀ : f.map' 0 1 ≫ app₁.hom = app₀.hom ≫ g.map' 0 1)
    (w₁ : f.map' 1 2 ≫ app₂.hom = app₁.hom ≫ g.map' 1 2)
    (w₂ : f.map' 2 3 ≫ app₃.hom = app₂.hom ≫ g.map' 2 3)
    (w₃ : f.map' 3 4 ≫ app₄.hom = app₃.hom ≫ g.map' 3 4) :
    f ≅ g where
  hom := homMk₄ app₀.hom app₁.hom app₂.hom app₃.hom app₄.hom w₀ w₁ w₂ w₃
  inv := homMk₄ app₀.inv app₁.inv app₂.inv app₃.inv app₄.inv
    (by rw [← cancel_epi app₀.hom, ← reassoc_of% w₀, app₁.hom_inv_id,
      comp_id, app₀.hom_inv_id_assoc])
    (by rw [← cancel_epi app₁.hom, ← reassoc_of% w₁, app₂.hom_inv_id,
      comp_id, app₁.hom_inv_id_assoc])
    (by 

Proof state:
C : Type u_1
inst✝ : Category.{?u.1533275, u_1} C
n m : ℕ
F G : ComposableArrows C n
f g : ComposableArrows C 4
app₀ : obj' f 0 ≅ obj' g 0
app₁ : obj' f 1 ≅ obj' g 1
app₂ : obj' f 2 ≅ obj' g 2
app₃ : obj' f 3 ≅ obj' g 3
app₄ : obj' f 4 ≅ obj' g 4
w₀ : map' f 0 1 ≫ app₁.hom = app₀.hom ≫ map' g 0 1
w₁ : map' f 1 2 ≫ app₂.hom = app₁.hom ≫ map' g 1 2
w₂ : map' f 2 3 ≫ app₃.hom = app₂.hom ≫ map' g 2 3
w₃ : map' f 3 4 ≫ app₄.hom = app₃.hom ≫ map' g 3 4
⊢ map' g 2 3 ≫ app₃.inv = app₂.inv ≫ map' f 2 3

Next tactic:
rw [← cancel_epi app₂.hom, ← reassoc_of% w₂, app₃.hom_inv_id,
      comp_id, app₂.hom_inv_id_assoc]
/-- Constructor for isomorphisms in `ComposableArrows C 4`. -/
@[simps]
def isoMk₄ {f g : ComposableArrows C 4}
    (app₀ : f.obj' 0 ≅ g.obj' 0) (app₁ : f.obj' 1 ≅ g.obj' 1) (app₂ : f.obj' 2 ≅ g.obj' 2)
    (app₃ : f.obj' 3 ≅ g.obj' 3) (app₄ : f.obj' 4 ≅ g.obj' 4)
    (w₀ : f.map' 0 1 ≫ app₁.hom = app₀.hom ≫ g.map' 0 1)
    (w₁ : f.map' 1 2 ≫ app₂.hom = app₁.hom ≫ g.map' 1 2)
    (w₂ : f.map' 2 3 ≫ app₃.hom = app₂.hom ≫ g.map' 2 3)
    (w₃ : f.map' 3 4 ≫ app₄.hom = app₃.hom ≫ g.map' 3 4) :
    f ≅ g where
  hom := homMk₄ app₀.hom app₁.hom app₂.hom app₃.hom app₄.hom w₀ w₁ w₂ w₃
  inv := homMk₄ app₀.inv app₁.inv app₂.inv app₃.inv app₄.inv
    (by rw [← cancel_epi app₀.hom, ← reassoc_of% w₀, app₁.hom_inv_id,
      comp_id, app₀.hom_inv_id_assoc])
    (by rw [← cancel_epi app₁.hom, ← reassoc_of% w₁, app₂.hom_inv_id,
      comp_id, app₁.hom_inv_id_assoc])
    (by rw [← cancel_epi app₂.hom, ← reassoc_of% w₂, app₃.hom_inv_id,
      comp_id, app₂.hom_inv_id_assoc])
    (by 

Proof state:
C : Type u_1
inst✝ : Category.{?u.1533275, u_1} C
n m : ℕ
F G : ComposableArrows C n
f g : ComposableArrows C 4
app₀ : obj' f 0 ≅ obj' g 0
app₁ : obj' f 1 ≅ obj' g 1
app₂ : obj' f 2 ≅ obj' g 2
app₃ : obj' f 3 ≅ obj' g 3
app₄ : obj' f 4 ≅ obj' g 4
w₀ : map' f 0 1 ≫ app₁.hom = app₀.hom ≫ map' g 0 1
w₁ : map' f 1 2 ≫ app₂.hom = app₁.hom ≫ map' g 1 2
w₂ : map' f 2 3 ≫ app₃.hom = app₂.hom ≫ map' g 2 3
w₃ : map' f 3 4 ≫ app₄.hom = app₃.hom ≫ map' g 3 4
⊢ map' g 3 4 ≫ app₄.inv = app₃.inv ≫ map' f 3 4

Next tactic:
rw [← cancel_epi app₃.hom, ← reassoc_of% w₃, app₄.hom_inv_id,
      comp_id, app₃.hom_inv_id_assoc]
lemma mk₄_surjective (X : ComposableArrows C 4) :
    ∃ (X₀ X₁ X₂ X₃ X₄ : C) (f₀ : X₀ ⟶ X₁) (f₁ : X₁ ⟶ X₂) (f₂ : X₂ ⟶ X₃) (f₃ : X₃ ⟶ X₄),
      X = mk₄ f₀ f₁ f₂ f₃ :=
  ⟨_, _, _, _, _, X.map' 0 1, X.map' 1 2, X.map' 2 3, X.map' 3 4,
    ext₄ rfl rfl rfl rfl rfl (by 

Proof state:
C : Type u_1
inst✝ : Category.{u_2, u_1} C
n m : ℕ
F G : ComposableArrows C n
X : ComposableArrows C 4
⊢ map' X 0 1 =
    eqToHom (_ : obj' X 0 = obj' X 0) ≫
      map' (mk₄ (map' X 0 1) (map' X 1 2) (map' X 2 3) (map' X 3 4)) 0 1 ≫
        eqToHom (_ : obj' (mk₄ (map' X 0 1) (map' X 1 2) (map' X 2 3) (map' X 3 4)) 1 = obj' X 1)

Next tactic:
simp
lemma mk₄_surjective (X : ComposableArrows C 4) :
    ∃ (X₀ X₁ X₂ X₃ X₄ : C) (f₀ : X₀ ⟶ X₁) (f₁ : X₁ ⟶ X₂) (f₂ : X₂ ⟶ X₃) (f₃ : X₃ ⟶ X₄),
      X = mk₄ f₀ f₁ f₂ f₃ :=
  ⟨_, _, _, _, _, X.map' 0 1, X.map' 1 2, X.map' 2 3, X.map' 3 4,
    ext₄ rfl rfl rfl rfl rfl (by simp) (by 

Proof state:
C : Type u_1
inst✝ : Category.{u_2, u_1} C
n m : ℕ
F G : ComposableArrows C n
X : ComposableArrows C 4
⊢ map' X 1 2 =
    eqToHom (_ : obj' X 1 = obj' X 1) ≫
      map' (mk₄ (map' X 0 1) (map' X 1 2) (map' X 2 3) (map' X 3 4)) 1 2 ≫
        eqToHom (_ : obj' (mk₄ (map' X 0 1) (map' X 1 2) (map' X 2 3) (map' X 3 4)) 2 = obj' X 2)

Next tactic:
simp
lemma mk₄_surjective (X : ComposableArrows C 4) :
    ∃ (X₀ X₁ X₂ X₃ X₄ : C) (f₀ : X₀ ⟶ X₁) (f₁ : X₁ ⟶ X₂) (f₂ : X₂ ⟶ X₃) (f₃ : X₃ ⟶ X₄),
      X = mk₄ f₀ f₁ f₂ f₃ :=
  ⟨_, _, _, _, _, X.map' 0 1, X.map' 1 2, X.map' 2 3, X.map' 3 4,
    ext₄ rfl rfl rfl rfl rfl (by simp) (by simp) (by 

Proof state:
C : Type u_1
inst✝ : Category.{u_2, u_1} C
n m : ℕ
F G : ComposableArrows C n
X : ComposableArrows C 4
⊢ map' X 2 3 =
    eqToHom (_ : obj' X 2 = obj' X 2) ≫
      map' (mk₄ (map' X 0 1) (map' X 1 2) (map' X 2 3) (map' X 3 4)) 2 3 ≫
        eqToHom (_ : obj' (mk₄ (map' X 0 1) (map' X 1 2) (map' X 2 3) (map' X 3 4)) 3 = obj' X 3)

Next tactic:
simp
lemma mk₄_surjective (X : ComposableArrows C 4) :
    ∃ (X₀ X₁ X₂ X₃ X₄ : C) (f₀ : X₀ ⟶ X₁) (f₁ : X₁ ⟶ X₂) (f₂ : X₂ ⟶ X₃) (f₃ : X₃ ⟶ X₄),
      X = mk₄ f₀ f₁ f₂ f₃ :=
  ⟨_, _, _, _, _, X.map' 0 1, X.map' 1 2, X.map' 2 3, X.map' 3 4,
    ext₄ rfl rfl rfl rfl rfl (by simp) (by simp) (by simp) (by 

Proof state:
C : Type u_1
inst✝ : Category.{u_2, u_1} C
n m : ℕ
F G : ComposableArrows C n
X : ComposableArrows C 4
⊢ map' X 3 4 =
    eqToHom (_ : obj' X 3 = obj' X 3) ≫
      map' (mk₄ (map' X 0 1) (map' X 1 2) (map' X 2 3) (map' X 3 4)) 3 4 ≫
        eqToHom (_ : obj' (mk₄ (map' X 0 1) (map' X 1 2) (map' X 2 3) (map' X 3 4)) 4 = obj' X 4)

Next tactic:
simp
@[simp]
lemma homMk₅_app_two :
    (homMk₅ app₀ app₁ app₂ app₃ app₄ app₅ w₀ w₁ w₂ w₃ w₄).app ⟨2, by 

Proof state:
C : Type u_1
inst✝ : Category.{?u.1926145, u_1} C
n m : ℕ
F G : ComposableArrows C n
f g : ComposableArrows C 5
app₀ : obj' f 0 ⟶ obj' g 0
app₁ : obj' f 1 ⟶ obj' g 1
app₂ : obj' f 2 ⟶ obj' g 2
app₃ : obj' f 3 ⟶ obj' g 3
app₄ : obj' f 4 ⟶ obj' g 4
app₅ : obj' f 5 ⟶ obj' g 5
w₀ : map' f 0 1 ≫ app₁ = app₀ ≫ map' g 0 1
w₁ : map' f 1 2 ≫ app₂ = app₁ ≫ map' g 1 2
w₂ : map' f 2 3 ≫ app₃ = app₂ ≫ map' g 2 3
w₃ : map' f 3 4 ≫ app₄ = app₃ ≫ map' g 3 4
w₄ : map' f 4 5 ≫ app₅ = app₄ ≫ map' g 4 5
⊢ 2 < 5 + 1

Next tactic:
linarith
@[simp]
lemma homMk₅_app_three :
    (homMk₅ app₀ app₁ app₂ app₃ app₄ app₅ w₀ w₁ w₂ w₃ w₄).app ⟨3, by 

Proof state:
C : Type u_1
inst✝ : Category.{?u.1975193, u_1} C
n m : ℕ
F G : ComposableArrows C n
f g : ComposableArrows C 5
app₀ : obj' f 0 ⟶ obj' g 0
app₁ : obj' f 1 ⟶ obj' g 1
app₂ : obj' f 2 ⟶ obj' g 2
app₃ : obj' f 3 ⟶ obj' g 3
app₄ : obj' f 4 ⟶ obj' g 4
app₅ : obj' f 5 ⟶ obj' g 5
w₀ : map' f 0 1 ≫ app₁ = app₀ ≫ map' g 0 1
w₁ : map' f 1 2 ≫ app₂ = app₁ ≫ map' g 1 2
w₂ : map' f 2 3 ≫ app₃ = app₂ ≫ map' g 2 3
w₃ : map' f 3 4 ≫ app₄ = app₃ ≫ map' g 3 4
w₄ : map' f 4 5 ≫ app₅ = app₄ ≫ map' g 4 5
⊢ 3 < 5 + 1

Next tactic:
linarith
@[simp]
lemma homMk₅_app_four :
    (homMk₅ app₀ app₁ app₂ app₃ app₄ app₅ w₀ w₁ w₂ w₃ w₄).app ⟨4, by 

Proof state:
C : Type u_1
inst✝ : Category.{?u.2024251, u_1} C
n m : ℕ
F G : ComposableArrows C n
f g : ComposableArrows C 5
app₀ : obj' f 0 ⟶ obj' g 0
app₁ : obj' f 1 ⟶ obj' g 1
app₂ : obj' f 2 ⟶ obj' g 2
app₃ : obj' f 3 ⟶ obj' g 3
app₄ : obj' f 4 ⟶ obj' g 4
app₅ : obj' f 5 ⟶ obj' g 5
w₀ : map' f 0 1 ≫ app₁ = app₀ ≫ map' g 0 1
w₁ : map' f 1 2 ≫ app₂ = app₁ ≫ map' g 1 2
w₂ : map' f 2 3 ≫ app₃ = app₂ ≫ map' g 2 3
w₃ : map' f 3 4 ≫ app₄ = app₃ ≫ map' g 3 4
w₄ : map' f 4 5 ≫ app₅ = app₄ ≫ map' g 4 5
⊢ 4 < 5 + 1

Next tactic:
linarith
@[simp]
lemma homMk₅_app_five :
    (homMk₅ app₀ app₁ app₂ app₃ app₄ app₅ w₀ w₁ w₂ w₃ w₄).app ⟨5, by 

Proof state:
C : Type u_1
inst✝ : Category.{?u.2073321, u_1} C
n m : ℕ
F G : ComposableArrows C n
f g : ComposableArrows C 5
app₀ : obj' f 0 ⟶ obj' g 0
app₁ : obj' f 1 ⟶ obj' g 1
app₂ : obj' f 2 ⟶ obj' g 2
app₃ : obj' f 3 ⟶ obj' g 3
app₄ : obj' f 4 ⟶ obj' g 4
app₅ : obj' f 5 ⟶ obj' g 5
w₀ : map' f 0 1 ≫ app₁ = app₀ ≫ map' g 0 1
w₁ : map' f 1 2 ≫ app₂ = app₁ ≫ map' g 1 2
w₂ : map' f 2 3 ≫ app₃ = app₂ ≫ map' g 2 3
w₃ : map' f 3 4 ≫ app₄ = app₃ ≫ map' g 3 4
w₄ : map' f 4 5 ≫ app₅ = app₄ ≫ map' g 4 5
⊢ 5 < 5 + 1

Next tactic:
linarith
set_option maxHeartbeats 400000 in
/-- Constructor for isomorphisms in `ComposableArrows C 5`. -/
@[simps]
def isoMk₅ {f g : ComposableArrows C 5}
    (app₀ : f.obj' 0 ≅ g.obj' 0) (app₁ : f.obj' 1 ≅ g.obj' 1) (app₂ : f.obj' 2 ≅ g.obj' 2)
    (app₃ : f.obj' 3 ≅ g.obj' 3) (app₄ : f.obj' 4 ≅ g.obj' 4) (app₅ : f.obj' 5 ≅ g.obj' 5)
    (w₀ : f.map' 0 1 ≫ app₁.hom = app₀.hom ≫ g.map' 0 1)
    (w₁ : f.map' 1 2 ≫ app₂.hom = app₁.hom ≫ g.map' 1 2)
    (w₂ : f.map' 2 3 ≫ app₃.hom = app₂.hom ≫ g.map' 2 3)
    (w₃ : f.map' 3 4 ≫ app₄.hom = app₃.hom ≫ g.map' 3 4)
    (w₄ : f.map' 4 5 ≫ app₅.hom = app₄.hom ≫ g.map' 4 5) :
    f ≅ g where
  hom := homMk₅ app₀.hom app₁.hom app₂.hom app₃.hom app₄.hom app₅.hom w₀ w₁ w₂ w₃ w₄
  inv := homMk₅ app₀.inv app₁.inv app₂.inv app₃.inv app₄.inv app₅.inv
    (by 

Proof state:
C : Type u_1
inst✝ : Category.{?u.2142201, u_1} C
n m : ℕ
F G : ComposableArrows C n
f g : ComposableArrows C 5
app₀ : obj' f 0 ≅ obj' g 0
app₁ : obj' f 1 ≅ obj' g 1
app₂ : obj' f 2 ≅ obj' g 2
app₃ : obj' f 3 ≅ obj' g 3
app₄ : obj' f 4 ≅ obj' g 4
app₅ : obj' f 5 ≅ obj' g 5
w₀ : map' f 0 1 ≫ app₁.hom = app₀.hom ≫ map' g 0 1
w₁ : map' f 1 2 ≫ app₂.hom = app₁.hom ≫ map' g 1 2
w₂ : map' f 2 3 ≫ app₃.hom = app₂.hom ≫ map' g 2 3
w₃ : map' f 3 4 ≫ app₄.hom = app₃.hom ≫ map' g 3 4
w₄ : map' f 4 5 ≫ app₅.hom = app₄.hom ≫ map' g 4 5
⊢ map' g 0 1 ≫ app₁.inv = app₀.inv ≫ map' f 0 1

Next tactic:
rw [← cancel_epi app₀.hom, ← reassoc_of% w₀, app₁.hom_inv_id,
      comp_id, app₀.hom_inv_id_assoc]
set_option maxHeartbeats 400000 in
/-- Constructor for isomorphisms in `ComposableArrows C 5`. -/
@[simps]
def isoMk₅ {f g : ComposableArrows C 5}
    (app₀ : f.obj' 0 ≅ g.obj' 0) (app₁ : f.obj' 1 ≅ g.obj' 1) (app₂ : f.obj' 2 ≅ g.obj' 2)
    (app₃ : f.obj' 3 ≅ g.obj' 3) (app₄ : f.obj' 4 ≅ g.obj' 4) (app₅ : f.obj' 5 ≅ g.obj' 5)
    (w₀ : f.map' 0 1 ≫ app₁.hom = app₀.hom ≫ g.map' 0 1)
    (w₁ : f.map' 1 2 ≫ app₂.hom = app₁.hom ≫ g.map' 1 2)
    (w₂ : f.map' 2 3 ≫ app₃.hom = app₂.hom ≫ g.map' 2 3)
    (w₃ : f.map' 3 4 ≫ app₄.hom = app₃.hom ≫ g.map' 3 4)
    (w₄ : f.map' 4 5 ≫ app₅.hom = app₄.hom ≫ g.map' 4 5) :
    f ≅ g where
  hom := homMk₅ app₀.hom app₁.hom app₂.hom app₃.hom app₄.hom app₅.hom w₀ w₁ w₂ w₃ w₄
  inv := homMk₅ app₀.inv app₁.inv app₂.inv app₃.inv app₄.inv app₅.inv
    (by rw [← cancel_epi app₀.hom, ← reassoc_of% w₀, app₁.hom_inv_id,
      comp_id, app₀.hom_inv_id_assoc])
    (by 

Proof state:
C : Type u_1
inst✝ : Category.{?u.2142201, u_1} C
n m : ℕ
F G : ComposableArrows C n
f g : ComposableArrows C 5
app₀ : obj' f 0 ≅ obj' g 0
app₁ : obj' f 1 ≅ obj' g 1
app₂ : obj' f 2 ≅ obj' g 2
app₃ : obj' f 3 ≅ obj' g 3
app₄ : obj' f 4 ≅ obj' g 4
app₅ : obj' f 5 ≅ obj' g 5
w₀ : map' f 0 1 ≫ app₁.hom = app₀.hom ≫ map' g 0 1
w₁ : map' f 1 2 ≫ app₂.hom = app₁.hom ≫ map' g 1 2
w₂ : map' f 2 3 ≫ app₃.hom = app₂.hom ≫ map' g 2 3
w₃ : map' f 3 4 ≫ app₄.hom = app₃.hom ≫ map' g 3 4
w₄ : map' f 4 5 ≫ app₅.hom = app₄.hom ≫ map' g 4 5
⊢ map' g 1 2 ≫ app₂.inv = app₁.inv ≫ map' f 1 2

Next tactic:
rw [← cancel_epi app₁.hom, ← reassoc_of% w₁, app₂.hom_inv_id,
      comp_id, app₁.hom_inv_id_assoc]
set_option maxHeartbeats 400000 in
/-- Constructor for isomorphisms in `ComposableArrows C 5`. -/
@[simps]
def isoMk₅ {f g : ComposableArrows C 5}
    (app₀ : f.obj' 0 ≅ g.obj' 0) (app₁ : f.obj' 1 ≅ g.obj' 1) (app₂ : f.obj' 2 ≅ g.obj' 2)
    (app₃ : f.obj' 3 ≅ g.obj' 3) (app₄ : f.obj' 4 ≅ g.obj' 4) (app₅ : f.obj' 5 ≅ g.obj' 5)
    (w₀ : f.map' 0 1 ≫ app₁.hom = app₀.hom ≫ g.map' 0 1)
    (w₁ : f.map' 1 2 ≫ app₂.hom = app₁.hom ≫ g.map' 1 2)
    (w₂ : f.map' 2 3 ≫ app₃.hom = app₂.hom ≫ g.map' 2 3)
    (w₃ : f.map' 3 4 ≫ app₄.hom = app₃.hom ≫ g.map' 3 4)
    (w₄ : f.map' 4 5 ≫ app₅.hom = app₄.hom ≫ g.map' 4 5) :
    f ≅ g where
  hom := homMk₅ app₀.hom app₁.hom app₂.hom app₃.hom app₄.hom app₅.hom w₀ w₁ w₂ w₃ w₄
  inv := homMk₅ app₀.inv app₁.inv app₂.inv app₃.inv app₄.inv app₅.inv
    (by rw [← cancel_epi app₀.hom, ← reassoc_of% w₀, app₁.hom_inv_id,
      comp_id, app₀.hom_inv_id_assoc])
    (by rw [← cancel_epi app₁.hom, ← reassoc_of% w₁, app₂.hom_inv_id,
      comp_id, app₁.hom_inv_id_assoc])
    (by 

Proof state:
C : Type u_1
inst✝ : Category.{?u.2142201, u_1} C
n m : ℕ
F G : ComposableArrows C n
f g : ComposableArrows C 5
app₀ : obj' f 0 ≅ obj' g 0
app₁ : obj' f 1 ≅ obj' g 1
app₂ : obj' f 2 ≅ obj' g 2
app₃ : obj' f 3 ≅ obj' g 3
app₄ : obj' f 4 ≅ obj' g 4
app₅ : obj' f 5 ≅ obj' g 5
w₀ : map' f 0 1 ≫ app₁.hom = app₀.hom ≫ map' g 0 1
w₁ : map' f 1 2 ≫ app₂.hom = app₁.hom ≫ map' g 1 2
w₂ : map' f 2 3 ≫ app₃.hom = app₂.hom ≫ map' g 2 3
w₃ : map' f 3 4 ≫ app₄.hom = app₃.hom ≫ map' g 3 4
w₄ : map' f 4 5 ≫ app₅.hom = app₄.hom ≫ map' g 4 5
⊢ map' g 2 3 ≫ app₃.inv = app₂.inv ≫ map' f 2 3

Next tactic:
rw [← cancel_epi app₂.hom, ← reassoc_of% w₂, app₃.hom_inv_id,
      comp_id, app₂.hom_inv_id_assoc]
set_option maxHeartbeats 400000 in
/-- Constructor for isomorphisms in `ComposableArrows C 5`. -/
@[simps]
def isoMk₅ {f g : ComposableArrows C 5}
    (app₀ : f.obj' 0 ≅ g.obj' 0) (app₁ : f.obj' 1 ≅ g.obj' 1) (app₂ : f.obj' 2 ≅ g.obj' 2)
    (app₃ : f.obj' 3 ≅ g.obj' 3) (app₄ : f.obj' 4 ≅ g.obj' 4) (app₅ : f.obj' 5 ≅ g.obj' 5)
    (w₀ : f.map' 0 1 ≫ app₁.hom = app₀.hom ≫ g.map' 0 1)
    (w₁ : f.map' 1 2 ≫ app₂.hom = app₁.hom ≫ g.map' 1 2)
    (w₂ : f.map' 2 3 ≫ app₃.hom = app₂.hom ≫ g.map' 2 3)
    (w₃ : f.map' 3 4 ≫ app₄.hom = app₃.hom ≫ g.map' 3 4)
    (w₄ : f.map' 4 5 ≫ app₅.hom = app₄.hom ≫ g.map' 4 5) :
    f ≅ g where
  hom := homMk₅ app₀.hom app₁.hom app₂.hom app₃.hom app₄.hom app₅.hom w₀ w₁ w₂ w₃ w₄
  inv := homMk₅ app₀.inv app₁.inv app₂.inv app₃.inv app₄.inv app₅.inv
    (by rw [← cancel_epi app₀.hom, ← reassoc_of% w₀, app₁.hom_inv_id,
      comp_id, app₀.hom_inv_id_assoc])
    (by rw [← cancel_epi app₁.hom, ← reassoc_of% w₁, app₂.hom_inv_id,
      comp_id, app₁.hom_inv_id_assoc])
    (by rw [← cancel_epi app₂.hom, ← reassoc_of% w₂, app₃.hom_inv_id,
      comp_id, app₂.hom_inv_id_assoc])
    (by 

Proof state:
C : Type u_1
inst✝ : Category.{?u.2142201, u_1} C
n m : ℕ
F G : ComposableArrows C n
f g : ComposableArrows C 5
app₀ : obj' f 0 ≅ obj' g 0
app₁ : obj' f 1 ≅ obj' g 1
app₂ : obj' f 2 ≅ obj' g 2
app₃ : obj' f 3 ≅ obj' g 3
app₄ : obj' f 4 ≅ obj' g 4
app₅ : obj' f 5 ≅ obj' g 5
w₀ : map' f 0 1 ≫ app₁.hom = app₀.hom ≫ map' g 0 1
w₁ : map' f 1 2 ≫ app₂.hom = app₁.hom ≫ map' g 1 2
w₂ : map' f 2 3 ≫ app₃.hom = app₂.hom ≫ map' g 2 3
w₃ : map' f 3 4 ≫ app₄.hom = app₃.hom ≫ map' g 3 4
w₄ : map' f 4 5 ≫ app₅.hom = app₄.hom ≫ map' g 4 5
⊢ map' g 3 4 ≫ app₄.inv = app₃.inv ≫ map' f 3 4

Next tactic:
rw [← cancel_epi app₃.hom, ← reassoc_of% w₃, app₄.hom_inv_id,
      comp_id, app₃.hom_inv_id_assoc]
set_option maxHeartbeats 400000 in
/-- Constructor for isomorphisms in `ComposableArrows C 5`. -/
@[simps]
def isoMk₅ {f g : ComposableArrows C 5}
    (app₀ : f.obj' 0 ≅ g.obj' 0) (app₁ : f.obj' 1 ≅ g.obj' 1) (app₂ : f.obj' 2 ≅ g.obj' 2)
    (app₃ : f.obj' 3 ≅ g.obj' 3) (app₄ : f.obj' 4 ≅ g.obj' 4) (app₅ : f.obj' 5 ≅ g.obj' 5)
    (w₀ : f.map' 0 1 ≫ app₁.hom = app₀.hom ≫ g.map' 0 1)
    (w₁ : f.map' 1 2 ≫ app₂.hom = app₁.hom ≫ g.map' 1 2)
    (w₂ : f.map' 2 3 ≫ app₃.hom = app₂.hom ≫ g.map' 2 3)
    (w₃ : f.map' 3 4 ≫ app₄.hom = app₃.hom ≫ g.map' 3 4)
    (w₄ : f.map' 4 5 ≫ app₅.hom = app₄.hom ≫ g.map' 4 5) :
    f ≅ g where
  hom := homMk₅ app₀.hom app₁.hom app₂.hom app₃.hom app₄.hom app₅.hom w₀ w₁ w₂ w₃ w₄
  inv := homMk₅ app₀.inv app₁.inv app₂.inv app₃.inv app₄.inv app₅.inv
    (by rw [← cancel_epi app₀.hom, ← reassoc_of% w₀, app₁.hom_inv_id,
      comp_id, app₀.hom_inv_id_assoc])
    (by rw [← cancel_epi app₁.hom, ← reassoc_of% w₁, app₂.hom_inv_id,
      comp_id, app₁.hom_inv_id_assoc])
    (by rw [← cancel_epi app₂.hom, ← reassoc_of% w₂, app₃.hom_inv_id,
      comp_id, app₂.hom_inv_id_assoc])
    (by rw [← cancel_epi app₃.hom, ← reassoc_of% w₃, app₄.hom_inv_id,
      comp_id, app₃.hom_inv_id_assoc])
    (by 

Proof state:
C : Type u_1
inst✝ : Category.{?u.2142201, u_1} C
n m : ℕ
F G : ComposableArrows C n
f g : ComposableArrows C 5
app₀ : obj' f 0 ≅ obj' g 0
app₁ : obj' f 1 ≅ obj' g 1
app₂ : obj' f 2 ≅ obj' g 2
app₃ : obj' f 3 ≅ obj' g 3
app₄ : obj' f 4 ≅ obj' g 4
app₅ : obj' f 5 ≅ obj' g 5
w₀ : map' f 0 1 ≫ app₁.hom = app₀.hom ≫ map' g 0 1
w₁ : map' f 1 2 ≫ app₂.hom = app₁.hom ≫ map' g 1 2
w₂ : map' f 2 3 ≫ app₃.hom = app₂.hom ≫ map' g 2 3
w₃ : map' f 3 4 ≫ app₄.hom = app₃.hom ≫ map' g 3 4
w₄ : map' f 4 5 ≫ app₅.hom = app₄.hom ≫ map' g 4 5
⊢ map' g 4 5 ≫ app₅.inv = app₄.inv ≫ map' f 4 5

Next tactic:
rw [← cancel_epi app₄.hom, ← reassoc_of% w₄, app₅.hom_inv_id,
      comp_id, app₄.hom_inv_id_assoc]
lemma mk₅_surjective (X : ComposableArrows C 5) :
    ∃ (X₀ X₁ X₂ X₃ X₄ X₅ : C) (f₀ : X₀ ⟶ X₁) (f₁ : X₁ ⟶ X₂) (f₂ : X₂ ⟶ X₃)
      (f₃ : X₃ ⟶ X₄) (f₄ : X₄ ⟶ X₅), X = mk₅ f₀ f₁ f₂ f₃ f₄ :=
  ⟨_, _, _, _, _, _, X.map' 0 1, X.map' 1 2, X.map' 2 3, X.map' 3 4, X.map' 4 5,
    ext₅ rfl rfl rfl rfl rfl rfl (by 

Proof state:
C : Type u_1
inst✝ : Category.{u_2, u_1} C
n m : ℕ
F G : ComposableArrows C n
X : ComposableArrows C 5
⊢ map' X 0 1 =
    eqToHom (_ : obj' X 0 = obj' X 0) ≫
      map' (mk₅ (map' X 0 1) (map' X 1 2) (map' X 2 3) (map' X 3 4) (map' X 4 5)) 0 1 ≫
        eqToHom (_ : obj' (mk₅ (map' X 0 1) (map' X 1 2) (map' X 2 3) (map' X 3 4) (map' X 4 5)) 1 = obj' X 1)

Next tactic:
simp
lemma mk₅_surjective (X : ComposableArrows C 5) :
    ∃ (X₀ X₁ X₂ X₃ X₄ X₅ : C) (f₀ : X₀ ⟶ X₁) (f₁ : X₁ ⟶ X₂) (f₂ : X₂ ⟶ X₃)
      (f₃ : X₃ ⟶ X₄) (f₄ : X₄ ⟶ X₅), X = mk₅ f₀ f₁ f₂ f₃ f₄ :=
  ⟨_, _, _, _, _, _, X.map' 0 1, X.map' 1 2, X.map' 2 3, X.map' 3 4, X.map' 4 5,
    ext₅ rfl rfl rfl rfl rfl rfl (by simp) (by 

Proof state:
C : Type u_1
inst✝ : Category.{u_2, u_1} C
n m : ℕ
F G : ComposableArrows C n
X : ComposableArrows C 5
⊢ map' X 1 2 =
    eqToHom (_ : obj' X 1 = obj' X 1) ≫
      map' (mk₅ (map' X 0 1) (map' X 1 2) (map' X 2 3) (map' X 3 4) (map' X 4 5)) 1 2 ≫
        eqToHom (_ : obj' (mk₅ (map' X 0 1) (map' X 1 2) (map' X 2 3) (map' X 3 4) (map' X 4 5)) 2 = obj' X 2)

Next tactic:
simp
lemma mk₅_surjective (X : ComposableArrows C 5) :
    ∃ (X₀ X₁ X₂ X₃ X₄ X₅ : C) (f₀ : X₀ ⟶ X₁) (f₁ : X₁ ⟶ X₂) (f₂ : X₂ ⟶ X₃)
      (f₃ : X₃ ⟶ X₄) (f₄ : X₄ ⟶ X₅), X = mk₅ f₀ f₁ f₂ f₃ f₄ :=
  ⟨_, _, _, _, _, _, X.map' 0 1, X.map' 1 2, X.map' 2 3, X.map' 3 4, X.map' 4 5,
    ext₅ rfl rfl rfl rfl rfl rfl (by simp) (by simp) (by 

Proof state:
C : Type u_1
inst✝ : Category.{u_2, u_1} C
n m : ℕ
F G : ComposableArrows C n
X : ComposableArrows C 5
⊢ map' X 2 3 =
    eqToHom (_ : obj' X 2 = obj' X 2) ≫
      map' (mk₅ (map' X 0 1) (map' X 1 2) (map' X 2 3) (map' X 3 4) (map' X 4 5)) 2 3 ≫
        eqToHom (_ : obj' (mk₅ (map' X 0 1) (map' X 1 2) (map' X 2 3) (map' X 3 4) (map' X 4 5)) 3 = obj' X 3)

Next tactic:
simp