intuition.
unfold rndListElem in *.
case_eq (length lsa); intuition.
erewrite <- list_pred_length_eq; eauto.
rewrite H0.
eapply comp_spec_ret; intuition.
erewrite <- list_pred_length_eq; eauto.
rewrite H0.
comp_skip.
apply None.
apply None.
eapply comp_spec_ret; intuition.
case_eq (nth_option lsa b); intuition.
edestruct list_pred_nth_exists; eauto.
exfalso.
eapply nth_option_not_None; eauto.
apply RndNat_support_lt in H1.
omega.
Qed.

(* Specifications: *)
Theorem shuffle_RndPerm_spec :
forall (A : Set)(eqd : EqDec A)(ls : list A),
comp_spec (fun a b => a = permute ls b)
(shuffle eqd ls)
(shuffle _ (allNatsLt (length ls))).