(* functional or *)
Definition fun_or (pred1 pred2 : E -> bool) (a : E) := pred1 a || pred2 a.(* functional sum *)
Definition fun_sum (f1 f2 : E -> Z) (a : E) := (f1 a + f2 a)%Z.Definition fun_minus (f1 f2 : E -> Z) (a : E) := (f1 a - f2 a)%Z.

(* Specifications: *)
Lemma disjoint_reduce : forall (f1 f2 : E -> Z) (q : queue E), reduce E (fun_sum f1 f2) q = (reduce E f1 q + reduce E f2 q)%Z.
Lemma disjoint_reduce3 : forall (f1 f2 : E -> Z) (q : queue E), reduce E (fun_minus f1 f2) q = (reduce E f1 q - reduce E f2 q)%Z.
Lemma reduce_simpl : forall (f1 f2 : E -> Z) (q : queue E), (forall d : E, f1 d = f2 d) -> reduce E f1 q = reduce E f2 q.
Lemma reduce_first_out : forall (q : queue data) (m : data), first data q = value data m -> reduce data f (first_out data q) = (reduce data f q - f m)%Z.
Lemma reduce_positive_or_null : forall q : queue E, (reduce E f q >= 0)%Z.
Lemma reduce_in_queue_strictly_positive : forall (x : E) (q : queue E), (f x > 0)%Z -> In_queue E x q -> (reduce E f q > 0)%Z.
Lemma reduce_in_queue_null : forall q : queue E, (forall x : E, In_queue E x q -> f x = 0%Z) -> reduce E f q = 0%Z.