End Permutation_alt.
#[global]
Instance Permutation_list_sum : Proper (@Permutation nat ==> eq) list_sum | 10.
#[global]
Instance Permutation_list_max : Proper (@Permutation nat ==> eq) list_max | 10.
Section Permutation_transp.
Variable A:Type.
(** Permutation definition based on transpositions for induction with fixed length *)
Inductive Permutation_transp : list A -> list A -> Prop :=
| perm_t_refl : forall l, Permutation_transp l l
| perm_t_swap : forall x y l1 l2, Permutation_transp (l1 ++ y :: x :: l2) (l1 ++ x :: y :: l2)
| perm_t_trans l l' l'' :
Permutation_transp l l' -> Permutation_transp l' l'' -> Permutation_transp l l''.
Instance Permutation_transp_sym : Symmetric Permutation_transp.
Global Instance Permutation_transp_equiv : Equivalence Permutation_transp | 100.

(* Specifications: *)
Lemma Permutation_transp_cons : forall (x : A) l1 l2,
Permutation_transp l1 l2 -> Permutation_transp (x :: l1) (x :: l2).
Lemma Permutation_Permutation_transp : forall l1 l2 : list A,
Permutation l1 l2 <-> Permutation_transp l1 l2.
Lemma Permutation_ind_transp : forall P : list A -> list A -> Prop,
(forall l, P l l) ->
(forall x y l1 l2, P (l1 ++ y :: x :: l2) (l1 ++ x :: y :: l2)) ->
(forall l l' l'',
Permutation l l' -> P l l' -> Permutation l' l'' -> P l' l'' -> P l l'') ->
forall l1 l2, Permutation l1 l2 -> P l1 l2.