End SIGMA_TABLE.
Section SIGMA_TABLE2.
Variable Site : Set.
Hypothesis eq_site_dec : eq_dec Site.
Variable LS1 : list Site.
Variable LS2 : list Site.
Variable Data : Set.
Let Table2 := Site -> Site -> Data.
Variable t : Table2.
Variable s0 s1 : Site.
Variable d0 : Data.
Variable f : Site -> Site -> Data -> Z.
Definition sigma2_table (t : Table2) :=
sigma_table Site LS1 Z (Z_id Site)
(fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1)).
Definition update2_table :=
change_x0y0 Site Site Data eq_site_dec eq_site_dec t s0 s1 d0.
End SIGMA_TABLE2.
Section SIGMA2_BUT_TABLE.
Variable Site : Set.
Hypothesis eq_site_dec : eq_dec Site.
Variable LS1 : list Site.
Variable LS2 : list Site.
Variable Data : Set.
Let Table := Site -> Data.
Let Table2 := Site -> Site -> Data.
Variable f1 : Site -> Data -> Z.
Variable s0 : Site.
Variable s1 : Site.
Variable t : Table2.
Variable f : Site -> Site -> Data -> Z.
Definition sigma2_but_table (t : Table2) :=
sigma_table Site LS1 Z (Z_id Site)
(fun s : Site =>
if eq_site_dec s s0
then  sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s)
else  sigma_table Site LS2 Data (f s) (t s)).
Definition new_sigma2_but_table (t : Table2) :=
sigma2_table Site LS1 LS2 Data
(fun (s2 s3 : Site) (d : Data) =>
if eq_site_dec s2 s0
then
if eq_site_dec s3 s1 then  0%Z else  f s2 s3 d
else  f s2 s3 d) t.
End SIGMA2_BUT_TABLE.
Section SIGMA_TABLE3.
Variable Site : Set.
Hypothesis eq_site_dec : eq_dec Site.
Variable LS1 : list Site.
Variable LS2 : list Site.
Variable Data : Set.
Let Table2 := Site -> Site -> Data.
Variable t : Table2.
Variable s0 s1 : Site.
Variable d0 : Data.
Variable f : Site -> Site -> Data -> Z.
Variable f1 : Site -> Site -> Data -> Z.
Variable f2 : Site -> Site -> Data -> Z.
(*Definition fun_sum_site2 := [f1,f2: Site -> Site->Data->Z] [s1,s2: Site] [a: Data] `(f1 s1 s2 a) + (f2 s1 s2 a)`.*)
Definition fun_sum_site2 (f1 f2 : Site -> Site -> Data -> Z)
(s1 : Site) :=
fun_sum_site Site Data (fun (s2 : Site) (a : Data) => f1 s1 s2 a)
(fun (s2 : Site) (a : Data) => f2 s1 s2 a).
Definition fun_minus_site2 (f1 f2 : Site -> Site -> Data -> Z)
(s1 : Site) :=
fun_minus_site Site Data (fun (s2 : Site) (a : Data) => f1 s1 s2 a)
(fun (s2 : Site) (a : Data) => f2 s1 s2 a).

(* Specifications: *)
Lemma sigma2_disjoint :
sigma2_table Site LS1 LS2 Data (fun_sum_site2 f1 f2) t =
(sigma2_table Site LS1 LS2 Data f1 t + sigma2_table Site LS1 LS2 Data f2 t)%Z.
Lemma sigma2_disjoint2 :
sigma2_table Site LS1 LS2 Data (fun_minus_site2 f1 f2) t =
(sigma2_table Site LS1 LS2 Data f1 t - sigma2_table Site LS1 LS2 Data f2 t)%Z.