(* 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_keep_others : forall (l : list A) (i p : nat) (x : A), (************************) i < length l -> p < length l -> i <> p -> elemlist A (replace l p x) i = elemlist A l i.