l3lab/ntp-mathlib huggingface dataset:
example : map' (mk₃ f g h) 0 1 = f := by 

Proof state:
C : Type u_1
inst✝ : Category.{?u.533465, u_1} C
n m : ℕ
F G : ComposableArrows C n
X₀ X₁ X₂ X₃ X₄ : C
f : X₀ ⟶ X₁
g : X₁ ⟶ X₂
h : X₂ ⟶ X₃
i : X₃ ⟶ X₄
⊢ map' (mk₃ f g h) 0 1 = f

Next tactic:
dsimp
example : map' (mk₃ f g h) 1 2 = g := by 

Proof state:
C : Type u_1
inst✝ : Category.{?u.537574, u_1} C
n m : ℕ
F G : ComposableArrows C n
X₀ X₁ X₂ X₃ X₄ : C
f : X₀ ⟶ X₁
g : X₁ ⟶ X₂
h : X₂ ⟶ X₃
i : X₃ ⟶ X₄
⊢ map' (mk₃ f g h) 1 2 = g

Next tactic:
dsimp
example : map' (mk₃ f g h) 2 3 = h := by 

Proof state:
C : Type u_1
inst✝ : Category.{?u.542339, u_1} C
n m : ℕ
F G : ComposableArrows C n
X₀ X₁ X₂ X₃ X₄ : C
f : X₀ ⟶ X₁
g : X₁ ⟶ X₂
h : X₂ ⟶ X₃
i : X₃ ⟶ X₄
⊢ map' (mk₃ f g h) 2 3 = h

Next tactic:
dsimp
example : map' (mk₃ f g h) 0 3 = f ≫ g ≫ h := by 

Proof state:
C : Type u_1
inst✝ : Category.{?u.547534, u_1} C
n m : ℕ
F G : ComposableArrows C n
X₀ X₁ X₂ X₃ X₄ : C
f : X₀ ⟶ X₁
g : X₁ ⟶ X₂
h : X₂ ⟶ X₃
i : X₃ ⟶ X₄
⊢ map' (mk₃ f g h) 0 3 = f ≫ g ≫ h

Next tactic:
dsimp
example : (mk₃ f g h).hom = f ≫ g ≫ h := by 

Proof state:
C : Type u_1
inst✝ : Category.{?u.553320, u_1} C
n m : ℕ
F G : ComposableArrows C n
X₀ X₁ X₂ X₃ X₄ : C
f : X₀ ⟶ X₁
g : X₁ ⟶ X₂
h : X₂ ⟶ X₃
i : X₃ ⟶ X₄
⊢ hom (mk₃ f g h) = f ≫ g ≫ h

Next tactic:
dsimp
example : map' (mk₃ f g h) 0 2 = f ≫ g := by 

Proof state:
C : Type u_1
inst✝ : Category.{?u.556204, u_1} C
n m : ℕ
F G : ComposableArrows C n
X₀ X₁ X₂ X₃ X₄ : C
f : X₀ ⟶ X₁
g : X₁ ⟶ X₂
h : X₂ ⟶ X₃
i : X₃ ⟶ X₄
⊢ map' (mk₃ f g h) 0 2 = f ≫ g

Next tactic:
dsimp
example : map' (mk₃ f g h) 1 3 = g ≫ h := by 

Proof state:
C : Type u_1
inst✝ : Category.{?u.561581, u_1} C
n m : ℕ
F G : ComposableArrows C n
X₀ X₁ X₂ X₃ X₄ : C
f : X₀ ⟶ X₁
g : X₁ ⟶ X₂
h : X₂ ⟶ X₃
i : X₃ ⟶ X₄
⊢ map' (mk₃ f g h) 1 3 = g ≫ h

