(* lorsque l'egalite est decidable, on peut compter le nombre d'occurence d'un element dans la liste *)
Fixpoint card (d : data) (q : queue) {struct q} : Z :=
match q with
| empty => 0%Z
| input d' q' =>
if eq_data_dec d d'
then (card d q' + 1)%Z
else card d q'
end.

(* Specifications: *)
Lemma card_pos : forall (d : data) (q : queue), (card d q >= 0)%Z.
Lemma card_strct_pos :
forall (d : data) (q : queue), In_queue d q -> (card d q > 0)%Z.
Lemma card_null :
forall (d : data) (q : queue), ~ In_queue d q -> card d q = 0%Z.