(* Compute the number of occurrences of an element in a message *)
Fixpoint number_of_occurrences (a : A) (l : list A) {struct l} : nat :=
  match l with
  | nil => 0
  | b :: l1 =>
      match eqA_dec a b with
      | left _ => S (number_of_occurrences a l1)
      | right _ => number_of_occurrences a l1
      end
  end.

Theorem number_of_occurrences_permutation_ex : forall (m : list A) (a : A), exists m1 : list A, permutation m (id_list a (number_of_occurrences a m) ++ m1) /\ ~ In a m1.