Next tactic:
dsimp
/-- Inductive construction of morphisms in `ComposableArrows C (n + 1)`: in order to construct
a morphism `F ⟶ G`, it suffices to provide `α : F.obj' 0 ⟶ G.obj' 0` and `β : F.δ₀ ⟶ G.δ₀`
such that `F.map' 0 1 ≫ app' β 0 = α ≫ G.map' 0 1`. -/
def homMkSucc : F ⟶ G :=
  homMk
    (fun i => match i with
      | ⟨0, _⟩ => α
      | ⟨i + 1, hi⟩ => app' β i)
    (fun i hi => by
      

Proof state:
C : Type u_1
inst✝ : Category.{?u.575970, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
α : obj' F 0 ⟶ obj' G 0
β : δ₀ F ⟶ δ₀ G
w : map' F 0 1 ≫ app' β 0 = α ≫ map' G 0 1
i : ℕ
hi : i < n + 1
⊢ map' F i (i + 1) ≫
      (fun i =>
          match i with
          | { val := 0, isLt := isLt } => α
          | { val := Nat.succ i, isLt := hi } => app' β i)
        { val := i + 1, isLt := (_ : i + 1 < n + 1 + 1) } =
    (fun i =>
          match i with
          | { val := 0, isLt := isLt } => α
          | { val := Nat.succ i, isLt := hi } => app' β i)
        { val := i, isLt := (_ : i < n + 1 + 1) } ≫
      map' G i (i + 1)

Next tactic:
obtain _ | i := i
/-- Inductive construction of morphisms in `ComposableArrows C (n + 1)`: in order to construct
a morphism `F ⟶ G`, it suffices to provide `α : F.obj' 0 ⟶ G.obj' 0` and `β : F.δ₀ ⟶ G.δ₀`
such that `F.map' 0 1 ≫ app' β 0 = α ≫ G.map' 0 1`. -/
def homMkSucc : F ⟶ G :=
  homMk
    (fun i => match i with
      | ⟨0, _⟩ => α
      | ⟨i + 1, hi⟩ => app' β i)
    (fun i hi => by
      obtain _ | i := i
      · 

Proof state:
case zero
C : Type u_1
inst✝ : Category.{?u.575970, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
α : obj' F 0 ⟶ obj' G 0
β : δ₀ F ⟶ δ₀ G
w : map' F 0 1 ≫ app' β 0 = α ≫ map' G 0 1
hi : Nat.zero < n + 1
⊢ map' F Nat.zero (Nat.zero + 1) ≫
      (fun i =>
          match i with
          | { val := 0, isLt := isLt } => α
          | { val := Nat.succ i, isLt := hi } => app' β i)
        { val := Nat.zero + 1, isLt := (_ : Nat.zero + 1 < n + 1 + 1) } =
    (fun i =>
          match i with
          | { val := 0, isLt := isLt } => α
          | { val := Nat.succ i, isLt := hi } => app' β i)
        { val := Nat.zero, isLt := (_ : Nat.zero < n + 1 + 1) } ≫
      map' G Nat.zero (Nat.zero + 1)

Next tactic:
exact w
/-- Inductive construction of morphisms in `ComposableArrows C (n + 1)`: in order to construct
a morphism `F ⟶ G`, it suffices to provide `α : F.obj' 0 ⟶ G.obj' 0` and `β : F.δ₀ ⟶ G.δ₀`
such that `F.map' 0 1 ≫ app' β 0 = α ≫ G.map' 0 1`. -/
def homMkSucc : F ⟶ G :=
  homMk
    (fun i => match i with
      | ⟨0, _⟩ => α
      | ⟨i + 1, hi⟩ => app' β i)
    (fun i hi => by
      obtain _ | i := i
      · exact w
      · 

Proof state:
case succ
C : Type u_1
inst✝ : Category.{?u.575970, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
α : obj' F 0 ⟶ obj' G 0
β : δ₀ F ⟶ δ₀ G
w : map' F 0 1 ≫ app' β 0 = α ≫ map' G 0 1
i : ℕ
hi : Nat.succ i < n + 1
⊢ map' F (Nat.succ i) (Nat.succ i + 1) ≫
      (fun i =>
          match i with
          | { val := 0, isLt := isLt } => α
          | { val := Nat.succ i, isLt := hi } => app' β i)
        { val := Nat.succ i + 1, isLt := (_ : Nat.succ i + 1 < n + 1 + 1) } =
    (fun i =>
          match i with
          | { val := 0, isLt := isLt } => α
          | { val := Nat.succ i, isLt := hi } => app' β i)
        { val := Nat.succ i, isLt := (_ : Nat.succ i < n + 1 + 1) } ≫
      map' G (Nat.succ i) (Nat.succ i + 1)

Next tactic:
exact naturality' β i (i + 1)
lemma hom_ext_succ {F G : ComposableArrows C (n + 1)} {f g : F ⟶ G}
    (h₀ : app' f 0 = app' g 0) (h₁ : δ₀Functor.map f = δ₀Functor.map g) : f = g := by
  

Proof state:
C : Type u_1
inst✝ : Category.{u_2, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
f g : F ⟶ G
h₀ : app' f 0 = app' g 0
h₁ : δ₀Functor.map f = δ₀Functor.map g
⊢ f = g

Next tactic:
ext ⟨i, hi⟩
lemma hom_ext_succ {F G : ComposableArrows C (n + 1)} {f g : F ⟶ G}
    (h₀ : app' f 0 = app' g 0) (h₁ : δ₀Functor.map f = δ₀Functor.map g) : f = g := by
  ext ⟨i, hi⟩
  

Proof state:
case w.h.mk
C : Type u_1
inst✝ : Category.{u_2, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
f g : F ⟶ G
h₀ : app' f 0 = app' g 0
h₁ : δ₀Functor.map f = δ₀Functor.map g
i : ℕ
hi : i < n + 1 + 1
⊢ f.app { val := i, isLt := hi } = g.app { val := i, isLt := hi }

Next tactic:
obtain _ | i := i
lemma hom_ext_succ {F G : ComposableArrows C (n + 1)} {f g : F ⟶ G}
    (h₀ : app' f 0 = app' g 0) (h₁ : δ₀Functor.map f = δ₀Functor.map g) : f = g := by
  ext ⟨i, hi⟩
  obtain _ | i := i
  · 

Proof state:
case w.h.mk.zero
C : Type u_1
inst✝ : Category.{u_2, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
f g : F ⟶ G
h₀ : app' f 0 = app' g 0
h₁ : δ₀Functor.map f = δ₀Functor.map g
hi : Nat.zero < n + 1 + 1
⊢ f.app { val := Nat.zero, isLt := hi } = g.app { val := Nat.zero, isLt := hi }

Next tactic:
exact h₀
lemma hom_ext_succ {F G : ComposableArrows C (n + 1)} {f g : F ⟶ G}
    (h₀ : app' f 0 = app' g 0) (h₁ : δ₀Functor.map f = δ₀Functor.map g) : f = g := by
  ext ⟨i, hi⟩
  obtain _ | i := i
  · exact h₀
  · 

Proof state:
case w.h.mk.succ
C : Type u_1
inst✝ : Category.{u_2, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
f g : F ⟶ G
h₀ : app' f 0 = app' g 0
h₁ : δ₀Functor.map f = δ₀Functor.map g
i : ℕ
hi : Nat.succ i < n + 1 + 1
⊢ f.app { val := Nat.succ i, isLt := hi } = g.app { val := Nat.succ i, isLt := hi }

Next tactic:
rw [Nat.succ_eq_add_one] at hi
lemma hom_ext_succ {F G : ComposableArrows C (n + 1)} {f g : F ⟶ G}
    (h₀ : app' f 0 = app' g 0) (h₁ : δ₀Functor.map f = δ₀Functor.map g) : f = g := by
  ext ⟨i, hi⟩
  obtain _ | i := i
  · exact h₀
  · rw [Nat.succ_eq_add_one] at hi
    

Proof state:
case w.h.mk.succ
C : Type u_1
inst✝ : Category.{u_2, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
f g : F ⟶ G
h₀ : app' f 0 = app' g 0
h₁ : δ₀Functor.map f = δ₀Functor.map g
i : ℕ
hi✝ : Nat.succ i < n + 1 + 1
hi : i + 1 < n + 1 + 1
⊢ f.app { val := Nat.succ i, isLt := hi✝ } = g.app { val := Nat.succ i, isLt := hi✝ }

Next tactic:
exact congr_app h₁ ⟨i, by linarith⟩
lemma hom_ext_succ {F G : ComposableArrows C (n + 1)} {f g : F ⟶ G}
    (h₀ : app' f 0 = app' g 0) (h₁ : δ₀Functor.map f = δ₀Functor.map g) : f = g := by
  ext ⟨i, hi⟩
  obtain _ | i := i
  · exact h₀
  · rw [Nat.succ_eq_add_one] at hi
    exact congr_app h₁ ⟨i, by 

Proof state:
C : Type u_1
inst✝ : Category.{u_2, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
f g : F ⟶ G
h₀ : app' f 0 = app' g 0
h₁ : δ₀Functor.map f = δ₀Functor.map g
i : ℕ
hi✝ : Nat.succ i < n + 1 + 1
hi : i + 1 < n + 1 + 1
⊢ i < n + 1

Next tactic:
linarith
/-- Inductive construction of isomorphisms in `ComposableArrows C (n + 1)`: in order to
construct an isomorphism `F ≅ G`, it suffices to provide `α : F.obj' 0 ≅ G.obj' 0` and
`β : F.δ₀ ≅ G.δ₀` such that `F.map' 0 1 ≫ app' β.hom 0 = α.hom ≫ G.map' 0 1`. -/
@[simps]
def isoMkSucc {F G : ComposableArrows C (n + 1)} (α : F.obj' 0 ≅ G.obj' 0)
    (β : F.δ₀ ≅ G.δ₀) (w : F.map' 0 1 ≫ app' β.hom 0 = α.hom ≫ G.map' 0 1) : F ≅ G where
  hom := homMkSucc α.hom β.hom w
  inv := homMkSucc α.inv β.inv (by
    

Proof state:
C : Type u_1
inst✝ : Category.{?u.623043, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
α : obj' F 0 ≅ obj' G 0
β : δ₀ F ≅ δ₀ G
w : map' F 0 1 ≫ app' β.hom 0 = α.hom ≫ map' G 0 1
⊢ map' G 0 1 ≫ app' β.inv 0 = α.inv ≫ map' F 0 1

Next tactic:
rw [← cancel_epi α.hom, ← reassoc_of% w, α.hom_inv_id_assoc, β.hom_inv_id_app]
/-- Inductive construction of isomorphisms in `ComposableArrows C (n + 1)`: in order to
construct an isomorphism `F ≅ G`, it suffices to provide `α : F.obj' 0 ≅ G.obj' 0` and
`β : F.δ₀ ≅ G.δ₀` such that `F.map' 0 1 ≫ app' β.hom 0 = α.hom ≫ G.map' 0 1`. -/
@[simps]
def isoMkSucc {F G : ComposableArrows C (n + 1)} (α : F.obj' 0 ≅ G.obj' 0)
    (β : F.δ₀ ≅ G.δ₀) (w : F.map' 0 1 ≫ app' β.hom 0 = α.hom ≫ G.map' 0 1) : F ≅ G where
  hom := homMkSucc α.hom β.hom w
  inv := homMkSucc α.inv β.inv (by
    rw [← cancel_epi α.hom, ← reassoc_of% w, α.hom_inv_id_assoc, β.hom_inv_id_app]
    

Proof state:
C : Type u_1
inst✝ : Category.{?u.623043, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
α : obj' F 0 ≅ obj' G 0
β : δ₀ F ≅ δ₀ G
w : map' F 0 1 ≫ app' β.hom 0 = α.hom ≫ map' G 0 1
⊢ map' F 0 1 ≫ 𝟙 ((δ₀ F).obj { val := 0, isLt := (_ : 0 < n + 1) }) = map' F 0 1

Next tactic:
dsimp
/-- Inductive construction of isomorphisms in `ComposableArrows C (n + 1)`: in order to
construct an isomorphism `F ≅ G`, it suffices to provide `α : F.obj' 0 ≅ G.obj' 0` and
`β : F.δ₀ ≅ G.δ₀` such that `F.map' 0 1 ≫ app' β.hom 0 = α.hom ≫ G.map' 0 1`. -/
@[simps]
def isoMkSucc {F G : ComposableArrows C (n + 1)} (α : F.obj' 0 ≅ G.obj' 0)
    (β : F.δ₀ ≅ G.δ₀) (w : F.map' 0 1 ≫ app' β.hom 0 = α.hom ≫ G.map' 0 1) : F ≅ G where
  hom := homMkSucc α.hom β.hom w
  inv := homMkSucc α.inv β.inv (by
    rw [← cancel_epi α.hom, ← reassoc_of% w, α.hom_inv_id_assoc, β.hom_inv_id_app]
    dsimp
    

Proof state:
C : Type u_1
inst✝ : Category.{?u.623043, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
α : obj' F 0 ≅ obj' G 0
β : δ₀ F ≅ δ₀ G
w : map' F 0 1 ≫ app' β.hom 0 = α.hom ≫ map' G 0 1
⊢ F.map (homOfLE (_ : { val := 0, isLt := (_ : 0 < n + 1 + 1) } ≤ { val := 1, isLt := (_ : 1 < n + 1 + 1) })) ≫
      𝟙 (F.obj 1) =
    F.map (homOfLE (_ : { val := 0, isLt := (_ : 0 < n + 1 + 1) } ≤ { val := 1, isLt := (_ : 1 < n + 1 + 1) }))

Next tactic:
rw [comp_id]
/-- Inductive construction of isomorphisms in `ComposableArrows C (n + 1)`: in order to
construct an isomorphism `F ≅ G`, it suffices to provide `α : F.obj' 0 ≅ G.obj' 0` and
`β : F.δ₀ ≅ G.δ₀` such that `F.map' 0 1 ≫ app' β.hom 0 = α.hom ≫ G.map' 0 1`. -/
@[simps]
def isoMkSucc {F G : ComposableArrows C (n + 1)} (α : F.obj' 0 ≅ G.obj' 0)
    (β : F.δ₀ ≅ G.δ₀) (w : F.map' 0 1 ≫ app' β.hom 0 = α.hom ≫ G.map' 0 1) : F ≅ G where
  hom := homMkSucc α.hom β.hom w
  inv := homMkSucc α.inv β.inv (by
    rw [← cancel_epi α.hom, ← reassoc_of% w, α.hom_inv_id_assoc, β.hom_inv_id_app]
    dsimp
    rw [comp_id])
  hom_inv_id := by
    

Proof state:
C : Type u_1
inst✝ : Category.{?u.623043, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
α : obj' F 0 ≅ obj' G 0
β : δ₀ F ≅ δ₀ G
w : map' F 0 1 ≫ app' β.hom 0 = α.hom ≫ map' G 0 1
⊢ homMkSucc α.hom β.hom w ≫ homMkSucc α.inv β.inv (_ : map' G 0 1 ≫ app' β.inv 0 = α.inv ≫ map' F 0 1) = 𝟙 F

Next tactic:
apply hom_ext_succ
/-- Inductive construction of isomorphisms in `ComposableArrows C (n + 1)`: in order to
construct an isomorphism `F ≅ G`, it suffices to provide `α : F.obj' 0 ≅ G.obj' 0` and
`β : F.δ₀ ≅ G.δ₀` such that `F.map' 0 1 ≫ app' β.hom 0 = α.hom ≫ G.map' 0 1`. -/
@[simps]
def isoMkSucc {F G : ComposableArrows C (n + 1)} (α : F.obj' 0 ≅ G.obj' 0)
    (β : F.δ₀ ≅ G.δ₀) (w : F.map' 0 1 ≫ app' β.hom 0 = α.hom ≫ G.map' 0 1) : F ≅ G where
  hom := homMkSucc α.hom β.hom w
  inv := homMkSucc α.inv β.inv (by
    rw [← cancel_epi α.hom, ← reassoc_of% w, α.hom_inv_id_assoc, β.hom_inv_id_app]
    dsimp
    rw [comp_id])
  hom_inv_id := by
    apply hom_ext_succ
    · 

Proof state:
case h₀
C : Type u_1
inst✝ : Category.{?u.623043, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
α : obj' F 0 ≅ obj' G 0
β : δ₀ F ≅ δ₀ G
w : map' F 0 1 ≫ app' β.hom 0 = α.hom ≫ map' G 0 1
⊢ app' (homMkSucc α.hom β.hom w ≫ homMkSucc α.inv β.inv (_ : map' G 0 1 ≫ app' β.inv 0 = α.inv ≫ map' F 0 1)) 0 =
    app' (𝟙 F) 0

Next tactic:
simp
/-- Inductive construction of isomorphisms in `ComposableArrows C (n + 1)`: in order to
construct an isomorphism `F ≅ G`, it suffices to provide `α : F.obj' 0 ≅ G.obj' 0` and
`β : F.δ₀ ≅ G.δ₀` such that `F.map' 0 1 ≫ app' β.hom 0 = α.hom ≫ G.map' 0 1`. -/
@[simps]
def isoMkSucc {F G : ComposableArrows C (n + 1)} (α : F.obj' 0 ≅ G.obj' 0)
    (β : F.δ₀ ≅ G.δ₀) (w : F.map' 0 1 ≫ app' β.hom 0 = α.hom ≫ G.map' 0 1) : F ≅ G where
  hom := homMkSucc α.hom β.hom w
  inv := homMkSucc α.inv β.inv (by
    rw [← cancel_epi α.hom, ← reassoc_of% w, α.hom_inv_id_assoc, β.hom_inv_id_app]
    dsimp
    rw [comp_id])
  hom_inv_id := by
    apply hom_ext_succ
    · simp
    · 

Proof state:
case h₁
C : Type u_1
inst✝ : Category.{?u.623043, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
α : obj' F 0 ≅ obj' G 0
β : δ₀ F ≅ δ₀ G
w : map' F 0 1 ≫ app' β.hom 0 = α.hom ≫ map' G 0 1
⊢ δ₀Functor.map (homMkSucc α.hom β.hom w ≫ homMkSucc α.inv β.inv (_ : map' G 0 1 ≫ app' β.inv 0 = α.inv ≫ map' F 0 1)) =
    δ₀Functor.map (𝟙 F)

Next tactic:
ext ⟨i, hi⟩
/-- Inductive construction of isomorphisms in `ComposableArrows C (n + 1)`: in order to
construct an isomorphism `F ≅ G`, it suffices to provide `α : F.obj' 0 ≅ G.obj' 0` and
`β : F.δ₀ ≅ G.δ₀` such that `F.map' 0 1 ≫ app' β.hom 0 = α.hom ≫ G.map' 0 1`. -/
@[simps]
def isoMkSucc {F G : ComposableArrows C (n + 1)} (α : F.obj' 0 ≅ G.obj' 0)
    (β : F.δ₀ ≅ G.δ₀) (w : F.map' 0 1 ≫ app' β.hom 0 = α.hom ≫ G.map' 0 1) : F ≅ G where
  hom := homMkSucc α.hom β.hom w
  inv := homMkSucc α.inv β.inv (by
    rw [← cancel_epi α.hom, ← reassoc_of% w, α.hom_inv_id_assoc, β.hom_inv_id_app]
    dsimp
    rw [comp_id])
  hom_inv_id := by
    apply hom_ext_succ
    · simp
    · ext ⟨i, hi⟩
      

Proof state:
case h₁.w.h.mk
C : Type u_1
inst✝ : Category.{?u.623043, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
α : obj' F 0 ≅ obj' G 0
β : δ₀ F ≅ δ₀ G
w : map' F 0 1 ≫ app' β.hom 0 = α.hom ≫ map' G 0 1
i : ℕ
hi : i < n + 1
⊢ (δ₀Functor.map
          (homMkSucc α.hom β.hom w ≫ homMkSucc α.inv β.inv (_ : map' G 0 1 ≫ app' β.inv 0 = α.inv ≫ map' F 0 1))).app
      { val := i, isLt := hi } =
    (δ₀Functor.map (𝟙 F)).app { val := i, isLt := hi }

Next tactic:
simp
/-- Inductive construction of isomorphisms in `ComposableArrows C (n + 1)`: in order to
construct an isomorphism `F ≅ G`, it suffices to provide `α : F.obj' 0 ≅ G.obj' 0` and
`β : F.δ₀ ≅ G.δ₀` such that `F.map' 0 1 ≫ app' β.hom 0 = α.hom ≫ G.map' 0 1`. -/
@[simps]
def isoMkSucc {F G : ComposableArrows C (n + 1)} (α : F.obj' 0 ≅ G.obj' 0)
    (β : F.δ₀ ≅ G.δ₀) (w : F.map' 0 1 ≫ app' β.hom 0 = α.hom ≫ G.map' 0 1) : F ≅ G where
  hom := homMkSucc α.hom β.hom w
  inv := homMkSucc α.inv β.inv (by
    rw [← cancel_epi α.hom, ← reassoc_of% w, α.hom_inv_id_assoc, β.hom_inv_id_app]
    dsimp
    rw [comp_id])
  hom_inv_id := by
    apply hom_ext_succ
    · simp
    · ext ⟨i, hi⟩
      simp
  inv_hom_id := by
    

Proof state:
C : Type u_1
inst✝ : Category.{?u.623043, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
α : obj' F 0 ≅ obj' G 0
β : δ₀ F ≅ δ₀ G
w : map' F 0 1 ≫ app' β.hom 0 = α.hom ≫ map' G 0 1
⊢ homMkSucc α.inv β.inv (_ : map' G 0 1 ≫ app' β.inv 0 = α.inv ≫ map' F 0 1) ≫ homMkSucc α.hom β.hom w = 𝟙 G

Next tactic:
apply hom_ext_succ
/-- Inductive construction of isomorphisms in `ComposableArrows C (n + 1)`: in order to
construct an isomorphism `F ≅ G`, it suffices to provide `α : F.obj' 0 ≅ G.obj' 0` and
`β : F.δ₀ ≅ G.δ₀` such that `F.map' 0 1 ≫ app' β.hom 0 = α.hom ≫ G.map' 0 1`. -/
@[simps]
def isoMkSucc {F G : ComposableArrows C (n + 1)} (α : F.obj' 0 ≅ G.obj' 0)
    (β : F.δ₀ ≅ G.δ₀) (w : F.map' 0 1 ≫ app' β.hom 0 = α.hom ≫ G.map' 0 1) : F ≅ G where
  hom := homMkSucc α.hom β.hom w
  inv := homMkSucc α.inv β.inv (by
    rw [← cancel_epi α.hom, ← reassoc_of% w, α.hom_inv_id_assoc, β.hom_inv_id_app]
    dsimp
    rw [comp_id])
  hom_inv_id := by
    apply hom_ext_succ
    · simp
    · ext ⟨i, hi⟩
      simp
  inv_hom_id := by
    apply hom_ext_succ
    · 

Proof state:
case h₀
C : Type u_1
inst✝ : Category.{?u.623043, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
α : obj' F 0 ≅ obj' G 0
β : δ₀ F ≅ δ₀ G
w : map' F 0 1 ≫ app' β.hom 0 = α.hom ≫ map' G 0 1
⊢ app' (homMkSucc α.inv β.inv (_ : map' G 0 1 ≫ app' β.inv 0 = α.inv ≫ map' F 0 1) ≫ homMkSucc α.hom β.hom w) 0 =
    app' (𝟙 G) 0

Next tactic:
simp
/-- Inductive construction of isomorphisms in `ComposableArrows C (n + 1)`: in order to
construct an isomorphism `F ≅ G`, it suffices to provide `α : F.obj' 0 ≅ G.obj' 0` and
`β : F.δ₀ ≅ G.δ₀` such that `F.map' 0 1 ≫ app' β.hom 0 = α.hom ≫ G.map' 0 1`. -/
@[simps]
def isoMkSucc {F G : ComposableArrows C (n + 1)} (α : F.obj' 0 ≅ G.obj' 0)
    (β : F.δ₀ ≅ G.δ₀) (w : F.map' 0 1 ≫ app' β.hom 0 = α.hom ≫ G.map' 0 1) : F ≅ G where
  hom := homMkSucc α.hom β.hom w
  inv := homMkSucc α.inv β.inv (by
    rw [← cancel_epi α.hom, ← reassoc_of% w, α.hom_inv_id_assoc, β.hom_inv_id_app]
    dsimp
    rw [comp_id])
  hom_inv_id := by
    apply hom_ext_succ
    · simp
    · ext ⟨i, hi⟩
      simp
  inv_hom_id := by
    apply hom_ext_succ
    · simp
    · 

Proof state:
case h₁
C : Type u_1
inst✝ : Category.{?u.623043, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
α : obj' F 0 ≅ obj' G 0
β : δ₀ F ≅ δ₀ G
w : map' F 0 1 ≫ app' β.hom 0 = α.hom ≫ map' G 0 1
⊢ δ₀Functor.map (homMkSucc α.inv β.inv (_ : map' G 0 1 ≫ app' β.inv 0 = α.inv ≫ map' F 0 1) ≫ homMkSucc α.hom β.hom w) =
    δ₀Functor.map (𝟙 G)

Next tactic:
ext ⟨i, hi⟩
/-- Inductive construction of isomorphisms in `ComposableArrows C (n + 1)`: in order to
construct an isomorphism `F ≅ G`, it suffices to provide `α : F.obj' 0 ≅ G.obj' 0` and
`β : F.δ₀ ≅ G.δ₀` such that `F.map' 0 1 ≫ app' β.hom 0 = α.hom ≫ G.map' 0 1`. -/
@[simps]
def isoMkSucc {F G : ComposableArrows C (n + 1)} (α : F.obj' 0 ≅ G.obj' 0)
    (β : F.δ₀ ≅ G.δ₀) (w : F.map' 0 1 ≫ app' β.hom 0 = α.hom ≫ G.map' 0 1) : F ≅ G where
  hom := homMkSucc α.hom β.hom w
  inv := homMkSucc α.inv β.inv (by
    rw [← cancel_epi α.hom, ← reassoc_of% w, α.hom_inv_id_assoc, β.hom_inv_id_app]
    dsimp
    rw [comp_id])
  hom_inv_id := by
    apply hom_ext_succ
    · simp
    · ext ⟨i, hi⟩
      simp
  inv_hom_id := by
    apply hom_ext_succ
    · simp
    · ext ⟨i, hi⟩
      

Proof state:
case h₁.w.h.mk
C : Type u_1
inst✝ : Category.{?u.623043, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
α : obj' F 0 ≅ obj' G 0
β : δ₀ F ≅ δ₀ G
w : map' F 0 1 ≫ app' β.hom 0 = α.hom ≫ map' G 0 1
i : ℕ
hi : i < n + 1
⊢ (δ₀Functor.map
          (homMkSucc α.inv β.inv (_ : map' G 0 1 ≫ app' β.inv 0 = α.inv ≫ map' F 0 1) ≫ homMkSucc α.hom β.hom w)).app
      { val := i, isLt := hi } =
    (δ₀Functor.map (𝟙 G)).app { val := i, isLt := hi }

Next tactic:
simp
lemma ext_succ {F G : ComposableArrows C (n + 1)} (h₀ : F.obj' 0 = G.obj' 0)
    (h : F.δ₀ = G.δ₀) (w : F.map' 0 1 = eqToHom h₀ ≫ G.map' 0 1 ≫
      eqToHom (Functor.congr_obj h.symm 0)): F = G := by
  

Proof state:
C : Type u_1
inst✝ : Category.{u_2, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
h₀ : obj' F 0 = obj' G 0
h : δ₀ F = δ₀ G
w : map' F 0 1 = eqToHom h₀ ≫ map' G 0 1 ≫ eqToHom (_ : (δ₀ G).obj 0 = (δ₀ F).obj 0)
⊢ F = G

Next tactic:
have : ∀ i, F.obj i = G.obj i := by
    intro ⟨i, hi⟩
    cases' i with i
    · exact h₀
    · rw [Nat.succ_eq_add_one] at hi
      exact Functor.congr_obj h ⟨i, by linarith⟩
lemma ext_succ {F G : ComposableArrows C (n + 1)} (h₀ : F.obj' 0 = G.obj' 0)
    (h : F.δ₀ = G.δ₀) (w : F.map' 0 1 = eqToHom h₀ ≫ G.map' 0 1 ≫
      eqToHom (Functor.congr_obj h.symm 0)): F = G := by
  have : ∀ i, F.obj i = G.obj i := by
    

Proof state:
C : Type u_1
inst✝ : Category.{u_2, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
h₀ : obj' F 0 = obj' G 0
h : δ₀ F = δ₀ G
w : map' F 0 1 = eqToHom h₀ ≫ map' G 0 1 ≫ eqToHom (_ : (δ₀ G).obj 0 = (δ₀ F).obj 0)
⊢ ∀ (i : Fin (n + 1 + 1)), F.obj i = G.obj i

Next tactic:
intro ⟨i, hi⟩
lemma ext_succ {F G : ComposableArrows C (n + 1)} (h₀ : F.obj' 0 = G.obj' 0)
    (h : F.δ₀ = G.δ₀) (w : F.map' 0 1 = eqToHom h₀ ≫ G.map' 0 1 ≫
      eqToHom (Functor.congr_obj h.symm 0)): F = G := by
  have : ∀ i, F.obj i = G.obj i := by
    intro ⟨i, hi⟩
    

Proof state:
C : Type u_1
inst✝ : Category.{u_2, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
h₀ : obj' F 0 = obj' G 0
h : δ₀ F = δ₀ G
w : map' F 0 1 = eqToHom h₀ ≫ map' G 0 1 ≫ eqToHom (_ : (δ₀ G).obj 0 = (δ₀ F).obj 0)
i : ℕ
hi : i < n + 1 + 1
⊢ F.obj { val := i, isLt := hi } = G.obj { val := i, isLt := hi }

Next tactic:
cases' i with i
lemma ext_succ {F G : ComposableArrows C (n + 1)} (h₀ : F.obj' 0 = G.obj' 0)
    (h : F.δ₀ = G.δ₀) (w : F.map' 0 1 = eqToHom h₀ ≫ G.map' 0 1 ≫
      eqToHom (Functor.congr_obj h.symm 0)): F = G := by
  have : ∀ i, F.obj i = G.obj i := by
    intro ⟨i, hi⟩
    cases' i with i
    · 

Proof state:
case zero
C : Type u_1
inst✝ : Category.{u_2, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
h₀ : obj' F 0 = obj' G 0
h : δ₀ F = δ₀ G
w : map' F 0 1 = eqToHom h₀ ≫ map' G 0 1 ≫ eqToHom (_ : (δ₀ G).obj 0 = (δ₀ F).obj 0)
hi : Nat.zero < n + 1 + 1
⊢ F.obj { val := Nat.zero, isLt := hi } = G.obj { val := Nat.zero, isLt := hi }

Next tactic:
exact h₀
lemma ext_succ {F G : ComposableArrows C (n + 1)} (h₀ : F.obj' 0 = G.obj' 0)
    (h : F.δ₀ = G.δ₀) (w : F.map' 0 1 = eqToHom h₀ ≫ G.map' 0 1 ≫
      eqToHom (Functor.congr_obj h.symm 0)): F = G := by
  have : ∀ i, F.obj i = G.obj i := by
    intro ⟨i, hi⟩
    cases' i with i
    · exact h₀
    · 

Proof state:
case succ
C : Type u_1
inst✝ : Category.{u_2, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
h₀ : obj' F 0 = obj' G 0
h : δ₀ F = δ₀ G
w : map' F 0 1 = eqToHom h₀ ≫ map' G 0 1 ≫ eqToHom (_ : (δ₀ G).obj 0 = (δ₀ F).obj 0)
i : ℕ
hi : Nat.succ i < n + 1 + 1
⊢ F.obj { val := Nat.succ i, isLt := hi } = G.obj { val := Nat.succ i, isLt := hi }

Next tactic:
rw [Nat.succ_eq_add_one] at hi
lemma ext_succ {F G : ComposableArrows C (n + 1)} (h₀ : F.obj' 0 = G.obj' 0)
    (h : F.δ₀ = G.δ₀) (w : F.map' 0 1 = eqToHom h₀ ≫ G.map' 0 1 ≫
      eqToHom (Functor.congr_obj h.symm 0)): F = G := by
  have : ∀ i, F.obj i = G.obj i := by
    intro ⟨i, hi⟩
    cases' i with i
    · exact h₀
    · rw [Nat.succ_eq_add_one] at hi
      

Proof state:
case succ
C : Type u_1
inst✝ : Category.{u_2, u_1} C
n m : ℕ
F✝ G✝ : ComposableArrows C n
F G : ComposableArrows C (n + 1)
h₀ : obj' F 0 = obj' G 0
h : δ₀ F = δ₀ G
w : map' F 0 1 = eqToHom h₀ ≫ map' G 0 1 ≫ eqToHom (_ : (δ₀ G).obj 0 = (δ₀ F).obj 0)
i : ℕ
hi✝ : Nat.succ i < n + 1 + 1
hi : i + 1 < n + 1 + 1
⊢ F.obj { val := Nat.succ i, isLt := hi✝ } = G.obj { val := Nat.succ i, isLt := hi✝ }

Next tactic:
exact Functor.congr_obj h ⟨i, by linarith⟩