Fixpoint nth_error (l:list A) (n:nat) {struct n} : option A :=
match n, l with
| O, x :: _ => Some x
| S n, _ :: l' => nth_error l' n
| _, _ => None
end.
Definition nth_default (default:A) (l:list A) (n:nat) : A :=
match nth_error l n with
| Some x => x
| None => default
end.

(* Specifications: *)
Lemma nth_default_eq :
forall n l (d:A), nth_default d l n = nth n l d.