Section Lists_field.
Variable A : Set.
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.
(****************************************************************)
(* lemmes sur trunc *)
(*****************)
simple induction v. simpl in |- *. auto with arith.
intros b b0 H. simple induction i. simpl in |- *. trivial with arith.
simpl in |- *. intros. apply eq_S. apply H. apply le_S_n. exact H1.
Qed.

Lemma trunc_inv :
forall (v : list A) (i : nat) (b : A),
b :: trunc v i = trunc (b :: v) (S i).