induction ls1; intuition; simpl in *.
intuition.
subst.
econstructor.
eapply in_flatten in H.
destruct H.
intuition.
eapply in_map_iff in H0.
destruct H0.
intuition.
subst.
eapply addInAllLocations_perm in H1.
eapply perm_trans.
2:{
eapply Permutation_sym.
eauto.
}
eapply perm_skip.
eapply IHls1.
trivial.
Qed.
Section ShuffleList.
Variable A : Set.
Hypothesis A_EqDec : EqDec A.
Definition shuffle(ls : list A) :=
o <-$ rndListElem _ (getAllPermutations ls);
ret
match o with
| None => nil
| Some x => x
end.

(* Specifications: *)
Theorem shuffle_perm :
forall (ls1 ls2 : list A),
In ls2 (getSupport (shuffle ls1)) ->
Permutation ls2 ls1.