Global Set Automatic Coercions Import.
Set Implicit Arguments.
Unset Standard Proposition Elimination Names.
(* Intended for use without Import. *)
Require Vector.
Require List.
Arguments Vector.cons [A] _ [n].
Arguments Vector.nil [A].
(* eliminators/inversion *)
Definition head A n (v: Vector.t A (S n)): A :=
match v with
| Vector.nil => I | Vector.cons h _ _ => h
end.
Definition tail n A (v: Vector.t A (S n)): Vector.t A n :=
match v with
| Vector.nil => I | Vector.cons _ _ t => t
end.

(* Specifications: *)
Lemma eq_nil A (v: Vector.t A 0): v = Vector.nil.
Lemma eq_cons A n (v: Vector.t A (S n)): v = Vector.cons (head v) (tail v).
Lemma Vcons_eq A (h h': A) n (t t': Vector.t A n): h = h' -> t = t' -> Vector.cons h t = Vector.cons h' t'.
Fixpoint to_list X (n: nat) (v: Vector.t X n) {struct v}: List.list X :=
match v with
| Vector.nil => List.nil | Vector.cons x _ v' => List.cons x (to_list v')
end.