Fixpoint get {n : nat} (f : fin n) : vector n -> T :=
    match f in fin n return vector n -> T with
      | F0 n => @vector_hd _
      | FS n f => fun v => get f (vector_tl v)
    end.Fixpoint put {n : nat} (f : fin n) (t : T) : vector n -> vector n :=
    match f in fin n return vector n -> vector n with
      | F0 _ => fun v => Vcons t (vector_tl v)
      | FS _ f => fun v => Vcons (vector_hd v) (put f t (vector_tl v))
    end.

(* Specifications: *)
Theorem get_put_eq : forall {n} (v : vector n) (f : fin n) val, get f (put f val v) = val.
Theorem get_put_neq : forall {n} (v : vector n) (f f' : fin n) val, f <> f' -> get f (put f' val v) = get f v.