(*** ***)
Definition a_fun (s : Site) := f s1 s (t s1 s).Remark sigma2_change_1 :
 forall (l : list Site) (n0 : Z),
 only_once Site eq_site_dec s0 l ->
 (sigma Site l (change_x0 Site Z eq_site_dec a_fun s0 n0) + a_fun s0 - n0)%Z =
 sigma Site l a_fun.Remark add_reduce1 :
 forall x y z a b c : Z, (x + y - z - a + z)%Z = (x + y - a)%Z.Remark add_reduce2 :
 forall x y z a b c : Z,
 (x + y)%Z = (z + a - b + c)%Z -> (x + y)%Z = (a + z - b + c)%Z.

(* Specifications: *)
Lemma sigma_table2_change : only_once Site eq_site_dec s0 LS1 -> only_once Site eq_site_dec s1 LS2 -> sigma2_table Site LS1 LS2 Data f (update2_table Site eq_site_dec Data t s0 s1 d0) = (sigma2_table Site LS1 LS2 Data f t - f s0 s1 (t s0 s1) + f s0 s1 d0)%Z.
Lemma sigma2_table_simpl : forall (t : Site -> Site -> Data) (f1 f2 : Site -> Site -> Data -> Z), (forall (s1 s2 : Site) (d : Data), f1 s1 s2 d = f2 s1 s2 d) -> sigma2_table Site LS1 LS2 Data f1 t = sigma2_table Site LS1 LS2 Data f2 t.
Lemma sigma2_table_simpl_partial : forall (t : Site -> Site -> Data) (f1 f2 : Site -> Site -> Data -> Z), (forall (s1 s2 : Site) (d : Data), t s1 s2 = d -> f1 s1 s2 d = f2 s1 s2 d) -> sigma2_table Site LS1 LS2 Data f1 t = sigma2_table Site LS1 LS2 Data f2 t.
Lemma sigma2_table_simpl_property : forall (t : Site -> Site -> Data) (P : (Site -> Site -> Data) -> Site -> Site -> Set) (f1 f2 : Site -> Site -> Data -> Z), (forall (s1 s2 : Site) (d : Data), P t s1 s2 -> f1 s1 s2 d = f2 s1 s2 d) -> (forall s1 s2 : Site, P t s1 s2) -> sigma2_table Site LS1 LS2 Data f1 t = sigma2_table Site LS1 LS2 Data f2 t.
Lemma sigma2_sigma_but : sigma_but Site s0 eq_site_dec LS0 (fun s : Site => sigma2_table Site LS1 LS2 Data (f s) t) = sigma2_table Site LS1 LS2 Data (fun (s1 s2 : Site) (d : Data) => sigma_but Site s0 eq_site_dec LS0 (fun s : Site => f s s1 s2 d)) t.
Lemma decidable_pred_pred : forall a : Data, {fun_or Data pred pred a = true} + {fun_or Data pred pred a = false}.
Lemma permute_sigma_reduce : forall q : queue Data, sigma Site LS0 (fun s : Site => reduce Data (f s s1 s2) q) = reduce Data (fun d : Data => sigma Site LS0 (fun s : Site => f s s1 s2 d)) q.
Lemma permute_sigma_reduce2 : forall q : queue Data, sigma Site LS0 (fun _ : Site => reduce Data (f s s1 s2) q) = reduce Data (fun d : Data => sigma Site LS0 (fun _ : Site => f s s1 s2 d)) q.
Lemma permute_sigma_but_reduce : forall q : queue Data, sigma_but Site owner eq_site_dec LS0 (fun s : Site => reduce Data (f s s1 s2) q) = reduce Data (fun d : Data => sigma_but Site owner eq_site_dec LS0 (fun s : Site => f s s1 s2 d)) q.
Lemma sigma_but_null : forall (f : Site -> Z) (l : list Site), (forall s : Site, s <> owner -> f s = 0%Z) -> sigma_but Site owner eq_site_dec l f = 0%Z.
Lemma sigma_but_simpl : forall (f1 f2 : Site -> Z) (l : list Site), (forall s : Site, s <> owner -> f1 s = f2 s) -> sigma_but Site owner eq_site_dec l f1 = sigma_but Site owner eq_site_dec l f2.
Lemma sigma_strictly_positive : forall (f : E -> Z) (x : E) (l : list E), In x l -> (forall y : E, (f y >= 0)%Z) -> (f x > 0)%Z -> (sigma E l f > 0)%Z.
Lemma sigma_but_strictly_positive : forall (f : E -> Z) (x : E) (l : list E), In x l -> x <> x0 -> (forall y : E, (f y >= 0)%Z) -> (f x > 0)%Z -> (sigma_but E x0 eq_E_dec l f > 0)%Z.
Lemma sigma2_strictly_positive : forall (x y : Site) (l1 l2 : list Site), In x l1 -> In y l2 -> (forall x' y' : Site, (f x' y' (t x' y') >= 0)%Z) -> (f x y (t x y) > 0)%Z -> (sigma2_table Site l1 l2 Data f t > 0)%Z.