Section Lists_replace.
Variable A : Set.
(* Remplace l'element de l a la position par new *)
Fixpoint replace (l : list A) : nat -> A -> list A :=
fun (position : nat) (new : A) =>
match l return (list A) with
| nil =>
(* nil *)  nil | x :: l' => (* (cons x l') *)
match position return (list A) with
| O =>
(* O *)  new :: l' (* (S n') *)
| S n' => x :: replace l' n' new
end
end.

Lemma replace_ok :
forall (l : list A) (i : nat) (x : A),
i < length l -> elemlist A (replace l i x) i = x :: nil.