/-- The fifth simplicial identity -/
@[reassoc]
theorem σ_comp_σ {n} {i j : Fin (n + 1)} (H : i ≤ j) :
    σ (Fin.castSucc i) ≫ σ j = σ j.succ ≫ σ i := by
  ext ⟨k, hk⟩
  rcases i with ⟨i, hi⟩
  rcases j with ⟨j, hj⟩
  simp? at H hk says simp only [Fin.mk_le_mk, len_mk] at H hk
  dsimp [σ, Fin.predAbove]
  

Proof state:
case a.h.h.mk.h.mk.mk
n k : ℕ
hk : k < n + 1 + 1 + 1
i : ℕ
hi : i < n + 1
j : ℕ
hj : j < n + 1
H : i ≤ j
⊢ ↑(if h :
          { val := j, isLt := (_ : j < Nat.succ (n + 1)) } <
            if h : { val := i, isLt := (_ : i < Nat.succ (n + 1 + 1)) } < { val := k, isLt := hk } then
              Fin.pred { val := k, isLt := hk } (_ : { val := k, isLt := hk } ≠ 0)
            else { val := k, isLt := (_ : ↑{ val := k, isLt := hk } < n + 1 + 1) } then
        Fin.pred
          (if h : { val := i, isLt := (_ : i < Nat.succ (n + 1 + 1)) } < { val := k, isLt := hk } then
            Fin.pred { val := k, isLt := hk } (_ : { val := k, isLt := hk } ≠ 0)
          else { val := k, isLt := (_ : ↑{ val := k, isLt := hk } < n + 1 + 1) })
          (_ :
            (if h : { val := i, isLt := (_ : i < Nat.succ (n + 1 + 1)) } < { val := k, isLt := hk } then
                Fin.pred { val := k, isLt := hk } (_ : { val := k, isLt := hk } ≠ 0)
              else { val := k, isLt := (_ : ↑{ val := k, isLt := hk } < n + 1 + 1) }) ≠
              0)
      else
        Fin.castLT
          (if h : { val := i, isLt := (_ : i < Nat.succ (n + 1 + 1)) } < { val := k, isLt := hk } then
            Fin.pred { val := k, isLt := hk } (_ : { val := k, isLt := hk } ≠ 0)
          else { val := k, isLt := (_ : ↑{ val := k, isLt := hk } < n + 1 + 1) })
          (_ :
            ↑(if h : { val := i, isLt := (_ : i < Nat.succ (n + 1 + 1)) } < { val := k, isLt := hk } then
                  Fin.pred { val := k, isLt := hk } (_ : { val := k, isLt := hk } ≠ 0)
                else { val := k, isLt := (_ : ↑{ val := k, isLt := hk } < n + 1 + 1) }) <
              n + 1)) =
    ↑(if h :
          { val := i, isLt := (_ : i < Nat.succ (n + 1)) } <
            if h : { val := j + 1, isLt := (_ : j + 1 < Nat.succ (n + 1 + 1)) } < { val := k, isLt := hk } then
              Fin.pred { val := k, isLt := hk } (_ : { val := k, isLt := hk } ≠ 0)
            else { val := k, isLt := (_ : ↑{ val := k, isLt := hk } < n + 1 + 1) } then
        Fin.pred
          (if h : { val := j + 1, isLt := (_ : j + 1 < Nat.succ (n + 1 + 1)) } < { val := k, isLt := hk } then
            Fin.pred { val := k, isLt := hk } (_ : { val := k, isLt := hk } ≠ 0)
          else { val := k, isLt := (_ : ↑{ val := k, isLt := hk } < n + 1 + 1) })
          (_ :
            (if h : { val := j + 1, isLt := (_ : j + 1 < Nat.succ (n + 1 + 1)) } < { val := k, isLt := hk } then
                Fin.pred { val := k, isLt := hk } (_ : { val := k, isLt := hk } ≠ 0)
              else { val := k, isLt := (_ : ↑{ val := k, isLt := hk } < n + 1 + 1) }) ≠
              0)
      else
        Fin.castLT
          (if h : { val := j + 1, isLt := (_ : j + 1 < Nat.succ (n + 1 + 1)) } < { val := k, isLt := hk } then
            Fin.pred { val := k, isLt := hk } (_ : { val := k, isLt := hk } ≠ 0)
          else { val := k, isLt := (_ : ↑{ val := k, isLt := hk } < n + 1 + 1) })
          (_ :
            ↑(if h : { val := j + 1, isLt := (_ : j + 1 < Nat.succ (n + 1 + 1)) } < { val := k, isLt := hk } then
                  Fin.pred { val := k, isLt := hk } (_ : { val := k, isLt := hk } ≠ 0)
                else { val := k, isLt := (_ : ↑{ val := k, isLt := hk } < n + 1 + 1) }) <
              n + 1))

Next tactic:
simp only [Fin.lt_iff_val_lt_val, Fin.ite_val, Fin.coe_pred, ge_iff_le, dite_eq_ite,
    Fin.coe_castLT]