Fixpoint trunc (v : list A) : nat -> list A :=
  fun n : nat =>
  match v return (list A) with
  | nil => nil
  | b :: w =>
      match n return (list A) with
      | O => nil
      | S p => b :: trunc w p
      end
  end.Definition strip (v : list A) (n : nat) :=
  rev A (trunc (rev A v) (length v - n)).(* Selection d'une sous liste commencant a la position start, de
   longueur lengt *)
Definition sublist (v : list A) (start lengt : nat) :=
  trunc (strip v start) lengt.(* Selection de la liste contenant le i-eme element d'une liste *)
Definition elemlist (v : list A) (i : nat) := trunc (strip v i) 1.

Lemma trunc_app : forall (v1 v2 : list A) (i : nat), (**************) trunc (v1 ++ v2) i = trunc v1 i ++ trunc v2 (i - length v1).