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.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.(*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.