End REDUCE.
Section DISJOINT.
Variable E : Set.
(* 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.
Variable f : E -> 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.