induction n1; intuition; simpl in *.
rewrite shiftOut_0 in H0.
discriminate.
destruct H0.
destruct H.
intuition.
rewrite shiftOut_0 in H0.
inversion H0; clear H0; subst.
trivial.
destruct s; simpl in *.
trivial.
case_eq (shiftOut s n1); intuition.
rewrite H in H0.
destruct p.
discriminate.
rewrite H in H0.
erewrite IHn1.
trivial.
intuition.
destruct H0.
destruct H.
intuition.
destruct s; simpl in *.
discriminate.
case_eq (shiftOut s n1); intuition.
rewrite H in H0.
destruct p.
inversion H0; clear H0; subst.
erewrite IHn1.
trivial.
right.
econstructor.
econstructor.
intuition.
eauto.
trivial.
rewrite H in H0.
discriminate.
Qed.

(* Specifications: *)
Theorem Rnd_split_equiv :
forall n1 n2 z ,
evalDist
(x <-$ {0, 1}^(n1 + n2);
ret (splitVector n1 n2 x)) z ==
evalDist
(x1 <-$ {0, 1}^n1;
x2 <-$ {0, 1}^n2;
ret (x1, x2)) z.
Theorem Rnd_split_equiv :
forall n1 n2 z ,
evalDist
(x <-$ {0, 1}^(n1 + n2);
ret (splitVector n1 n2 x)) z ==
evalDist
(x1 <-$ {0, 1}^n1;
x2 <-$ {0, 1}^n2;
ret (x1, x2)) z.