induction k generalizing n f i a
m : Type u → Type v
inst✝ : Monad m
α : Type u
n : Nat
f : Fin (n + 1) → α → m α
i : Nat
a : α
k : Nat
h : i + (k + 1) = n + 1
⊢ loop f i a (k + 1) h = do
    let b ← f { val := i, isLt := (_ : i < n + 1) } a
    loop (f ∘ succ) i b k (_ : i + k = n)
case zero
m : Type u → Type v
inst✝ : Monad m
α : Type u
n : Nat
f : Fin (n + 1) → α → m α
i : Nat
a : α
h : i + (Nat.zero + 1) = n + 1
⊢ loop f i a (Nat.zero + 1) h = do
    let b ← f { val := i, isLt := (_ : i < n + 1) } a
    loop (f ∘ succ) i b Nat.zero (_ : i + Nat.zero = n)

case succ
m : Type u → Type v
inst✝ : Monad m
α : Type u
n✝ : Nat
n_ih✝ :
  ∀ {n : Nat} {f : Fin (n + 1) → α → m α} {i : Nat} {a : α} {h : i + (n✝ + 1) = n + 1},
    loop f i a (n✝ + 1) h = do
      let b ← f { val := i, isLt := (_ : i < n + 1) } a
      loop (f ∘ succ) i b n✝ (_ : i + n✝ = n)
n : Nat
f : Fin (n + 1) → α → m α
i : Nat
a : α
h : i + (Nat.succ n✝ + 1) = n + 1
⊢ loop f i a (Nat.succ n✝ + 1) h = do
    let b ← f { val := i, isLt := (_ : i < n + 1) } a
    loop (f ∘ succ) i b (Nat.succ n✝) (_ : i + Nat.succ n✝ = n)