(** * Permutations modulo p. *)
Fixpoint permmod (p : nat) (l1 : Zlist) {struct l1} :
Zlist -> Prop :=
fun l2 : Zlist =>
match l1 with
| Nil => l2 = Nil Z
| Cons x t =>
exists y : Z, inlist Z y l2 /\ Mod x y p /\ permmod p t (zdrop y l2)
end.

Lemma allex_permmod :
forall (p : nat) (l0 l1 : Zlist),
length Z l0 = length Z l1 ->
(forall x0 : Z,
inlist Z x0 l0 ->
exists x1 : Z,
inlist Z x1 l1 /\ Mod x0 x1 p /\ permmod p (zdrop x0 l0) (zdrop x1 l1)) ->
permmod p l0 l1.