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.