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.

Lemma firstout_pred_card : forall (d : data) (q : queue data), first data q = value data d -> card data eq_data_dec d (first_out data q) = (card data eq_data_dec d q - 1)%Z.