Section REDUCE.
Variable E : Set.
Variable f : E -> Z.
Fixpoint reduce (q : queue E) : Z :=
match q with
| empty => 0%Z
| input d q' => (reduce q' + f d)%Z
end.
Hypothesis positive_function : forall a : E, (f a > 0)%Z.
(* We prove the following general lemma. Then, we instantiate it to - q1=nil: this case corresponds to adding an element in a queue. - q2=nil: this case corresponds to removing an element from a queue. *)
(* And now two instantiations *)

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