(* Copyright 2012-2015 by Adam Petcher.				* * Use of this source code is governed by the license described	* * in the LICENSE file at the root of the source tree.		*)
Set Implicit Arguments.
Local Open Scope list_scope.
induction ls; intuition; simpl in *.
intuition; subst.
destruct (EqDec_dec eqd a0 a0); intuition.
destruct (EqDec_dec eqd a0 a); subst.
trivial.
simpl.
rewrite IHls.
destruct ls; simpl in *; intuition.
trivial.
Qed.
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.
induction l; intuition; unfold addInAllLocations in *; simpl in *.
inversion H.
inversion H.
Qed.

Theorem getAllPermutations_not_nil :
forall (A : Type)(ls : list A),
getAllPermutations ls = nil -> False.