Module Fin.
Inductive t : nat -> Set :=
| FZ (n : nat) : t (S n)
| FS (n : nat) (i : t n) : t (S n).
#[global] Arguments FZ {n}%nat.
#[global] Arguments FS {n}%nat (i).
Definition evalFin {n : nat} (i : Fin.t n) : nat :=
proj1_sig (runFin i).
Fixpoint incrFin {m : nat} (n : nat) (i : Fin.t m) {struct n} : Fin.t (n + m) :=
match n as x return Fin.t (x + m) with
| O => i
| S n' => FS (incrFin n' i)
end.

Lemma incrFin_spec {m : nat} (n : nat) (i : Fin.t m)
: evalFin (incrFin n i) = n + evalFin i.