Section Permutations.
Variable A : Type.
Inductive perm (s1 s2 : seq A) : Prop :=
| permutation_nil of s1 = [::] & s2 = [::]
| permutation_skip x t1 t2 of s1 = x :: t1 & s2 = x :: t2 & perm t1 t2
| permutation_swap x y t of s1 = x :: y :: t & s2 = y :: x :: t
| permutation_trans t of perm s1 t & perm t s2.
Hint Resolve perm_refl : core.
Hint Resolve perm_catC : core.

(* a somewhat generalized induction principle *)
Lemma perm_ind2 (P : seq A -> seq A -> Prop) :
P [::] [::] ->
(forall x s1 s2, perm s1 s2 -> P s1 s2 ->
P (x :: s1) (x :: s2)) ->
(forall x y s1 s2, perm s1 s2 -> P s1 s2 ->
P (y :: x :: s1) (x :: y :: s2)) ->
(forall s2 s1 s3, perm s1 s2 -> P s1 s2 ->
perm s2 s3 -> P s2 s3 -> P s1 s3) ->
forall s1 s2, perm s1 s2 -> P s1 s2.