(** ** Properties of [take] *)

(* Specifications: *)
Lemma take_O : forall {A} {n} le (v:t A n), take 0 le v = [].
Lemma take_idem : forall {A} p n (v:t A n) le le',
take p le' (take p le v) = take p le v.
Lemma take_app : forall {A} {n} (v:t A n) {m} (w:t A m) le, take n le (append v w) = v.
(* Proof is irrelevant for [take] *)
Lemma take_prf_irr : forall {A} p {n} (v:t A n) le le', take p le v = take p le' v.
(** ** Properties of [uncons] and [splitat] *)
Lemma uncons_cons {A} : forall {n : nat} (a : A) (v : t A n),
uncons (a::v) = (a,v).
Lemma append_splitat {A} : forall {n m : nat} (v : t A n) (w : t A m) (vw : t A (n+m)),
splitat n vw = (v, w) -> vw = v ++ w.
Lemma append_inj {A} : forall {n m : nat} (v v' : t A n) (w w' : t A m),
v ++ w = v' ++ w' -> v = v' /\ w = w'.