Fixpoint addInAllLocations(A : Type)(a : A)(ls : list A) :=
  match ls with
    | nil =>  (a :: nil) :: nil
    | a' :: ls' => 
      (a :: ls) :: map (fun x => a' :: x) (addInAllLocations a ls')
  end.Fixpoint getAllPermutations(A : Type)(ls : list A) :=
  match ls with
    | nil => nil :: nil
    | a :: ls' =>
      let perms' := getAllPermutations ls' in
        flatten (map (addInAllLocations a) perms')
  end.

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