Fixpoint reduce (q : queue E) : Z :=
  match q with
  | empty => 0%Z
  | input d q' => (reduce q' + f d)%Z
  end.

Lemma reduce_append_nil2 : forall (q1 : queue E) (d : E), reduce (append E q1 (input E d (empty E))) = (reduce q1 + f d)%Z.