Fixpoint take A n: forall m, Vector.t A (n + m) -> Vector.t A n :=
  match n return forall m, Vector.t A (n + m) -> Vector.t A n with
  | 0 => fun _ _ => Vector.nil
  | S n' => fun m v => Vector.cons (head v) (take n' m (tail v))
  end.Fixpoint drop A n: forall m, Vector.t A (n + m) -> Vector.t A m :=
  match n return forall m, Vector.t A (n + m) -> Vector.t A m with
  | 0 => fun m v => v
  | S n' => fun m v => drop n' m (tail v)
  end.

(* Specifications: *)
Lemma split A n m (v: Vector.t A (n + m)): v = app (take n m v) (drop n m v).
Lemma eq_app_inv A n m (a b: Vector.t A n) (c d: Vector.t A m): app a c = app b d -> a = b /\ c = d.