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