Proof using.
intros a l1 l2 H; case permutation_cons_ex with (1 := H).
intros l3 (l4, (Hl1, Hl2)).
apply permutation_trans with (1 := Hl2).
generalize Hl1; case l3; simpl in |- *; auto.
intros H1; injection H1; intros H2; rewrite H2; auto.
intros a0 l5 H1; injection H1; intros H2 H3; rewrite H2; rewrite H3; auto.
apply permutation_trans with (a0 :: l4 ++ l5); auto.
apply permutation_skip; apply permutation_app_swap.
apply (permutation_app_swap (a0 :: l4) l5).
Qed.
(* Take a list and return tle list of all pairs of an element of the list and the remaining list *)
Fixpoint split_one (l : list A) : list (A * list A) :=
match l with
| nil => nil
| a :: l1 =>
(a, l1) :: map (fun p : A * list A => (fst p, a :: snd p)) (split_one l1)
end.

(* Specifications: *)
(* The pairs of the list are a permutation *)
Theorem split_one_permutation :
forall (a : A) (l1 l2 : list A),
In (a, l1) (split_one l2) -> permutation (a :: l1) l2.