Fixpoint splitVector(A : Set)(n m : nat) : Vector.t A (n + m) -> (Vector.t A n * Vector.t A m) :=
  match n with
          | 0 =>
            fun (v : Vector.t A (O + m)) => (@Vector.nil A, v)
          | S n' =>
            fun (v : Vector.t A (S n' + m)) =>
              let (v1, v2) := splitVector _ _ (Vector.tl v) in
                (Vector.cons _ (Vector.hd v) _ v1, v2)
    end.

Theorem shiftOut_plus : forall (n1 n2 : nat) s b s', shiftOut s (n1 + n2) = Some (b, s') -> exists b1 b2 s'', shiftOut s n1 = Some (b1, s'') /\ shiftOut s'' n2 = Some (b2, s') /\ splitVector n1 n2 b = (b1, b2).