Set Implicit Arguments.
Set Strict Implicit.
Set Asymmetric Patterns.
Section parametric.
Variable T : Type.
Inductive vector : nat -> Type :=
| Vnil : vector 0
| Vcons : forall {n}, T -> vector n -> vector (S n).
Definition vector_hd n (v : vector (S n)) : T :=
match v in vector n' return match n' with
| 0 => unit
| S _ => T
end with
| Vnil => tt
| Vcons _ x _ => x
end.
Definition vector_tl n (v : vector (S n)) : vector n :=
match v in vector n' return match n' with
| 0 => unit
| S n => vector n
end with
| Vnil => tt
| Vcons _ _ x => x
end.

(* Specifications: *)
Theorem vector_eta : forall n (v : vector n),
v = match n as n return vector n -> vector n with
| 0 => fun _ => Vnil
| S n => fun v => Vcons (vector_hd v) (vector_tl v)
end v.