(* This program is free software; you can redistribute it and/or      *)
(* modify it under the terms of the GNU Lesser General Public License *)
(* as published by the Free Software Foundation; either version 2.1   *)
(* of the License, or (at your option) any later version.             *)
(*                                                                    *)
(* This program is distributed in the hope that it will be useful,    *)
(* but WITHOUT ANY WARRANTY; without even the implied warranty of     *)
(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the      *)
(* GNU General Public License for more details.                       *)
(*                                                                    *)
(* You should have received a copy of the GNU Lesser General Public   *)
(* License along with this program; if not, write to the Free         *)
(* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *)
(* 02110-1301 USA                                                     *)



(* New variant where the function receives the coordonates *)

Require Import List.
Require Export fifo.
Require Export table. 
Require Export reduce. 

Unset Standard Proposition Elimination Names.

Section TABLE.

Variable Site : Set. 
Hypothesis eq_site_dec : eq_dec Site. 
Variable LS : list Site.


Variable Data : Set.
Let Table := Site -> Data.

Variable t : Table.
Variable s0 : Site.
Variable d0 : Data.

Variable f : Site -> Data -> Z.

Definition sigma_table (st : Table) :=
  sigma Site LS (fun s : Site => f s (st s)).

Definition update_table := change_x0 Site Data eq_site_dec t s0 d0.

Definition sigma_but_table (st : Table) :=
  sigma_but Site s0 eq_site_dec LS (fun s : Site => f s (st s)).

End TABLE.

Section SIGMA_TABLE.
Variable Site : Set. 
Hypothesis eq_site_dec : eq_dec Site. 
Variable LS : list Site.
(* This is generic code for any kind of tables hopefully *)

Variable Data : Set.
Let Table := Site -> Data.

Variable t : Table.
Variable s0 : Site.
Variable d0 : Data.

Variable f : Site -> Data -> Z.

Lemma sigma_table_change :
 only_once Site eq_site_dec s0 LS ->
 sigma_table Site LS Data f (update_table Site eq_site_dec Data t s0 d0) =
 (sigma_table Site LS Data f t - f s0 (t s0) + f s0 d0)%Z.
Proof.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma_table Site l 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))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold sigma_table in |- *.
(* Goal: forall _ : only_once Site eq_site_dec s0 LS, @eq Z (sigma Site LS (fun s : Site => f s (update_table Site eq_site_dec Data t s0 d0 s))) (Z.add (Z.sub (sigma Site LS (fun s : Site => f s (t s))) (f s0 (t s0))) (f s0 d0)) *)
  unfold update_table in |- *.
(* Goal: @eq Z (sigma Site LS (fun s : Site => Z_id s (fun_minus Site t1 t2 s))) (Z.sub (sigma Site LS (fun s : Site => Z_id s (t1 s))) (sigma Site LS (fun s : Site => Z_id s (t2 s)))) *)
  elim LS.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: forall (_ : @eq Site s0 a) (_ : not (@In Site s0 l)), only_once Site eq_site_dec s0 l *)
(* Goal: forall (_ : not (@eq Site s0 a)) (_ : only_once Site eq_site_dec s0 l), only_once Site eq_site_dec s0 l *)
  intuition.
  
(* Goal: forall (a : Site) (l : list Site) (_ : @eq Z (sigma_but Site s0 eq_site_dec l (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 l (fun s : Site => f s s1 s2 d)) t)), @eq Z (sigma_but Site s0 eq_site_dec (@cons Site a l) (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 (@cons Site a l) (fun s : Site => f s s1 s2 d)) t) *)
  intros a l H.
(* Goal: forall _ : if eq_site_dec s0 a then not (@In Site s0 l) else only_once Site eq_site_dec s0 l, only_once Site eq_site_dec s0 l *)
  case (eq_site_dec s0 a).
(* Goal: forall (_ : @eq Site s0 a) (_ : only_once Site eq_site_dec s0 (@cons Site a l)), @eq Z (sigma Site (@cons Site a l) (fun s : Site => f s (change_x0 Site Data eq_site_dec t s0 d0 s))) (Z.add (Z.sub (sigma Site (@cons Site a l) (fun s : Site => f s (t s))) (f s0 (t s0))) (f s0 d0)) *)
(* Goal: forall (_ : not (@eq Site s0 a)) (_ : only_once Site eq_site_dec s0 (@cons Site a l)), @eq Z (sigma Site (@cons Site a l) (fun s : Site => f s (change_x0 Site Data eq_site_dec t s0 d0 s))) (Z.add (Z.sub (sigma Site (@cons Site a l) (fun s : Site => f s (t s))) (f s0 (t s0))) (f s0 d0)) *)
  intro; rewrite e.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: @eq Z (Z.add (f a (change_x0 Site Data eq_site_dec t s0 d0 a)) (Z.add (Z.sub (sigma Site l (fun s : Site => f s (t s))) (f s0 (t s0))) (f s0 d0))) (Z.add (Z.sub (Z.add (f a (t a)) (sigma Site l (fun s : Site => f s (t s)))) (f s0 (t s0))) (f s0 d0)) *)
(* Goal: only_once Site eq_site_dec s0 l *)
  unfold change_x0 in |- *.
(* Goal: @eq Z (Z.add (if eq_site_dec a a then sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))) else Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (if eq_site_dec a a then sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))) else Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  case (eq_site_dec a a).
(* Goal: forall (_ : @eq Site a a) (_ : not (@In Site a l)), @eq Z (Z.add (f a d0) (sigma Site l (fun s : Site => f s (if eq_site_dec a s then d0 else t s)))) (Z.add (Z.sub (Z.add (f a (t a)) (sigma Site l (fun s : Site => f s (t s)))) (f a (t a))) (f a d0)) *)
(* Goal: forall (_ : not (@eq Site a a)) (_ : only_once Site eq_site_dec a l), @eq Z (Z.add (f a (t a)) (sigma Site l (fun s : Site => f s (if eq_site_dec a s then d0 else t s)))) (Z.add (Z.sub (Z.add (f a (t a)) (sigma Site l (fun s : Site => f s (t s)))) (f a (t a))) (f a d0)) *)
(* Goal: forall (_ : not (@eq Site s0 a)) (_ : only_once Site eq_site_dec s0 (@cons Site a l)), @eq Z (sigma Site (@cons Site a l) (fun s : Site => f s (change_x0 Site Data eq_site_dec t s0 d0 s))) (Z.add (Z.sub (sigma Site (@cons Site a l) (fun s : Site => f s (t s))) (f s0 (t s0))) (f s0 d0)) *)
  intros e0 H0.
  replace
   (sigma Site l
      (fun s : Site =>
       f s match eq_site_dec a s with
           | left _ => d0
           | right _ => t s
           end)) with (sigma Site l (fun s : Site => f s (t s))).
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0)))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  omega.
  
(* Goal: @eq Z (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply sigma_simpl.
(* Goal: forall (x : Site) (_ : @In Site x LS), @eq Z (f0 x (t0 x)) (f3 x (t0 x)) *)
  intros x H1.
(* Goal: @eq Z (f x (t x)) (f x (if eq_site_dec a x then d0 else t x)) *)
(* Goal: forall (_ : not (@eq Site a a)) (_ : only_once Site eq_site_dec a l), @eq Z (Z.add (f a (t a)) (sigma Site l (fun s : Site => f s (if eq_site_dec a s then d0 else t s)))) (Z.add (Z.sub (Z.add (f a (t a)) (sigma Site l (fun s : Site => f s (t s)))) (f a (t a))) (f a d0)) *)
(* Goal: forall (_ : not (@eq Site s0 a)) (_ : only_once Site eq_site_dec s0 (@cons Site a l)), @eq Z (sigma Site (@cons Site a l) (fun s : Site => f s (change_x0 Site Data eq_site_dec t s0 d0 s))) (Z.add (Z.sub (sigma Site (@cons Site a l) (fun s : Site => f s (t s))) (f s0 (t s0))) (f s0 d0)) *)
  case (eq_site_dec a x).
(* Goal: forall _ : @eq Site a x, @eq Z (f x (t x)) (f x d0) *)
(* Goal: forall _ : not (@eq Site a x), @eq Z (f x (t x)) (f x (t x)) *)
(* Goal: forall (_ : not (@eq Site a a)) (_ : only_once Site eq_site_dec a l), @eq Z (Z.add (f a (t a)) (sigma Site l (fun s : Site => f s (if eq_site_dec a s then d0 else t s)))) (Z.add (Z.sub (Z.add (f a (t a)) (sigma Site l (fun s : Site => f s (t s)))) (f a (t a))) (f a d0)) *)
(* Goal: forall (_ : not (@eq Site s0 a)) (_ : only_once Site eq_site_dec s0 (@cons Site a l)), @eq Z (sigma Site (@cons Site a l) (fun s : Site => f s (change_x0 Site Data eq_site_dec t s0 d0 s))) (Z.add (Z.sub (sigma Site (@cons Site a l) (fun s : Site => f s (t s))) (f s0 (t s0))) (f s0 d0)) *)
  intro; rewrite e1 in H0.
(* Goal: forall (_ : @eq Site s0 a) (_ : not (@In Site s0 l)), only_once Site eq_site_dec s0 l *)
(* Goal: forall (_ : not (@eq Site s0 a)) (_ : only_once Site eq_site_dec s0 l), only_once Site eq_site_dec s0 l *)
  intuition.
  
(* Goal: forall _ : not (@eq Site a x), @eq Z (f x (t x)) (f x (t x)) *)
(* Goal: forall (_ : not (@eq Site a a)) (_ : only_once Site eq_site_dec a l), @eq Z (Z.add (f a (t a)) (sigma Site l (fun s : Site => f s (if eq_site_dec a s then d0 else t s)))) (Z.add (Z.sub (Z.add (f a (t a)) (sigma Site l (fun s : Site => f s (t s)))) (f a (t a))) (f a d0)) *)
(* Goal: forall (_ : not (@eq Site s0 a)) (_ : only_once Site eq_site_dec s0 (@cons Site a l)), @eq Z (sigma Site (@cons Site a l) (fun s : Site => f s (change_x0 Site Data eq_site_dec t s0 d0 s))) (Z.add (Z.sub (sigma Site (@cons Site a l) (fun s : Site => f s (t s))) (f s0 (t s0))) (f s0 d0)) *)
  intro; auto.
  
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  intro n.
(* Goal: forall _ : only_once Site eq_site_dec a l, @eq Z (Z.add (f a (t a)) (sigma Site l (fun s : Site => f s (if eq_site_dec a s then d0 else t s)))) (Z.add (Z.sub (Z.add (f a (t a)) (sigma Site l (fun s : Site => f s (t s)))) (f a (t a))) (f a d0)) *)
(* Goal: forall (_ : not (@eq Site s0 a)) (_ : only_once Site eq_site_dec s0 (@cons Site a l)), @eq Z (sigma Site (@cons Site a l) (fun s : Site => f s (change_x0 Site Data eq_site_dec t s0 d0 s))) (Z.add (Z.sub (sigma Site (@cons Site a l) (fun s : Site => f s (t s))) (f s0 (t s0))) (f s0 d0)) *)
  elim n.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  intro n.
(* Goal: forall _ : forall s1 s2 : Site, P t0 s1 s2, @eq Z (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f1' s1) (t0 s1))) (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f2' s1) (t0 s1))) *)
  intro H0.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: @eq Z (Z.add Z0 (sigma_but Site owner eq_site_dec l0 f0)) Z0 *)
(* Goal: not (@eq Site a owner) *)
  rewrite H.
(* Goal: @eq Z (Z.add (f a (change_x0 Site Data eq_site_dec t s0 d0 a)) (Z.add (Z.sub (sigma Site l (fun s : Site => f s (t s))) (f s0 (t s0))) (f s0 d0))) (Z.add (Z.sub (Z.add (f a (t a)) (sigma Site l (fun s : Site => f s (t s)))) (f s0 (t s0))) (f s0 d0)) *)
(* Goal: only_once Site eq_site_dec s0 l *)
  unfold change_x0 in |- *.
(* Goal: @eq Z (Z.add (f a (if eq_site_dec s0 a then d0 else t a)) (Z.add (Z.sub (sigma Site l (fun s : Site => f s (t s))) (f s0 (t s0))) (f s0 d0))) (Z.add (Z.sub (Z.add (f a (t a)) (sigma Site l (fun s : Site => f s (t s)))) (f s0 (t s0))) (f s0 d0)) *)
(* Goal: only_once Site eq_site_dec s0 l *)
  rewrite case_ineq.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0)))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  omega.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s0 l *)
  unfold only_once in H0.
(* Goal: Z.gt (Z.add (f a) (sigma E l0 f)) Z0 *)
  generalize H0.
(* Goal: forall _ : if eq_site_dec s0 a then not (@In Site s0 l) else only_once Site eq_site_dec s0 l, only_once Site eq_site_dec s0 l *)
  case (eq_site_dec s0 a).
(* Goal: forall (_ : @eq Site s0 a) (_ : not (@In Site s0 l)), only_once Site eq_site_dec s0 l *)
(* Goal: forall (_ : not (@eq Site s0 a)) (_ : only_once Site eq_site_dec s0 l), only_once Site eq_site_dec s0 l *)
  intuition.
  
(* Goal: forall _ : if eq_site_dec s0 a then not (@In Site s0 l) else only_once Site eq_site_dec s0 l, not (@eq Site a x) *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
(* Goal: forall _ : not (@eq Site s0 a), @eq Z (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (update2_table Site eq_site_dec Data t s0 s1 d0 a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (update2_table Site eq_site_dec Data t s0 s1 d0 s))))) (Z.add (Z.sub (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (t a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (t s))))) (f s0 s1 (t s0 s1))) (f s0 s1 d0)) *)
  unfold only_once in |- *.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
Qed.

(* Just an auxiliary one that is more convenient to use *)

Lemma sigma_table_change_aux :
 only_once Site eq_site_dec s0 LS ->
 (sigma_table Site LS Data f (update_table Site eq_site_dec Data t s0 d0) +
  f s0 (t s0) - f s0 d0)%Z = sigma_table Site LS Data f t.
Proof.
(* Goal: forall _ : sumbool (@eq bool (pred a) true) (@eq bool (pred a) false), sumbool (@eq bool (orb (pred a) (pred a)) true) (@eq bool (orb (pred a) (pred a)) false) *)
  intro H.
(* Goal: @eq Z (Z.sub (Z.add (sigma_table Site LS Data f (update_table Site eq_site_dec Data t s0 d0)) (f s0 (t s0))) (f s0 d0)) (sigma_table Site LS Data f t) *)
  rewrite sigma_table_change.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0)))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  omega.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
Qed.


Variable f1 : Site -> Data -> Z.
Variable f2 : Site -> Data -> Z.

Definition fun_sum_site (f1 f2 : Site -> Data -> Z) 
  (s : Site) (a : Data) := (f1 s a + f2 s a)%Z.

Definition fun_minus_site (f1 f2 : Site -> Data -> Z) 
  (s : Site) (a : Data) := (f1 s a - f2 s a)%Z.


Lemma sigma_disjoint :
 sigma_table Site LS Data (fun_sum_site f1 f2) t =
 (sigma_table Site LS Data f1 t + sigma_table Site LS Data f2 t)%Z.
Proof.
(* Goal: @eq Z (sigma_table Site LS Data (fun_sum_site f1 f2) t) (Z.add (sigma_table Site LS Data f1 t) (sigma_table Site LS Data f2 t)) *)
  unfold sigma_table, fun_sum_site in |- *.
(* Goal: @eq Z (sigma Site LS (fun s : Site => Z_id s (fun_minus Site t1 t2 s))) (Z.sub (sigma Site LS (fun s : Site => Z_id s (t1 s))) (sigma Site LS (fun s : Site => Z_id s (t2 s)))) *)
  elim LS.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: @eq Z Z0 Z0 *)
(* Goal: forall (a : Site) (l : list Site) (_ : @eq Z (sigma Site l (fun s : Site => Z.sub (f1 s (t s)) (f2 s (t s)))) (Z.sub (sigma Site l (fun s : Site => f1 s (t s))) (sigma Site l (fun s : Site => f2 s (t s))))), @eq Z (sigma Site (@cons Site a l) (fun s : Site => Z.sub (f1 s (t s)) (f2 s (t s)))) (Z.sub (sigma Site (@cons Site a l) (fun s : Site => f1 s (t s))) (sigma Site (@cons Site a l) (fun s : Site => f2 s (t s)))) *)
  trivial.
(* Goal: forall (a : Site) (l : list Site) (_ : @eq Z (sigma_but Site s0 eq_site_dec l (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 l (fun s : Site => f s s1 s2 d)) t)), @eq Z (sigma_but Site s0 eq_site_dec (@cons Site a l) (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 (@cons Site a l) (fun s : Site => f s s1 s2 d)) t) *)
  intros a l H.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: @eq Z (Z.add Z0 (sigma_but Site owner eq_site_dec l0 f0)) Z0 *)
(* Goal: not (@eq Site a owner) *)
  rewrite H.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0)))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  omega.
Qed.

Lemma sigma_disjoint2 :
 sigma_table Site LS Data (fun_minus_site f1 f2) t =
 (sigma_table Site LS Data f1 t - sigma_table Site LS Data f2 t)%Z.
Proof.
(* Goal: @eq Z (sigma_table Site LS Data (fun_minus_site f1 f2) t) (Z.sub (sigma_table Site LS Data f1 t) (sigma_table Site LS Data f2 t)) *)
  unfold sigma_table, fun_minus_site in |- *.
(* Goal: @eq Z (sigma Site LS (fun s : Site => Z_id s (fun_minus Site t1 t2 s))) (Z.sub (sigma Site LS (fun s : Site => Z_id s (t1 s))) (sigma Site LS (fun s : Site => Z_id s (t2 s)))) *)
  elim LS.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: @eq Z Z0 Z0 *)
(* Goal: forall (a : Site) (l : list Site) (_ : @eq Z (sigma Site l (fun s : Site => Z.sub (f1 s (t s)) (f2 s (t s)))) (Z.sub (sigma Site l (fun s : Site => f1 s (t s))) (sigma Site l (fun s : Site => f2 s (t s))))), @eq Z (sigma Site (@cons Site a l) (fun s : Site => Z.sub (f1 s (t s)) (f2 s (t s)))) (Z.sub (sigma Site (@cons Site a l) (fun s : Site => f1 s (t s))) (sigma Site (@cons Site a l) (fun s : Site => f2 s (t s)))) *)
  trivial.
(* Goal: forall (a : Site) (l : list Site) (_ : @eq Z (sigma_but Site s0 eq_site_dec l (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 l (fun s : Site => f s s1 s2 d)) t)), @eq Z (sigma_but Site s0 eq_site_dec (@cons Site a l) (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 (@cons Site a l) (fun s : Site => f s s1 s2 d)) t) *)
  intros a l H.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: @eq Z (Z.add Z0 (sigma_but Site owner eq_site_dec l0 f0)) Z0 *)
(* Goal: not (@eq Site a owner) *)
  rewrite H.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0)))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  omega.
Qed.

Definition Z_id (s : Site) (x : Z) := x.

Lemma Z_id_reduce : forall (s : Site) (x : Z), Z_id s x = x.
Proof.
(* Goal: forall (s : Site) (x : Z), @eq Z (Z_id s x) x *)
  intros s x.
(* Goal: @eq Z (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold Z_id in |- *.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
Qed.

Lemma sigma_same_table :
 forall t1 t2 : Site -> Z,
 sigma_table Site LS Z Z_id (fun_sum Site t1 t2) =
 (sigma_table Site LS Z Z_id t1 + sigma_table Site LS Z Z_id t2)%Z.
Proof.
(* Goal: forall t1 t2 : forall _ : Site, Z, @eq Z (sigma_table Site LS Z Z_id (fun_minus Site t1 t2)) (Z.sub (sigma_table Site LS Z Z_id t1) (sigma_table Site LS Z Z_id t2)) *)
  intros t1 t2.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma_table Site l 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))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold sigma_table in |- *.
(* Goal: @eq Z (sigma Site LS (fun s : Site => Z_id s (fun_minus Site t1 t2 s))) (Z.sub (sigma Site LS (fun s : Site => Z_id s (t1 s))) (sigma Site LS (fun s : Site => Z_id s (t2 s)))) *)
  elim LS.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
(* Goal: forall (a : Site) (l : list Site) (_ : @eq Z (sigma_but Site s0 eq_site_dec l (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 l (fun s : Site => f s s1 s2 d)) t)), @eq Z (sigma_but Site s0 eq_site_dec (@cons Site a l) (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 (@cons Site a l) (fun s : Site => f s s1 s2 d)) t) *)
  intros a l H.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: @eq Z (Z.add Z0 (sigma_but Site owner eq_site_dec l0 f0)) Z0 *)
(* Goal: not (@eq Site a owner) *)
  rewrite H.
(* Goal: @eq Z (reduce Data (fun_sum Data (f a s1 s2) (fun d : Data => sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d))) q) (reduce Data (fun d : Data => Z.add (f a s1 s2 d) (sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d))) q) *)
  unfold fun_sum in |- *.
(* Goal: @eq Z (Z.add (Z.sub (t1 a) (t2 a)) (Z.sub (sigma Site l (fun s : Site => Z_id s (t1 s))) (sigma Site l (fun s : Site => Z_id s (t2 s))))) (Z.sub (Z.add (t1 a) (sigma Site l (fun s : Site => Z_id s (t1 s)))) (Z.add (Z_id a (t2 a)) (sigma Site l (fun s : Site => Z_id s (t2 s))))) *)
  rewrite Z_id_reduce.
(* Goal: @eq Z (Z.add (Z.sub (t1 a) (t2 a)) (Z.sub (sigma Site l (fun s : Site => Z_id s (t1 s))) (sigma Site l (fun s : Site => Z_id s (t2 s))))) (Z.sub (Z.add (t1 a) (sigma Site l (fun s : Site => Z_id s (t1 s)))) (Z.add (Z_id a (t2 a)) (sigma Site l (fun s : Site => Z_id s (t2 s))))) *)
  rewrite Z_id_reduce.
(* Goal: @eq Z (Z.add (Z.sub (t1 a) (t2 a)) (Z.sub (sigma Site l (fun s : Site => Z_id s (t1 s))) (sigma Site l (fun s : Site => Z_id s (t2 s))))) (Z.sub (Z.add (t1 a) (sigma Site l (fun s : Site => Z_id s (t1 s)))) (Z.add (Z_id a (t2 a)) (sigma Site l (fun s : Site => Z_id s (t2 s))))) *)
  rewrite Z_id_reduce.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0)))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  omega.
Qed.

Lemma sigma_same_table2 :
 forall t1 t2 : Site -> Z,
 sigma_table Site LS Z Z_id (fun_minus Site t1 t2) =
 (sigma_table Site LS Z Z_id t1 - sigma_table Site LS Z Z_id t2)%Z.
Proof.
(* Goal: forall t1 t2 : forall _ : Site, Z, @eq Z (sigma_table Site LS Z Z_id (fun_minus Site t1 t2)) (Z.sub (sigma_table Site LS Z Z_id t1) (sigma_table Site LS Z Z_id t2)) *)
  intros t1 t2.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma_table Site l 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))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold sigma_table in |- *.
(* Goal: @eq Z (sigma Site LS (fun s : Site => Z_id s (fun_minus Site t1 t2 s))) (Z.sub (sigma Site LS (fun s : Site => Z_id s (t1 s))) (sigma Site LS (fun s : Site => Z_id s (t2 s)))) *)
  elim LS.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
(* Goal: forall (a : Site) (l : list Site) (_ : @eq Z (sigma_but Site s0 eq_site_dec l (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 l (fun s : Site => f s s1 s2 d)) t)), @eq Z (sigma_but Site s0 eq_site_dec (@cons Site a l) (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 (@cons Site a l) (fun s : Site => f s s1 s2 d)) t) *)
  intros a l H.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: @eq Z (Z.add Z0 (sigma_but Site owner eq_site_dec l0 f0)) Z0 *)
(* Goal: not (@eq Site a owner) *)
  rewrite H.
(* Goal: @eq Z (sigma_table Site LS2 Data (fun (s : Site) (a : Data) => Z.sub (f1 e s a) (f2 e s a)) (t e)) (fun_minus Site (fun s1 : Site => sigma_table Site LS2 Data (f1 s1) (t s1)) (fun s1 : Site => sigma_table Site LS2 Data (f2 s1) (t s1)) e) *)
  unfold fun_minus in |- *.
(* Goal: @eq Z (Z.add (Z.sub (t1 a) (t2 a)) (Z.sub (sigma Site l (fun s : Site => Z_id s (t1 s))) (sigma Site l (fun s : Site => Z_id s (t2 s))))) (Z.sub (Z.add (t1 a) (sigma Site l (fun s : Site => Z_id s (t1 s)))) (Z.add (Z_id a (t2 a)) (sigma Site l (fun s : Site => Z_id s (t2 s))))) *)
  rewrite Z_id_reduce.
(* Goal: @eq Z (Z.add (Z.sub (t1 a) (t2 a)) (Z.sub (sigma Site l (fun s : Site => Z_id s (t1 s))) (sigma Site l (fun s : Site => Z_id s (t2 s))))) (Z.sub (Z.add (t1 a) (sigma Site l (fun s : Site => Z_id s (t1 s)))) (Z.add (Z_id a (t2 a)) (sigma Site l (fun s : Site => Z_id s (t2 s))))) *)
  rewrite Z_id_reduce.
(* Goal: @eq Z (Z.add (Z.sub (t1 a) (t2 a)) (Z.sub (sigma Site l (fun s : Site => Z_id s (t1 s))) (sigma Site l (fun s : Site => Z_id s (t2 s))))) (Z.sub (Z.add (t1 a) (sigma Site l (fun s : Site => Z_id s (t1 s)))) (Z.add (Z_id a (t2 a)) (sigma Site l (fun s : Site => Z_id s (t2 s))))) *)
  rewrite Z_id_reduce.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0)))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  omega.
Qed.

Lemma sigma_table_simpl :
 forall t1 t2 : Site -> Data,
 t1 = t2 -> sigma_table Site LS Data f t1 = sigma_table Site LS Data f t2.
Proof.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma_table Site l 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))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold sigma_table in |- *.
(* Goal: forall (t1 t2 : forall _ : Site, Data) (_ : @eq (forall _ : Site, Data) t1 t2), @eq Z (sigma Site LS (fun s : Site => f s (t1 s))) (sigma Site LS (fun s : Site => f s (t2 s))) *)
  intros t1 t2 H.
(* Goal: @eq Z (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply sigma_simpl.
(* Goal: forall (x : Site) (_ : @In Site x LS), @eq Z (f0 x (t0 x)) (f3 x (t0 x)) *)
  intros x H0.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  rewrite H; auto.
Qed.

Lemma sigma_table_simpl_property :
 forall (t1 t2 : Site -> Data) (P : (Site -> Data) -> Site -> Set),
 ((forall d : Site, P t2 d) -> t1 = t2) ->
 (forall d : Site, P t2 d) ->
 sigma_table Site LS Data f t1 = sigma_table Site LS Data f t2.
Proof.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma_table Site l 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))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold sigma_table in |- *.
(* Goal: forall (t1 t2 : forall _ : Site, Data) (P : forall (_ : forall _ : Site, Data) (_ : Site), Set) (_ : forall _ : forall d : Site, P t2 d, @eq (forall _ : Site, Data) t1 t2) (_ : forall d : Site, P t2 d), @eq Z (sigma Site LS (fun s : Site => f s (t1 s))) (sigma Site LS (fun s : Site => f s (t2 s))) *)
  intros t1 t2 P H H0.
(* Goal: @eq Z (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply sigma_simpl.
(* Goal: forall (x : Site) (_ : @In Site x LS), @eq Z (f0 x (t0 x)) (f3 x (t0 x)) *)
  intros x H1.
(* Goal: @eq Z (f x (t1 x)) (f x (t2 x)) *)
  generalize (H H0).
(* Goal: forall _ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma Site l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z.add (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f t) (f s0 s1 (t s0 s1))), @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (f s0 s1 (t s0 s1))) *)
  intro H2.
(* Goal: @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (f s0 s1 (t s0 s1))) *)
  rewrite H2.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
Qed.



Lemma sigma_table_simpl2 :
 forall (Data : Set) (t : Site -> Data) (f1 f2 : Site -> Data -> Z),
 (forall (s : Site) (d : Data), f1 s d = f2 s d) ->
 sigma_table Site LS Data f1 t = sigma_table Site LS Data f2 t.
Proof.
(* Goal: forall (Data : Set) (t : forall _ : Site, Data) (f1 f2 : forall (_ : Site) (_ : Data), Z) (_ : forall (s : Site) (d : Data) (_ : @eq Data (t s) d), @eq Z (f1 s d) (f2 s d)), @eq Z (sigma_table Site LS Data f1 t) (sigma_table Site LS Data f2 t) *)
  intros Data0 t0 f0 f3 H.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma_table Site l 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))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold sigma_table in |- *.
(* Goal: @eq Z (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply sigma_simpl.
(* Goal: forall (x : Site) (_ : @In Site x LS), @eq Z (f0 x (t0 x)) (f3 x (t0 x)) *)
  intros x H0.
(* Goal: @eq Z (f0 a x (t1 a x)) (f0 a x (t2 a x)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply H.
Qed.

(* same as before, but we consider the functions f1 and f2 uniquely
   for values contained in the table t! *)

Lemma sigma_table_simpl2_partial :
 forall (Data : Set) (t : Site -> Data) (f1 f2 : Site -> Data -> Z),
 (forall (s : Site) (d : Data), t s = d -> f1 s d = f2 s d) ->
 sigma_table Site LS Data f1 t = sigma_table Site LS Data f2 t.
Proof.
(* Goal: forall (Data : Set) (t : forall _ : Site, Data) (f1 f2 : forall (_ : Site) (_ : Data), Z) (_ : forall (s : Site) (d : Data) (_ : @eq Data (t s) d), @eq Z (f1 s d) (f2 s d)), @eq Z (sigma_table Site LS Data f1 t) (sigma_table Site LS Data f2 t) *)
  intros Data0 t0 f0 f3 H.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma_table Site l 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))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold sigma_table in |- *.
(* Goal: @eq Z (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply sigma_simpl.
(* Goal: forall (x : Site) (_ : @In Site x LS), @eq Z (f0 x (t0 x)) (f3 x (t0 x)) *)
  intro x.
(* Goal: forall _ : forall s1 s2 : Site, P t0 s1 s2, @eq Z (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f1' s1) (t0 s1))) (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f2' s1) (t0 s1))) *)
  intro H0.
(* Goal: @eq Z (f0 x (t0 x)) (f3 x (t0 x)) *)
  generalize (H x (t0 x)).
(* Goal: forall _ : forall _ : @eq Data0 (t0 x) (t0 x), @eq Z (f0 x (t0 x)) (f3 x (t0 x)), @eq Z (f0 x (t0 x)) (f3 x (t0 x)) *)
  intro H1.
(* Goal: @eq Z (f0 x (t0 x)) (f3 x (t0 x)) *)
  apply H1.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
Qed.

Lemma sigma_table_simpl2_property :
 forall (Data : Set) (t : Site -> Data) (P : (Site -> Data) -> Site -> Set)
   (f1 f2 : Site -> Data -> Z),
 (forall (s : Site) (d : Data), P t s -> f1 s d = f2 s d) ->
 (forall s : Site, P t s) ->
 sigma_table Site LS Data f1 t = sigma_table Site LS Data f2 t.
Proof.
(* Goal: forall (Data : Set) (t : forall _ : Site, Data) (P : forall (_ : forall _ : Site, Data) (_ : Site), Set) (f1 f2 : forall (_ : Site) (_ : Data), Z) (_ : forall (s : Site) (d : Data) (_ : P t s), @eq Z (f1 s d) (f2 s d)) (_ : forall s : Site, P t s), @eq Z (sigma_table Site LS Data f1 t) (sigma_table Site LS Data f2 t) *)
  intros Data0 t0 P f0 f3 H H0.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma_table Site l 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))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold sigma_table in |- *.
(* Goal: @eq Z (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply sigma_simpl.
(* Goal: forall (x : Site) (_ : @In Site x LS), @eq Z (f0 x (t0 x)) (f3 x (t0 x)) *)
  intros x H1.
(* Goal: @eq Z (f0 a x (t1 a x)) (f0 a x (t2 a x)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply H.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
Qed.

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).
  

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.
Proof.
(* Goal: forall _ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_table Site l LS2 Data f t) (Z.add (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f t) (f s0 s1 (t s0 s1))), @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (f s0 s1 (t s0 s1))) *)
  unfold sigma2_table in |- *.
(* Goal: @eq Z (sigma2_table Site LS1 LS2 Data (fun_sum_site2 Site Data (f a) (fun (s1 s2 : Site) (d : Data) => sigma_but Site s0 eq_site_dec l (fun s : Site => f s s1 s2 d))) t) (sigma2_table Site LS1 LS2 Data (fun (s1 s2 : Site) (d : Data) => Z.add (f a s1 s2 d) (sigma_but Site s0 eq_site_dec l (fun s : Site => f s s1 s2 d))) t) *)
  unfold fun_sum_site2 in |- *.
(* Goal: @eq Z (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (fun_sum_site Site Data (fun (s2 : Site) (a : Data) => f1 s1 s2 a) (fun (s2 : Site) (a : Data) => f2 s1 s2 a)) (t s1))) (Z.add (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f1 s1) (t s1))) (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f2 s1) (t s1)))) *)
  rewrite <- sigma_same_table.
(* Goal: @eq Z (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f0 s1) (t0 s1))) (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f3 s1) (t0 s1))) *)
  apply sigma_table_simpl.
(* Goal: @eq Z (sigma2_table Site LS1 LS2 Data (fun s1 : Site => fun_sum_site Site Data (fun (s2 : Site) (a0 : Data) => f a s1 s2 a0) (fun (s2 : Site) (a : Data) => sigma_but Site s0 eq_site_dec l (fun s : Site => f s s1 s2 a))) t) (sigma2_table Site LS1 LS2 Data (fun (s1 s2 : Site) (d : Data) => Z.add (f a s1 s2 d) (sigma_but Site s0 eq_site_dec l (fun s : Site => f s s1 s2 d))) t) *)
  unfold fun_sum_site in |- *.
(* Goal: @eq (forall _ : Site, Z) (fun s1 : Site => sigma_table Site LS2 Data (f1' s1) (t0 s1)) (fun s1 : Site => sigma_table Site LS2 Data (f2' s1) (t0 s1)) *)
(* Goal: forall d : Site, P t0 s1 d *)
  apply funct_eq.
(* Goal: forall _ : @eq E a x, Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
(* Goal: forall _ : not (@eq E a x), Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
  intro e.
(* Goal: @eq Z (reduce Data (fun_sum Data (f a s1 s2) (fun d : Data => sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d))) q) (reduce Data (fun d : Data => Z.add (f a s1 s2 d) (sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d))) q) *)
  unfold fun_sum in |- *.
(* Goal: @eq Z (sigma_table Site LS2 Data (fun (s : Site) (a : Data) => Z.add (f1 e s a) (f2 e s a)) (t e)) (Z.add (sigma_table Site LS2 Data (f1 e) (t e)) (sigma_table Site LS2 Data (f2 e) (t e))) *)
  rewrite <- sigma_disjoint.
(* Goal: @eq Z (sigma2_table Site LS1 LS2 Data (fun s1 : Site => fun_sum_site Site Data (fun (s2 : Site) (a0 : Data) => f a s1 s2 a0) (fun (s2 : Site) (a : Data) => sigma_but Site s0 eq_site_dec l (fun s : Site => f s s1 s2 a))) t) (sigma2_table Site LS1 LS2 Data (fun (s1 s2 : Site) (d : Data) => Z.add (f a s1 s2 d) (sigma_but Site s0 eq_site_dec l (fun s : Site => f s s1 s2 d))) t) *)
  unfold fun_sum_site in |- *.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
Qed.

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.
Proof.
(* Goal: forall _ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_table Site l LS2 Data f t) (Z.add (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f t) (f s0 s1 (t s0 s1))), @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (f s0 s1 (t s0 s1))) *)
  unfold sigma2_table in |- *.
(* Goal: @eq Z (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (fun_minus_site2 f1 f2 s1) (t s1))) (Z.sub (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f1 s1) (t s1))) (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f2 s1) (t s1)))) *)
  unfold fun_minus_site2 in |- *.
(* Goal: @eq Z (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (fun_minus_site Site Data (fun (s2 : Site) (a : Data) => f1 s1 s2 a) (fun (s2 : Site) (a : Data) => f2 s1 s2 a)) (t s1))) (Z.sub (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f1 s1) (t s1))) (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f2 s1) (t s1)))) *)
  rewrite <- sigma_same_table2.
(* Goal: @eq Z (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f0 s1) (t0 s1))) (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f3 s1) (t0 s1))) *)
  apply sigma_table_simpl.
(* Goal: @eq Z (sigma_table Site LS2 Data (fun (s : Site) (a : Data) => Z.sub (f1 e s a) (f2 e s a)) (t e)) (sigma_table Site LS2 Data (fun_minus_site Site Data (f1 e) (f2 e)) (t e)) *)
  unfold fun_minus_site in |- *.
(* Goal: @eq (forall _ : Site, Z) (fun s1 : Site => sigma_table Site LS2 Data (f1' s1) (t0 s1)) (fun s1 : Site => sigma_table Site LS2 Data (f2' s1) (t0 s1)) *)
(* Goal: forall d : Site, P t0 s1 d *)
  apply funct_eq.
(* Goal: forall _ : @eq E a x, Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
(* Goal: forall _ : not (@eq E a x), Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
  intro e.
(* Goal: @eq Z (sigma_table Site LS2 Data (fun (s : Site) (a : Data) => Z.sub (f1 e s a) (f2 e s a)) (t e)) (fun_minus Site (fun s1 : Site => sigma_table Site LS2 Data (f1 s1) (t s1)) (fun s1 : Site => sigma_table Site LS2 Data (f2 s1) (t s1)) e) *)
  unfold fun_minus in |- *.
(* Goal: @eq Z (sigma_table Site LS2 Data (fun (s : Site) (a : Data) => Z.sub (f1 e s a) (f2 e s a)) (t e)) (Z.sub (sigma_table Site LS2 Data (f1 e) (t e)) (sigma_table Site LS2 Data (f2 e) (t e))) *)
  rewrite <- sigma_disjoint2.
(* Goal: @eq Z (sigma_table Site LS2 Data (fun (s : Site) (a : Data) => Z.sub (f1 e s a) (f2 e s a)) (t e)) (sigma_table Site LS2 Data (fun_minus_site Site Data (f1 e) (f2 e)) (t e)) *)
  unfold fun_minus_site in |- *.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
Qed.


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

Proof.
(* Goal: forall (l : list Site) (n0 : Z) (_ : only_once Site eq_site_dec s0 l), @eq Z (Z.sub (Z.add (sigma Site l (change_x0 Site Z eq_site_dec a_fun s0 n0)) (a_fun s0)) n0) (sigma Site l a_fun) *)
  intros l n0 H.
(* Goal: @eq Z (Z.sub (Z.add (sigma Site l (change_x0 Site Z eq_site_dec a_fun s0 n0)) (a_fun s0)) n0) (sigma Site l a_fun) *)
  rewrite sigma_change.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0)))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  omega.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
Qed.

Remark add_reduce1 :
 forall x y z a b c : Z, (x + y - z - a + z)%Z = (x + y - a)%Z.
Proof.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0)))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
intros; omega.
Qed.

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.
Proof.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0)))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
intros; omega.
Qed.




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.
Proof.
(* Goal: forall (_ : only_once Site eq_site_dec s0 LS1) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_table Site LS1 LS2 Data f (update2_table Site eq_site_dec Data t s0 s1 d0)) (Z.add (Z.sub (sigma2_table Site LS1 LS2 Data f t) (f s0 s1 (t s0 s1))) (f s0 s1 d0)) *)
  clear f1 f2. (* BUG DISCHARGE? *)
(* Goal: forall (_ : only_once Site eq_site_dec s0 LS1) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_table Site LS1 LS2 Data f (update2_table Site eq_site_dec Data t s0 s1 d0)) (Z.add (Z.sub (sigma2_table Site LS1 LS2 Data f t) (f s0 s1 (t s0 s1))) (f s0 s1 d0)) *)
  intros H H0.
(* Goal: @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (f s0 s1 (t s0 s1))) *)
  generalize H.
(* Goal: forall _ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_table Site l LS2 Data f t) (Z.add (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f t) (f s0 s1 (t s0 s1))), @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (f s0 s1 (t s0 s1))) *)
  unfold sigma2_table in |- *.
(* Goal: forall _ : only_once Site eq_site_dec s0 LS1, @eq Z (sigma_table Site LS1 Z (Z_id Site) (fun s2 : Site => sigma_table Site LS2 Data (f s2) (update2_table Site eq_site_dec Data t s0 s1 d0 s2))) (Z.add (Z.sub (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (f s0 s1 (t s0 s1))) (f s0 s1 d0)) *)
  unfold sigma_table at 1 3 in |- *.
(* Goal: forall (_ : only_once Site eq_site_dec s0 LS1) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec LS1 LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec LS1 LS2 Data s0 s1 f0 t2) *)
  elim LS1.
(* Goal: forall (_ : @eq Site s0 a) (_ : not (@In Site s0 l)), only_once Site eq_site_dec s0 l *)
(* Goal: forall (_ : not (@eq Site s0 a)) (_ : only_once Site eq_site_dec s0 l), only_once Site eq_site_dec s0 l *)
  simpl in |- *; intuition.

(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: forall (a : Site) (l : list Site) (_ : forall _ : only_once Site eq_site_dec s0 l, @eq Z (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (update2_table Site eq_site_dec Data t s0 s1 d0 s)))) (Z.add (Z.sub (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (t s)))) (f s0 s1 (t s0 s1))) (f s0 s1 d0))) (_ : if eq_site_dec s0 a then not (@In Site s0 l) else only_once Site eq_site_dec s0 l), @eq Z (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (update2_table Site eq_site_dec Data t s0 s1 d0 a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (update2_table Site eq_site_dec Data t s0 s1 d0 s))))) (Z.add (Z.sub (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (t a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (t s))))) (f s0 s1 (t s0 s1))) (f s0 s1 d0)) *)
  intros a l H1 H2.
(* Goal: forall _ : if eq_site_dec s0 a then not (@In Site s0 l) else only_once Site eq_site_dec s0 l, only_once Site eq_site_dec s0 l *)
  case (eq_site_dec s0 a).
(* Goal: forall _ : @eq E a x, Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
(* Goal: forall _ : not (@eq E a x), Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
  intro e.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : not (@In Site s0 l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  rewrite e.
(* Goal: @eq Z (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (update2_table Site eq_site_dec Data t a s1 d0 a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (update2_table Site eq_site_dec Data t a s1 d0 s))))) (Z.add (Z.sub (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (t a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (t s))))) (f a s1 (t a s1))) (f a s1 d0)) *)
(* Goal: forall _ : not (@eq Site s0 a), @eq Z (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (update2_table Site eq_site_dec Data t s0 s1 d0 a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (update2_table Site eq_site_dec Data t s0 s1 d0 s))))) (Z.add (Z.sub (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (t a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (t s))))) (f s0 s1 (t s0 s1))) (f s0 s1 d0)) *)
  unfold update2_table at 1 in |- *.
(* Goal: @eq Z (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (change_x0y0 Site Site Data eq_site_dec eq_site_dec t a s1 d0 a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (update2_table Site eq_site_dec Data t a s1 d0 s))))) (Z.add (Z.sub (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (t a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (t s))))) (f a s1 (t a s1))) (f a s1 d0)) *)
(* Goal: forall _ : not (@eq Site s0 a), @eq Z (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (update2_table Site eq_site_dec Data t s0 s1 d0 a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (update2_table Site eq_site_dec Data t s0 s1 d0 s))))) (Z.add (Z.sub (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (t a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (t s))))) (f s0 s1 (t s0 s1))) (f s0 s1 d0)) *)
  unfold change_x0y0 in |- *.
(* Goal: @eq Z (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (change_x0 Site (forall _ : Site, Data) eq_site_dec t a (change_x0 Site Data eq_site_dec (t a) s1 d0) a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (update2_table Site eq_site_dec Data t a s1 d0 s))))) (Z.add (Z.sub (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (t a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (t s))))) (f a s1 (t a s1))) (f a s1 d0)) *)
(* Goal: forall _ : not (@eq Site s0 a), @eq Z (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (update2_table Site eq_site_dec Data t s0 s1 d0 a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (update2_table Site eq_site_dec Data t s0 s1 d0 s))))) (Z.add (Z.sub (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (t a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (t s))))) (f s0 s1 (t s0 s1))) (f s0 s1 d0)) *)
  unfold change_x0 at 1 in |- *.
(* Goal: @eq Z (if eq_site_dec s1 s1 then Z0 else f0 s0 s1 (t s0 s1)) Z0 *)
(* Goal: only_once Site eq_site_dec s0 LS1 *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
(* Goal: only_once Site eq_site_dec s0 LS1 *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  rewrite case_eq.
(* Goal: @eq Z (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (change_x0 Site Data eq_site_dec (t a) s1 d0))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (update2_table Site eq_site_dec Data t a s1 d0 s))))) (Z.add (Z.sub (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (t a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (t s))))) (f a s1 (t a s1))) (f a s1 d0)) *)
(* Goal: forall _ : not (@eq Site s0 a), @eq Z (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (update2_table Site eq_site_dec Data t s0 s1 d0 a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (update2_table Site eq_site_dec Data t s0 s1 d0 s))))) (Z.add (Z.sub (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (t a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (t s))))) (f s0 s1 (t s0 s1))) (f s0 s1 d0)) *)
  apply add_reduce2.
(* Goal: @eq Z (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (change_x0 Site Data eq_site_dec (t a) s1 d0))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (update2_table Site eq_site_dec Data t a s1 d0 s))))) (Z.add (Z.sub (Z.add (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (t s)))) (Z_id Site a (sigma_table Site LS2 Data (f a) (t a)))) (f a s1 (t a s1))) (f a s1 d0)) *)
(* Goal: forall _ : not (@eq Site s0 a), @eq Z (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (update2_table Site eq_site_dec Data t s0 s1 d0 a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (update2_table Site eq_site_dec Data t s0 s1 d0 s))))) (Z.add (Z.sub (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (t a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (t s))))) (f s0 s1 (t s0 s1))) (f s0 s1 d0)) *)
  generalize (sigma_table_change Site eq_site_dec LS2 Data (t a) s1 d0 (f a)).
(* Goal: forall _ : forall _ : only_once Site eq_site_dec s1 LS2, @eq Z (sigma_table Site LS2 Data (f a) (update_table Site eq_site_dec Data (t a) s1 d0)) (Z.add (Z.sub (sigma_table Site LS2 Data (f a) (t a)) (f a s1 (t a s1))) (f a s1 d0)), @eq Z (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (change_x0 Site Data eq_site_dec (t a) s1 d0))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (update2_table Site eq_site_dec Data t a s1 d0 s))))) (Z.add (Z.sub (Z.add (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (t s)))) (Z_id Site a (sigma_table Site LS2 Data (f a) (t a)))) (f a s1 (t a s1))) (f a s1 d0)) *)
(* Goal: forall _ : not (@eq Site s0 a), @eq Z (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (update2_table Site eq_site_dec Data t s0 s1 d0 a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (update2_table Site eq_site_dec Data t s0 s1 d0 s))))) (Z.add (Z.sub (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (t a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (t s))))) (f s0 s1 (t s0 s1))) (f s0 s1 d0)) *)
  unfold update_table at 1 in |- *.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: forall _ : not (@In Site s0 l), @eq Z (sigma Site LS2 (fun s : Site => f x s (t x s))) (sigma_but Site s1 eq_site_dec LS2 (fun s : Site => f x s (t x s))) *)
(* Goal: forall _ : only_once Site eq_site_dec s0 l, @eq Z (sigma Site LS2 (fun s : Site => f x s (t x s))) (sigma_but Site s1 eq_site_dec LS2 (fun s : Site => f x s (t x s))) *)
(* Goal: forall _ : not (@eq Site x s0), @eq Z (sigma Site LS2 (fun s : Site => f x s (t x s))) (sigma Site LS2 (fun s : Site => f x s (t x s))) *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
(* Goal: not (@In Site a l) *)
(* Goal: not (@In Site a l) *)
(* Goal: forall _ : not (@eq Site a s0), @eq Z (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  intro H3.
(* Goal: @eq Z (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (change_x0 Site Data eq_site_dec (t a) s1 d0))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (update2_table Site eq_site_dec Data t a s1 d0 s))))) (Z.add (Z.sub (Z.add (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (t s)))) (Z_id Site a (sigma_table Site LS2 Data (f a) (t a)))) (f a s1 (t a s1))) (f a s1 d0)) *)
(* Goal: forall _ : not (@eq Site s0 a), @eq Z (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (update2_table Site eq_site_dec Data t s0 s1 d0 a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (update2_table Site eq_site_dec Data t s0 s1 d0 s))))) (Z.add (Z.sub (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (t a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (t s))))) (f s0 s1 (t s0 s1))) (f s0 s1 d0)) *)
  rewrite H3.
  replace
   (sigma Site l
      (fun s : Site =>
       Z_id Site s
         (sigma_table Site LS2 Data (f s)
            (update2_table Site eq_site_dec Data t a s1 d0 s)))) with
   (sigma Site l (fun s : Site => sigma_table Site LS2 Data (f s) (t s))).
(* Goal: @eq Z (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold Z_id in |- *.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0)))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  omega.
  
(* Goal: @eq Z (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply sigma_simpl.
(* Goal: forall (x : Site) (_ : @In Site x l), @eq Z (sigma_table Site LS2 Data (f x) (t x)) (Z_id Site x (sigma_table Site LS2 Data (f x) (update2_table Site eq_site_dec Data t a s1 d0 x))) *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
(* Goal: forall _ : not (@eq Site s0 a), @eq Z (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (update2_table Site eq_site_dec Data t s0 s1 d0 a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (update2_table Site eq_site_dec Data t s0 s1 d0 s))))) (Z.add (Z.sub (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (t a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (t s))))) (f s0 s1 (t s0 s1))) (f s0 s1 d0)) *)
  intros x H4.
(* Goal: @eq Z (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold Z_id in |- *.
(* Goal: @eq Z (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f0 s1) (t0 s1))) (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f3 s1) (t0 s1))) *)
  apply sigma_table_simpl.
(* Goal: @eq (forall _ : Site, Data) (t a) (update2_table Site eq_site_dec Data t s0 s1 d0 a) *)
(* Goal: only_once Site eq_site_dec s0 l *)
  unfold update2_table in |- *.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold change_x0y0 in |- *; simpl in |- *.
(* Goal: @eq (forall _ : Site, Data) (t a) (change_x0 Site (forall _ : Site, Data) eq_site_dec t s0 (change_x0 Site Data eq_site_dec (t s0) s1 d0) a) *)
(* Goal: only_once Site eq_site_dec s0 l *)
  rewrite elsewhere.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: @eq Z (sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t1 a)) (sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t2 a)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  generalize H2.
(* Goal: forall _ : if eq_site_dec s0 a then not (@In Site s0 l) else only_once Site eq_site_dec s0 l, not (@eq Site a x) *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
(* Goal: forall _ : not (@eq Site s0 a), @eq Z (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (update2_table Site eq_site_dec Data t s0 s1 d0 a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (update2_table Site eq_site_dec Data t s0 s1 d0 s))))) (Z.add (Z.sub (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (t a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (t s))))) (f s0 s1 (t s0 s1))) (f s0 s1 d0)) *)
  unfold only_once in |- *.
(* Goal: forall _ : if eq_site_dec s0 a then not (@In Site s0 l) else only_once Site eq_site_dec s0 l, only_once Site eq_site_dec s0 l *)
  case (eq_site_dec s0 a).
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : not (@In Site s0 l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  rewrite e.
(* Goal: forall _ : @eq Site a a, @eq Z (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  intro e0.
(* Goal: @eq Z (if eq_site_dec a0 s1 then sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)) else Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (if eq_site_dec a0 s1 then sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)) else Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  generalize H4.
(* Goal: forall (_ : @In Site x l) (_ : not (@In Site a l)), not (@eq Site a x) *)
(* Goal: forall (_ : not (@eq Site s0 a)) (_ : (fix only_once (x : Site) (l : list Site) {struct l} : Prop := match l with | nil => False | cons y l' => if eq_site_dec x y then not (@In Site x l') else only_once x l' end) s0 l), not (@eq Site a x) *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
(* Goal: forall _ : not (@eq Site s0 a), @eq Z (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (update2_table Site eq_site_dec Data t s0 s1 d0 a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (update2_table Site eq_site_dec Data t s0 s1 d0 s))))) (Z.add (Z.sub (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (t a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (t s))))) (f s0 s1 (t s0 s1))) (f s0 s1 d0)) *)
  exact (equality_from_membership Site eq_site_dec a x l).
  
(* Goal: forall (_ : @eq Site s0 a) (_ : not (@In Site s0 l)), only_once Site eq_site_dec s0 l *)
(* Goal: forall (_ : not (@eq Site s0 a)) (_ : only_once Site eq_site_dec s0 l), only_once Site eq_site_dec s0 l *)
  intuition.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  intro n.
(* Goal: @eq Z (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (update2_table Site eq_site_dec Data t s0 s1 d0 a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (update2_table Site eq_site_dec Data t s0 s1 d0 s))))) (Z.add (Z.sub (Z.add (Z_id Site a (sigma_table Site LS2 Data (f a) (t a))) (sigma Site l (fun s : Site => Z_id Site s (sigma_table Site LS2 Data (f s) (t s))))) (f s0 s1 (t s0 s1))) (f s0 s1 d0)) *)
  rewrite H1.
(* Goal: @eq Z (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold Z_id in |- *.
  replace
   (sigma_table Site LS2 Data (f a)
      (update2_table Site eq_site_dec Data t s0 s1 d0 a)) with
   (sigma_table Site LS2 Data (f a) (t a)).
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0)))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  omega.
  
(* Goal: @eq Z (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f0 s1) (t0 s1))) (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f3 s1) (t0 s1))) *)
  apply sigma_table_simpl.
(* Goal: @eq (forall _ : Site, Data) (t a) (update2_table Site eq_site_dec Data t s0 s1 d0 a) *)
(* Goal: only_once Site eq_site_dec s0 l *)
  unfold update2_table in |- *.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold change_x0y0 in |- *; simpl in |- *.
(* Goal: @eq (forall _ : Site, Data) (t a) (change_x0 Site (forall _ : Site, Data) eq_site_dec t s0 (change_x0 Site Data eq_site_dec (t s0) s1 d0) a) *)
(* Goal: only_once Site eq_site_dec s0 l *)
  rewrite elsewhere.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: @eq Z (sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t1 a)) (sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t2 a)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  generalize H2.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: forall _ : if eq_site_dec s0 a then not (@In Site s0 l) else only_once Site eq_site_dec s0 l, only_once Site eq_site_dec s0 l *)
  case (eq_site_dec s0 a).
(* Goal: forall (_ : @eq Site s0 a) (_ : not (@In Site s0 l)), only_once Site eq_site_dec s0 l *)
(* Goal: forall (_ : not (@eq Site s0 a)) (_ : only_once Site eq_site_dec s0 l), only_once Site eq_site_dec s0 l *)
  intuition.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
Qed.

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.
Proof.
(* Goal: forall (t : forall (_ : Site) (_ : Site), Data) (f1 f2 : forall (_ : Site) (_ : Site) (_ : Data), Z) (_ : forall (s1 s2 : Site) (d : Data) (_ : @eq Data (t s1 s2) d), @eq Z (f1 s1 s2 d) (f2 s1 s2 d)), @eq Z (sigma2_table Site LS1 LS2 Data f1 t) (sigma2_table Site LS1 LS2 Data f2 t) *)
  intros t0 f0 f3 H.
(* Goal: forall _ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_table Site l LS2 Data f t) (Z.add (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f t) (f s0 s1 (t s0 s1))), @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (f s0 s1 (t s0 s1))) *)
  unfold sigma2_table in |- *.
(* Goal: @eq Z (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f0 s1) (t0 s1))) (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f3 s1) (t0 s1))) *)
  apply sigma_table_simpl.
(* Goal: @eq (forall _ : Site, Z) (fun s1 : Site => sigma_table Site LS2 Data (f1' s1) (t0 s1)) (fun s1 : Site => sigma_table Site LS2 Data (f2' s1) (t0 s1)) *)
(* Goal: forall d : Site, P t0 s1 d *)
  apply funct_eq.
(* Goal: forall e : Site, @eq Z (sigma_table Site LS2 Data (f1' e) (t0 e)) (sigma_table Site LS2 Data (f2' e) (t0 e)) *)
(* Goal: forall d : Site, P t0 s1 d *)
  intros e.
(* Goal: @eq Z (sigma_table Site LS2 Data (f1' e) (t0 e)) (sigma_table Site LS2 Data (f2' e) (t0 e)) *)
(* Goal: forall d : Site, P t0 s1 d *)
  apply sigma_table_simpl2.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
Qed.

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.
Proof.
(* Goal: forall (t : forall (_ : Site) (_ : Site), Data) (f1 f2 : forall (_ : Site) (_ : Site) (_ : Data), Z) (_ : forall (s1 s2 : Site) (d : Data) (_ : @eq Data (t s1 s2) d), @eq Z (f1 s1 s2 d) (f2 s1 s2 d)), @eq Z (sigma2_table Site LS1 LS2 Data f1 t) (sigma2_table Site LS1 LS2 Data f2 t) *)
  intros t0 f0 f3 H.
(* Goal: forall _ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_table Site l LS2 Data f t) (Z.add (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f t) (f s0 s1 (t s0 s1))), @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (f s0 s1 (t s0 s1))) *)
  unfold sigma2_table in |- *.
(* Goal: @eq Z (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f0 s1) (t0 s1))) (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f3 s1) (t0 s1))) *)
  apply sigma_table_simpl.
(* Goal: @eq (forall _ : Site, Z) (fun s1 : Site => sigma_table Site LS2 Data (f1' s1) (t0 s1)) (fun s1 : Site => sigma_table Site LS2 Data (f2' s1) (t0 s1)) *)
(* Goal: forall d : Site, P t0 s1 d *)
  apply funct_eq.
(* Goal: forall e : Site, @eq Z (sigma_table Site LS2 Data (f1' e) (t0 e)) (sigma_table Site LS2 Data (f2' e) (t0 e)) *)
(* Goal: forall d : Site, P t0 s1 d *)
  intros e.
(* Goal: @eq Z (sigma_table Site LS2 Data (f0 e) (t0 e)) (sigma_table Site LS2 Data (f3 e) (t0 e)) *)
  apply sigma_table_simpl2_partial.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
Qed.



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.
Proof.
(* Goal: forall (t : forall (_ : Site) (_ : Site), Data) (P : forall (_ : forall (_ : Site) (_ : Site), Data) (_ : Site) (_ : Site), Set) (f1 f2 : forall (_ : Site) (_ : Site) (_ : Data), Z) (_ : forall (s1 s2 : Site) (d : Data) (_ : P t s1 s2), @eq Z (f1 s1 s2 d) (f2 s1 s2 d)) (_ : forall s1 s2 : Site, P t s1 s2), @eq Z (sigma2_table Site LS1 LS2 Data f1 t) (sigma2_table Site LS1 LS2 Data f2 t) *)
  intros t0 P f1' f2' H.
(* Goal: forall _ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_table Site l LS2 Data f t) (Z.add (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f t) (f s0 s1 (t s0 s1))), @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (f s0 s1 (t s0 s1))) *)
  unfold sigma2_table in |- *.
(* Goal: forall _ : forall s1 s2 : Site, P t0 s1 s2, @eq Z (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f1' s1) (t0 s1))) (sigma_table Site LS1 Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f2' s1) (t0 s1))) *)
  intro H0.
  apply
   sigma_table_simpl_property
    with (P := fun (t : Site -> Z) (s2 : Site) => P t0 s1 s2).
(* Goal: forall _ : forall d : Site, P t0 s1 d, @eq (forall _ : Site, Z) (fun s1 : Site => sigma_table Site LS2 Data (f1' s1) (t0 s1)) (fun s1 : Site => sigma_table Site LS2 Data (f2' s1) (t0 s1)) *)
(* Goal: forall d : Site, P t0 s1 d *)
  intros H1.
(* Goal: @eq (forall _ : Site, Z) (fun s1 : Site => sigma_table Site LS2 Data (f1' s1) (t0 s1)) (fun s1 : Site => sigma_table Site LS2 Data (f2' s1) (t0 s1)) *)
(* Goal: forall d : Site, P t0 s1 d *)
  apply funct_eq.
(* Goal: forall e : Site, @eq Z (sigma_table Site LS2 Data (f1' e) (t0 e)) (sigma_table Site LS2 Data (f2' e) (t0 e)) *)
(* Goal: forall d : Site, P t0 s1 d *)
  intros e.
(* Goal: @eq Z (sigma_table Site LS2 Data (f1' e) (t0 e)) (sigma_table Site LS2 Data (f2' e) (t0 e)) *)
(* Goal: forall d : Site, P t0 s1 d *)
  apply sigma_table_simpl2.
(* Goal: forall (s : Site) (d : Data), @eq Z (f1' e s d) (f2' e s d) *)
(* Goal: forall d : Site, P t0 s1 d *)
  intros s d.
(* Goal: @eq Z (f0 a x (t1 a x)) (f0 a x (t2 a x)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply H.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
Qed.


End SIGMA_TABLE3.

Section SIGMA2_BUT.

Variable Site : Set. 
Hypothesis eq_site_dec : eq_dec Site. 
Variable LS0 : list 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 -> Site -> Data -> Z.


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.

Proof.
(* Goal: forall q : queue Data, @eq Z (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) *)
  elim LS0.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: forall _ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_table Site l LS2 Data f t) (Z.add (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f t) (f s0 s1 (t s0 s1))), @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (f s0 s1 (t s0 s1))) *)
  unfold sigma2_table in |- *.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma_table Site l 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))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold sigma_table in |- *.
(* Goal: @eq Z Z0 (sigma Site LS1 (fun _ : Site => Z0)) *)
(* Goal: forall (a : Site) (l : list Site) (_ : @eq Z (sigma_but Site s0 eq_site_dec l (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 l (fun s : Site => f s s1 s2 d)) t)), @eq Z (sigma_but Site s0 eq_site_dec (@cons Site a l) (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 (@cons Site a l) (fun s : Site => f s s1 s2 d)) t) *)
  rewrite sigma_null.
(* Goal: @eq Z (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold Z_id in |- *.
(* Goal: @eq Z Z0 (sigma Site LS1 (fun _ : Site => Z0)) *)
(* Goal: forall (a : Site) (l : list Site) (_ : @eq Z (sigma_but Site s0 eq_site_dec l (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 l (fun s : Site => f s s1 s2 d)) t)), @eq Z (sigma_but Site s0 eq_site_dec (@cons Site a l) (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 (@cons Site a l) (fun s : Site => f s s1 s2 d)) t) *)
  rewrite sigma_null.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: forall (a : Site) (l : list Site) (_ : @eq Z (sigma_but Site s0 eq_site_dec l (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 l (fun s : Site => f s s1 s2 d)) t)), @eq Z (sigma_but Site s0 eq_site_dec (@cons Site a l) (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 (@cons Site a l) (fun s : Site => f s s1 s2 d)) t) *)
  intros a l H.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: @eq Z (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  case (eq_site_dec a s0).
(* Goal: forall _ : @eq E a x, Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
(* Goal: forall _ : not (@eq E a x), Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
  intro e.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  intro n.
(* Goal: @eq Z (Z.add Z0 (sigma_but Site owner eq_site_dec l0 f0)) Z0 *)
(* Goal: not (@eq Site a owner) *)
  rewrite H.
(* Goal: @eq Z (Z.add (sigma2_table Site LS1 LS2 Data (f a) t) (sigma2_table Site LS1 LS2 Data (fun (s1 s2 : Site) (d : Data) => sigma_but Site s0 eq_site_dec l (fun s : Site => f s s1 s2 d)) t)) (sigma2_table Site LS1 LS2 Data (fun (s1 s2 : Site) (d : Data) => Z.add (f a s1 s2 d) (sigma_but Site s0 eq_site_dec l (fun s : Site => f s s1 s2 d))) t) *)
  rewrite <- sigma2_disjoint.
(* Goal: @eq Z (sigma2_table Site LS1 LS2 Data (fun_sum_site2 Site Data (f a) (fun (s1 s2 : Site) (d : Data) => sigma_but Site s0 eq_site_dec l (fun s : Site => f s s1 s2 d))) t) (sigma2_table Site LS1 LS2 Data (fun (s1 s2 : Site) (d : Data) => Z.add (f a s1 s2 d) (sigma_but Site s0 eq_site_dec l (fun s : Site => f s s1 s2 d))) t) *)
  unfold fun_sum_site2 in |- *.
(* Goal: @eq Z (sigma2_table Site LS1 LS2 Data (fun s1 : Site => fun_sum_site Site Data (fun (s2 : Site) (a0 : Data) => f a s1 s2 a0) (fun (s2 : Site) (a : Data) => sigma_but Site s0 eq_site_dec l (fun s : Site => f s s1 s2 a))) t) (sigma2_table Site LS1 LS2 Data (fun (s1 s2 : Site) (d : Data) => Z.add (f a s1 s2 d) (sigma_but Site s0 eq_site_dec l (fun s : Site => f s s1 s2 d))) t) *)
  unfold fun_sum_site in |- *.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
Qed.


End SIGMA2_BUT.

Section SIGMA_BUT.

Variable Site : Set. 

Hypothesis eq_site_dec : eq_dec Site. 
Variable LS0 : list Site.
Variable LS1 : list Site.
Variable LS2 : list Site.


Variable Data : Set.
Let Table := Site -> Data.

Variable t : Table.
Variable s s0 s1 owner : Site.
Variable s2 : Site.
Variable d0 : Data.

Variable f : Site -> Site -> Site -> Data -> Z.

Variable pred : Data -> bool.

Variable
  decidable_predicate : forall a : Data, {pred a = true} + {pred a = false}.

Lemma decidable_pred_pred :
 forall a : Data,
 {fun_or Data pred pred a = true} + {fun_or Data pred pred a = false}.

Proof.
(* Goal: forall a : Data, sumbool (@eq bool (fun_or Data pred pred a) true) (@eq bool (fun_or Data pred pred a) false) *)
  unfold fun_or in |- *.
(* Goal: forall a : Data, sumbool (@eq bool (orb (pred a) (pred a)) true) (@eq bool (orb (pred a) (pred a)) false) *)
  intro a.
(* Goal: sumbool (@eq bool (orb (pred a) (pred a)) true) (@eq bool (orb (pred a) (pred a)) false) *)
  generalize (decidable_predicate a).
(* Goal: forall _ : sumbool (@eq bool (pred a) true) (@eq bool (pred a) false), sumbool (@eq bool (orb (pred a) (pred a)) true) (@eq bool (orb (pred a) (pred a)) false) *)
  intro H.
(* Goal: sumbool (@eq bool (orb (pred a) (pred a)) true) (@eq bool (orb (pred a) (pred a)) false) *)
  elim H.
(* Goal: forall _ : @eq bool (pred a) false, sumbool (@eq bool (orb (pred a) (pred a)) true) (@eq bool (orb (pred a) (pred a)) false) *)
  intro y.
(* Goal: sumbool (@eq bool (orb (pred a) (pred a)) true) (@eq bool (orb (pred a) (pred a)) false) *)
  rewrite y.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: forall _ : @eq bool (pred a) false, sumbool (@eq bool (orb (pred a) (pred a)) true) (@eq bool (orb (pred a) (pred a)) false) *)
  intro y.
(* Goal: sumbool (@eq bool (orb (pred a) (pred a)) true) (@eq bool (orb (pred a) (pred a)) false) *)
  rewrite y.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
Qed.


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.


Proof.
(* Goal: forall q : queue Data, @eq Z (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) *)
  elim LS0.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: forall q : queue Data, @eq Z Z0 (reduce Data (fun _ : Data => Z0) q) *)
(* Goal: forall (a : Site) (l : list Site) (_ : forall q : queue Data, @eq Z (sigma_but Site owner eq_site_dec l (fun s : Site => reduce Data (f s s1 s2) q)) (reduce Data (fun d : Data => sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d)) q)) (q : queue Data), @eq Z (sigma_but Site owner eq_site_dec (@cons Site a l) (fun s : Site => reduce Data (f s s1 s2) q)) (reduce Data (fun d : Data => sigma_but Site owner eq_site_dec (@cons Site a l) (fun s : Site => f s s1 s2 d)) q) *)
  intro q.
(* Goal: @eq Z Z0 (reduce Data (fun _ : Data => Z0) q) *)
(* Goal: forall (a : Site) (l : list Site) (_ : forall q : queue Data, @eq Z (sigma_but Site owner eq_site_dec l (fun s : Site => reduce Data (f s s1 s2) q)) (reduce Data (fun d : Data => sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d)) q)) (q : queue Data), @eq Z (sigma_but Site owner eq_site_dec (@cons Site a l) (fun s : Site => reduce Data (f s s1 s2) q)) (reduce Data (fun d : Data => sigma_but Site owner eq_site_dec (@cons Site a l) (fun s : Site => f s s1 s2 d)) q) *)
  rewrite reduce_null_fun.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: forall (a : Site) (l : list Site) (_ : forall q : queue Data, @eq Z (sigma_but Site owner eq_site_dec l (fun s : Site => reduce Data (f s s1 s2) q)) (reduce Data (fun d : Data => sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d)) q)) (q : queue Data), @eq Z (sigma_but Site owner eq_site_dec (@cons Site a l) (fun s : Site => reduce Data (f s s1 s2) q)) (reduce Data (fun d : Data => sigma_but Site owner eq_site_dec (@cons Site a l) (fun s : Site => f s s1 s2 d)) q) *)
  intros a l H q.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: @eq Z (Z.add Z0 (sigma_but Site owner eq_site_dec l0 f0)) Z0 *)
(* Goal: not (@eq Site a owner) *)
  rewrite H.
(* Goal: @eq Z (Z.add (reduce Data (f a s1 s2) q) (reduce Data (fun d : Data => sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d)) q)) (reduce Data (fun d : Data => Z.add (f a s1 s2 d) (sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d))) q) *)
  rewrite <- disjoint_reduce.
(* Goal: @eq Z (reduce Data (fun_sum Data (f a s1 s2) (fun d : Data => sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d))) q) (reduce Data (fun d : Data => Z.add (f a s1 s2 d) (sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d))) q) *)
  unfold fun_sum in |- *.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
Qed.

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.


Proof.
(* Goal: forall q : queue Data, @eq Z (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) *)
  elim LS0.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: forall q : queue Data, @eq Z Z0 (reduce Data (fun _ : Data => Z0) q) *)
(* Goal: forall (a : Site) (l : list Site) (_ : forall q : queue Data, @eq Z (sigma_but Site owner eq_site_dec l (fun s : Site => reduce Data (f s s1 s2) q)) (reduce Data (fun d : Data => sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d)) q)) (q : queue Data), @eq Z (sigma_but Site owner eq_site_dec (@cons Site a l) (fun s : Site => reduce Data (f s s1 s2) q)) (reduce Data (fun d : Data => sigma_but Site owner eq_site_dec (@cons Site a l) (fun s : Site => f s s1 s2 d)) q) *)
  intro q.
(* Goal: @eq Z Z0 (reduce Data (fun _ : Data => Z0) q) *)
(* Goal: forall (a : Site) (l : list Site) (_ : forall q : queue Data, @eq Z (sigma_but Site owner eq_site_dec l (fun s : Site => reduce Data (f s s1 s2) q)) (reduce Data (fun d : Data => sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d)) q)) (q : queue Data), @eq Z (sigma_but Site owner eq_site_dec (@cons Site a l) (fun s : Site => reduce Data (f s s1 s2) q)) (reduce Data (fun d : Data => sigma_but Site owner eq_site_dec (@cons Site a l) (fun s : Site => f s s1 s2 d)) q) *)
  rewrite reduce_null_fun.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: forall (a : Site) (l : list Site) (_ : forall q : queue Data, @eq Z (sigma_but Site owner eq_site_dec l (fun s : Site => reduce Data (f s s1 s2) q)) (reduce Data (fun d : Data => sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d)) q)) (q : queue Data), @eq Z (sigma_but Site owner eq_site_dec (@cons Site a l) (fun s : Site => reduce Data (f s s1 s2) q)) (reduce Data (fun d : Data => sigma_but Site owner eq_site_dec (@cons Site a l) (fun s : Site => f s s1 s2 d)) q) *)
  intros a l H q.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: @eq Z (Z.add Z0 (sigma_but Site owner eq_site_dec l0 f0)) Z0 *)
(* Goal: not (@eq Site a owner) *)
  rewrite H.
(* Goal: @eq Z (Z.add (reduce Data (f a s1 s2) q) (reduce Data (fun d : Data => sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d)) q)) (reduce Data (fun d : Data => Z.add (f a s1 s2 d) (sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d))) q) *)
  rewrite <- disjoint_reduce.
(* Goal: @eq Z (reduce Data (fun_sum Data (f a s1 s2) (fun d : Data => sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d))) q) (reduce Data (fun d : Data => Z.add (f a s1 s2 d) (sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d))) q) *)
  unfold fun_sum in |- *.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
Qed.


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.

Proof.
(* Goal: forall q : queue Data, @eq Z (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) *)
  elim LS0.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: forall q : queue Data, @eq Z Z0 (reduce Data (fun _ : Data => Z0) q) *)
(* Goal: forall (a : Site) (l : list Site) (_ : forall q : queue Data, @eq Z (sigma_but Site owner eq_site_dec l (fun s : Site => reduce Data (f s s1 s2) q)) (reduce Data (fun d : Data => sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d)) q)) (q : queue Data), @eq Z (sigma_but Site owner eq_site_dec (@cons Site a l) (fun s : Site => reduce Data (f s s1 s2) q)) (reduce Data (fun d : Data => sigma_but Site owner eq_site_dec (@cons Site a l) (fun s : Site => f s s1 s2 d)) q) *)
  intro q.
(* Goal: @eq Z Z0 (reduce Data (fun _ : Data => Z0) q) *)
(* Goal: forall (a : Site) (l : list Site) (_ : forall q : queue Data, @eq Z (sigma_but Site owner eq_site_dec l (fun s : Site => reduce Data (f s s1 s2) q)) (reduce Data (fun d : Data => sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d)) q)) (q : queue Data), @eq Z (sigma_but Site owner eq_site_dec (@cons Site a l) (fun s : Site => reduce Data (f s s1 s2) q)) (reduce Data (fun d : Data => sigma_but Site owner eq_site_dec (@cons Site a l) (fun s : Site => f s s1 s2 d)) q) *)
  rewrite reduce_null_fun.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: forall (a : Site) (l : list Site) (_ : forall q : queue Data, @eq Z (sigma_but Site owner eq_site_dec l (fun s : Site => reduce Data (f s s1 s2) q)) (reduce Data (fun d : Data => sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d)) q)) (q : queue Data), @eq Z (sigma_but Site owner eq_site_dec (@cons Site a l) (fun s : Site => reduce Data (f s s1 s2) q)) (reduce Data (fun d : Data => sigma_but Site owner eq_site_dec (@cons Site a l) (fun s : Site => f s s1 s2 d)) q) *)
  intros a l H q.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: @eq Z (if eq_site_dec a owner then sigma_but Site owner eq_site_dec l0 f1 else Z.add (f1 a) (sigma_but Site owner eq_site_dec l0 f1)) (if eq_site_dec a owner then sigma_but Site owner eq_site_dec l0 f2 else Z.add (f2 a) (sigma_but Site owner eq_site_dec l0 f2)) *)
  case (eq_site_dec a owner).
(* Goal: forall _ : @eq E a x, Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
(* Goal: forall _ : not (@eq E a x), Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
  intro e.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  intro n.
(* Goal: @eq Z (Z.add Z0 (sigma_but Site owner eq_site_dec l0 f0)) Z0 *)
(* Goal: not (@eq Site a owner) *)
  rewrite H.
(* Goal: @eq Z (Z.add (reduce Data (f a s1 s2) q) (reduce Data (fun d : Data => sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d)) q)) (reduce Data (fun d : Data => Z.add (f a s1 s2 d) (sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d))) q) *)
  rewrite <- disjoint_reduce.
(* Goal: @eq Z (reduce Data (fun_sum Data (f a s1 s2) (fun d : Data => sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d))) q) (reduce Data (fun d : Data => Z.add (f a s1 s2 d) (sigma_but Site owner eq_site_dec l (fun s : Site => f s s1 s2 d))) q) *)
  unfold fun_sum in |- *.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
Qed.


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.
Proof.
(* Goal: forall (f1 f2 : forall _ : Site, Z) (l : list Site) (_ : forall (s : Site) (_ : not (@eq Site s owner)), @eq Z (f1 s) (f2 s)), @eq Z (sigma_but Site owner eq_site_dec l f1) (sigma_but Site owner eq_site_dec l f2) *)
  simple induction l.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: forall (a : Site) (l : list Site) (_ : forall _ : forall (s : Site) (_ : not (@eq Site s owner)), @eq Z (f1 s) (f2 s), @eq Z (sigma_but Site owner eq_site_dec l f1) (sigma_but Site owner eq_site_dec l f2)) (_ : forall (s : Site) (_ : not (@eq Site s owner)), @eq Z (f1 s) (f2 s)), @eq Z (sigma_but Site owner eq_site_dec (@cons Site a l) f1) (sigma_but Site owner eq_site_dec (@cons Site a l) f2) *)
  intros a l0 H H0.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: @eq Z (if eq_site_dec a owner then sigma_but Site owner eq_site_dec l0 f1 else Z.add (f1 a) (sigma_but Site owner eq_site_dec l0 f1)) (if eq_site_dec a owner then sigma_but Site owner eq_site_dec l0 f2 else Z.add (f2 a) (sigma_but Site owner eq_site_dec l0 f2)) *)
  case (eq_site_dec a owner).
(* Goal: forall _ : @eq E a x, Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
(* Goal: forall _ : not (@eq E a x), Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
  intro e.
(* Goal: @eq Z (f0 a x (t1 a x)) (f0 a x (t2 a x)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply H.
(* Goal: forall (s : Site) (_ : not (@eq Site s owner)), @eq Z (f0 s) Z0 *)
(* Goal: not (@eq Site a owner) *)
  exact H0.
  
(* Goal: forall _ : not (@eq Site a owner), @eq Z (Z.add (f0 a) (sigma_but Site owner eq_site_dec l0 f0)) Z0 *)
  intros n.
(* Goal: @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))))) (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) *)
  rewrite H0.
(* Goal: @eq Z (Z.add Z0 (sigma_but Site owner eq_site_dec l0 f0)) Z0 *)
(* Goal: not (@eq Site a owner) *)
  rewrite H.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: forall (s : Site) (_ : not (@eq Site s owner)), @eq Z (f0 s) Z0 *)
(* Goal: not (@eq Site a owner) *)
  exact H0.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
Qed.

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.
Proof.
(* Goal: forall (f1 f2 : forall _ : Site, Z) (l : list Site) (_ : forall (s : Site) (_ : not (@eq Site s owner)), @eq Z (f1 s) (f2 s)), @eq Z (sigma_but Site owner eq_site_dec l f1) (sigma_but Site owner eq_site_dec l f2) *)
  simple induction l.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
(* Goal: forall (a : Site) (l : list Site) (_ : forall _ : forall (s : Site) (_ : not (@eq Site s owner)), @eq Z (f1 s) (f2 s), @eq Z (sigma_but Site owner eq_site_dec l f1) (sigma_but Site owner eq_site_dec l f2)) (_ : forall (s : Site) (_ : not (@eq Site s owner)), @eq Z (f1 s) (f2 s)), @eq Z (sigma_but Site owner eq_site_dec (@cons Site a l) f1) (sigma_but Site owner eq_site_dec (@cons Site a l) f2) *)
  intros a l0 H H0.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: @eq Z (if eq_site_dec a owner then sigma_but Site owner eq_site_dec l0 f1 else Z.add (f1 a) (sigma_but Site owner eq_site_dec l0 f1)) (if eq_site_dec a owner then sigma_but Site owner eq_site_dec l0 f2 else Z.add (f2 a) (sigma_but Site owner eq_site_dec l0 f2)) *)
  case (eq_site_dec a owner).
(* Goal: @eq Z (f0 a x (t1 a x)) (f0 a x (t2 a x)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  intro; apply H.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
(* Goal: @eq Z (Z.add Z0 (sigma_but Site owner eq_site_dec l0 f0)) Z0 *)
(* Goal: not (@eq Site a owner) *)
  intro; rewrite H.
(* Goal: @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))))) (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) *)
  rewrite H0.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
Qed.

End SIGMA_BUT.


Section positive.

Variable E : Set.

Hypothesis eq_E_dec : eq_dec E.

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.
Proof.
(* Goal: forall (f : forall _ : E, Z) (x : E) (l : list E) (_ : @In E x l) (_ : not (@eq E x x0)) (_ : forall y : E, Z.ge (f y) Z0) (_ : Z.gt (f x) Z0), Z.gt (sigma_but E x0 eq_E_dec l f) Z0 *)
  intros f x l.
(* Goal: forall (_ : @In E x l) (_ : not (@eq E x x0)) (_ : forall y : E, Z.ge (f y) Z0) (_ : Z.gt (f x) Z0), Z.gt (sigma_but E x0 eq_E_dec l f) Z0 *)
  elim l.
(* Goal: forall (_ : @eq Site s0 a) (_ : not (@In Site s0 l)), only_once Site eq_site_dec s0 l *)
(* Goal: forall (_ : not (@eq Site s0 a)) (_ : only_once Site eq_site_dec s0 l), only_once Site eq_site_dec s0 l *)
  simpl in |- *; intuition.
  
(* Goal: forall (a : E) (l : list E) (_ : forall (_ : @In E x l) (_ : forall y : E, Z.ge (f y) Z0) (_ : Z.gt (f x) Z0), Z.gt (sigma E l f) Z0) (_ : @In E x (@cons E a l)) (_ : forall y : E, Z.ge (f y) Z0) (_ : Z.gt (f x) Z0), Z.gt (sigma E (@cons E a l) f) Z0 *)
  intros a l0 H H0 H1 H2.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
  case (eq_E_dec a x).
(* Goal: forall _ : @eq E a x, Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
(* Goal: forall _ : not (@eq E a x), Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
  intro e.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : not (@In Site s0 l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  rewrite e.
(* Goal: Z.gt (Z.add (f x) (sigma E l0 f)) Z0 *)
(* Goal: forall _ : not (@eq E a x), Z.gt (Z.add (f a) (sigma E l0 f)) Z0 *)
  generalize (sigma_pos E f l0 H1).
(* Goal: forall _ : not (@In Site s0 l), @eq Z (sigma Site LS2 (fun s : Site => f x s (t x s))) (sigma_but Site s1 eq_site_dec LS2 (fun s : Site => f x s (t x s))) *)
(* Goal: forall _ : only_once Site eq_site_dec s0 l, @eq Z (sigma Site LS2 (fun s : Site => f x s (t x s))) (sigma_but Site s1 eq_site_dec LS2 (fun s : Site => f x s (t x s))) *)
(* Goal: forall _ : not (@eq Site x s0), @eq Z (sigma Site LS2 (fun s : Site => f x s (t x s))) (sigma Site LS2 (fun s : Site => f x s (t x s))) *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
(* Goal: not (@In Site a l) *)
(* Goal: not (@In Site a l) *)
(* Goal: forall _ : not (@eq Site a s0), @eq Z (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  intro H3.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0)))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  omega.
  
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  intro n.
(* Goal: Z.gt (Z.add (f a) (sigma E l0 f)) Z0 *)
  generalize (H1 a).
(* Goal: forall _ : not (@In Site s0 l), @eq Z (sigma Site LS2 (fun s : Site => f x s (t x s))) (sigma_but Site s1 eq_site_dec LS2 (fun s : Site => f x s (t x s))) *)
(* Goal: forall _ : only_once Site eq_site_dec s0 l, @eq Z (sigma Site LS2 (fun s : Site => f x s (t x s))) (sigma_but Site s1 eq_site_dec LS2 (fun s : Site => f x s (t x s))) *)
(* Goal: forall _ : not (@eq Site x s0), @eq Z (sigma Site LS2 (fun s : Site => f x s (t x s))) (sigma Site LS2 (fun s : Site => f x s (t x s))) *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
(* Goal: not (@In Site a l) *)
(* Goal: not (@In Site a l) *)
(* Goal: forall _ : not (@eq Site a s0), @eq Z (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  intro H3.
(* Goal: Z.gt (Z.add (f a) (sigma E l0 f)) Z0 *)
  generalize H0.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: forall _ : Z.ge (sigma_but E x0 eq_E_dec l0 f) Z0, Z.gt (Z.add (f x) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
(* Goal: forall _ : not (@eq E a x), Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
  intro H4.
(* Goal: Z.gt (Z.add (f a) (sigma E l0 f)) Z0 *)
  elim H4.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  intro; elim n; auto.
  
(* Goal: forall _ : @In E x l0, Z.gt (Z.add (f a) (sigma E l0 f)) Z0 *)
  intro H5.
(* Goal: Z.gt (Z.add (f a) (sigma E l0 f)) Z0 *)
  generalize (H H5 H1 H2).
(* Goal: forall _ : Z.gt (sigma E l0 f) Z0, Z.gt (Z.add (f a) (sigma E l0 f)) Z0 *)
  intro H6.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0)))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  omega.
Qed.

Variable x0 : E.

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.
Proof.
(* Goal: forall (f : forall _ : E, Z) (x : E) (l : list E) (_ : @In E x l) (_ : not (@eq E x x0)) (_ : forall y : E, Z.ge (f y) Z0) (_ : Z.gt (f x) Z0), Z.gt (sigma_but E x0 eq_E_dec l f) Z0 *)
  intros f x l.
(* Goal: forall (_ : @In E x l) (_ : not (@eq E x x0)) (_ : forall y : E, Z.ge (f y) Z0) (_ : Z.gt (f x) Z0), Z.gt (sigma_but E x0 eq_E_dec l f) Z0 *)
  elim l.
(* Goal: forall (_ : @eq Site s0 a) (_ : not (@In Site s0 l)), only_once Site eq_site_dec s0 l *)
(* Goal: forall (_ : not (@eq Site s0 a)) (_ : only_once Site eq_site_dec s0 l), only_once Site eq_site_dec s0 l *)
  simpl in |- *; intuition.
  
(* Goal: forall (a : E) (l : list E) (_ : forall (_ : @In E x l) (_ : not (@eq E x x0)) (_ : forall y : E, Z.ge (f y) Z0) (_ : Z.gt (f x) Z0), Z.gt (sigma_but E x0 eq_E_dec l f) Z0) (_ : @In E x (@cons E a l)) (_ : not (@eq E x x0)) (_ : forall y : E, Z.ge (f y) Z0) (_ : Z.gt (f x) Z0), Z.gt (sigma_but E x0 eq_E_dec (@cons E a l) f) Z0 *)
  intros a l0 H H0 H1 H2 H3.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: Z.gt (if eq_E_dec a x0 then sigma_but E x0 eq_E_dec l0 f else Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
  case (eq_E_dec a x0); intro.
(* Goal: @eq Z (f0 a x (t1 a x)) (f0 a x (t2 a x)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply H.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  generalize H0; simpl in |- *.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : not (@In Site s0 l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  rewrite e.
(* Goal: forall _ : Z.ge (sigma_but E x0 eq_E_dec l0 f) Z0, Z.gt (Z.add (f x) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
(* Goal: forall _ : not (@eq E a x), Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
  intro H4.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim H4; auto.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  intro; elim H1; auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
  case (eq_E_dec a x).
(* Goal: forall _ : @eq E a x, Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
(* Goal: forall _ : not (@eq E a x), Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
  intro e.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : not (@In Site s0 l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  rewrite e.
(* Goal: Z.gt (Z.add (f x) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
(* Goal: forall _ : not (@eq E a x), Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
  generalize (sigma_but_pos E x0 eq_E_dec f l0 H2).
(* Goal: forall _ : Z.ge (sigma_but E x0 eq_E_dec l0 f) Z0, Z.gt (Z.add (f x) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
(* Goal: forall _ : not (@eq E a x), Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
  intro H4.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0)))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  omega.
  
(* Goal: forall _ : not (@eq E a x), Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
  intro n0.
(* Goal: Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
  elim H0; intro.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim n0; auto.
  
(* Goal: Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
  generalize (H H4 H1 H2 H3); intro.
(* Goal: Z.gt (Z.add (f a) (sigma_but E x0 eq_E_dec l0 f)) Z0 *)
  generalize (H2 a).
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0)))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  omega.
Qed.

End positive.

Section positive2.

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.


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.
Proof.
(* Goal: forall _ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_table Site l LS2 Data f t) (Z.add (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f t) (f s0 s1 (t s0 s1))), @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (f s0 s1 (t s0 s1))) *)
  unfold sigma2_table in |- *.
(* Goal: forall (x y : Site) (l1 l2 : list Site) (_ : @In Site x l1) (_ : @In Site y l2) (_ : forall x' y' : Site, Z.ge (f x' y' (t x' y')) Z0) (_ : Z.gt (f x y (t x y)) Z0), Z.gt (sigma_table Site l1 Z (Z_id Site) (fun s1 : Site => sigma_table Site l2 Data (f s1) (t s1))) Z0 *)
  intros x y l1 l2 H H0 H1 H2.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma_table Site l 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))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold sigma_table in |- *.
(* Goal: Z.gt (sigma Site l1 (fun s : Site => Z_id Site s (sigma Site l2 (fun s0 : Site => f s s0 (t s s0))))) Z0 *)
  apply sigma_strictly_positive with (x := x).
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: forall y : Site, Z.ge (f x y (t x y)) Z0 *)
(* Goal: Z.gt (f x y (t x y)) Z0 *)
  intro y0.
(* Goal: @eq Z (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold Z_id in |- *.
(* Goal: Z.ge (sigma Site l2 (fun s : Site => f y0 s (t y0 s))) Z0 *)
(* Goal: Z.gt (Z_id Site x (sigma Site l2 (fun s : Site => f x s (t x s)))) Z0 *)
  apply sigma_pos.
(* Goal: forall x_ : Site, Z.ge (f y0 x_ (t y0 x_)) Z0 *)
(* Goal: Z.gt (Z_id Site x (sigma Site l2 (fun s : Site => f x s (t x s)))) Z0 *)
  intro x_.
(* Goal: Z.ge (f y0 x_ (t y0 x_)) Z0 *)
(* Goal: Z.gt (Z_id Site x (sigma Site l2 (fun s : Site => f x s (t x s)))) Z0 *)
  generalize (H1 y0 x_).
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: @eq Z (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold Z_id in |- *.
(* Goal: Z.gt (sigma Site l2 (fun s : Site => f x s (t x s))) Z0 *)
  apply sigma_strictly_positive with (x := y).
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: forall y : Site, Z.ge (f x y (t x y)) Z0 *)
(* Goal: Z.gt (f x y (t x y)) Z0 *)
  intro y0.
(* Goal: Z.ge (f x y0 (t x y0)) Z0 *)
(* Goal: Z.gt (f x y (t x y)) Z0 *)
  generalize (H1 x y0).
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
Qed.

End positive2.

Section BUT_XY.
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 f : Site -> Site -> Data -> Z.

Remark add_reduce2_1 :
 forall x y z a : Z, x = a -> (x + (y + z))%Z = (a + y + z)%Z.
Proof.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0)))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
intros; omega.
Qed.

Remark add_reduce3 :
 forall x y z a : Z, x = a -> y = z -> (x + y)%Z = (a + z)%Z.
Proof.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0)))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
intros; omega.
Qed.




Lemma sigma2_sigma2_but_x_y :
 forall (s0 s1 : Site) (t : Table2),
 only_once Site eq_site_dec s0 LS1 ->
 only_once Site eq_site_dec s1 LS2 ->
 sigma2_table Site LS1 LS2 Data f t =
 (sigma2_but_table Site eq_site_dec LS1 LS2 Data s0 s1 f t +
  f s0 s1 (t s0 s1))%Z.
Proof.
(* Goal: forall (s0 s1 : Site) (t : Table2) (_ : only_once Site eq_site_dec s0 LS1) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_table Site LS1 LS2 Data f t) (Z.add (sigma2_but_table Site eq_site_dec LS1 LS2 Data s0 s1 f t) (f s0 s1 (t s0 s1))) *)
  intro s0.
(* Goal: forall (s1 : Site) (t : Table2) (_ : only_once Site eq_site_dec s0 LS1) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_table Site LS1 LS2 Data f t) (Z.add (sigma2_but_table Site eq_site_dec LS1 LS2 Data s0 s1 f t) (f s0 s1 (t s0 s1))) *)
  intro s1.
(* Goal: forall (t : Table2) (_ : only_once Site eq_site_dec s0 LS1) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_table Site LS1 LS2 Data f t) (Z.add (sigma2_but_table Site eq_site_dec LS1 LS2 Data s0 s1 f t) (f s0 s1 (t s0 s1))) *)
  intro t.
(* Goal: forall (_ : only_once Site eq_site_dec s0 LS1) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec LS1 LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec LS1 LS2 Data s0 s1 f0 t2) *)
  elim LS1.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: forall (_ : False) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@nil Site) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@nil Site) LS2 Data s0 s1 f0 t2) *)
(* Goal: forall (a : Site) (l : list Site) (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 (@cons Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  intros; contradiction.
  
(* Goal: forall (a : Site) (l : list Site) (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_table Site l LS2 Data f t) (Z.add (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f t) (f s0 s1 (t s0 s1)))) (_ : only_once Site eq_site_dec s0 (@cons Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_table Site (@cons Site a l) LS2 Data f t) (Z.add (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f t) (f s0 s1 (t s0 s1))) *)
  intros a l H H0 H1.
(* Goal: @eq Z (sigma2_table Site (@cons Site a l) LS2 Data f t) (Z.add (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f t) (f s0 s1 (t s0 s1))) *)
  unfold sigma2_table, sigma2_but_table in |- *.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: @eq Z (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t1 a) else sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))))) (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t2 a) else sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) *)
  case (eq_site_dec a s0); intro.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma_table Site l 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))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold sigma_table in |- *.
(* Goal: @eq Z (sigma Site (@cons Site a l) (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z.add (sigma Site (@cons Site a l) (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  rewrite (sigma_sigma_but Site a eq_site_dec).
(* Goal: @eq Z (Z.add (sigma_but Site a eq_site_dec (@cons Site a l) (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (sigma Site (@cons Site a l) (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  rewrite (sigma_sigma_but Site a eq_site_dec) with (l := a :: l).
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: @eq Z (Z.add (if eq_site_dec a a then sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))) else Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (if eq_site_dec a a then sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))) else Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  case (eq_site_dec a a).
(* Goal: forall _ : @eq Site a a, @eq Z (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  intro e0.
(* Goal: @eq Z (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  case (eq_site_dec a s0).
(* Goal: forall _ : @eq Site a s0, @eq Z (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a)))) (f s0 s1 (t s0 s1))) *)
(* Goal: forall _ : not (@eq Site a s0), @eq Z (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  intro e1.
(* Goal: @eq Z (Z.add (sigma Site l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a)))) (f s0 s1 (t s0 s1))) *)
(* Goal: not (@In Site a l) *)
(* Goal: forall _ : not (@eq Site a s0), @eq Z (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  rewrite <- sigma_sigma_but_not_in with (x0 := a).
(* Goal: @eq Z (Z.add (sigma Site l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a)))) (f s0 s1 (t s0 s1))) *)
(* Goal: not (@In Site a l) *)
(* Goal: forall _ : not (@eq Site a s0), @eq Z (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  rewrite <- sigma_sigma_but_not_in with (x0 := a).
(* Goal: @eq Z (Z.add (sigma Site l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a)))) (f s0 s1 (t s0 s1))) *)
(* Goal: not (@In Site a l) *)
(* Goal: not (@In Site a l) *)
(* Goal: forall _ : not (@eq Site a s0), @eq Z (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  rewrite (sigma_sigma_but Site s1 eq_site_dec) with (l := LS2).
(* Goal: forall _ : forall _ : only_once Site eq_site_dec s1 l0, @eq Z (sigma_but_table Site eq_site_dec l0 Data s1 (f0 a) (t1 a)) (sigma_but_table Site eq_site_dec l0 Data s1 (f0 a) (t2 a)), @eq Z (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold sigma_but_table in |- *.
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  rewrite e1.
(* Goal: @eq Z (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold Z_id in |- *.
(* Goal: @eq Z (Z.add (sigma Site l (fun s : Site => sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))) (Z.add (sigma_but Site s1 eq_site_dec LS2 (fun s : Site => f s0 s (t s0 s))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site l (fun s : Site => if eq_site_dec s s0 then sigma_but Site s1 eq_site_dec LS2 (fun s0 : Site => f s s0 (t s s0)) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))) (sigma_but Site s1 eq_site_dec LS2 (fun s : Site => f s0 s (t s0 s)))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
(* Goal: not (@In Site a l) *)
(* Goal: not (@In Site a l) *)
(* Goal: forall _ : not (@eq Site a s0), @eq Z (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  apply add_reduce2_1.
(* Goal: @eq Z (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply sigma_simpl.
(* Goal: forall (x : Site) (_ : @In Site x l), @eq Z (sigma Site LS2 (fun s : Site => f x s (t x s))) (if eq_site_dec x s0 then sigma_but Site s1 eq_site_dec LS2 (fun s : Site => f x s (t x s)) else sigma Site LS2 (fun s : Site => f x s (t x s))) *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
(* Goal: not (@In Site a l) *)
(* Goal: not (@In Site a l) *)
(* Goal: forall _ : not (@eq Site a s0), @eq Z (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  intros x H2.
(* Goal: @eq Z (sigma Site LS2 (fun s : Site => f x s (t x s))) (if eq_site_dec x s0 then sigma_but Site s1 eq_site_dec LS2 (fun s : Site => f x s (t x s)) else sigma Site LS2 (fun s : Site => f x s (t x s))) *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
(* Goal: not (@In Site a l) *)
(* Goal: not (@In Site a l) *)
(* Goal: forall _ : not (@eq Site a s0), @eq Z (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  case (eq_site_dec x s0).
(* Goal: forall _ : @eq Site x s0, @eq Z (sigma Site LS2 (fun s : Site => f x s (t x s))) (sigma_but Site s1 eq_site_dec LS2 (fun s : Site => f x s (t x s))) *)
(* Goal: forall _ : not (@eq Site x s0), @eq Z (sigma Site LS2 (fun s : Site => f x s (t x s))) (sigma Site LS2 (fun s : Site => f x s (t x s))) *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
(* Goal: not (@In Site a l) *)
(* Goal: not (@In Site a l) *)
(* Goal: forall _ : not (@eq Site a s0), @eq Z (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  intro e2.
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  generalize H0; rewrite e1.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: forall _ : if eq_site_dec s0 s0 then not (@In Site s0 l) else only_once Site eq_site_dec s0 l, not (@In Site s0 l) *)
(* Goal: not (@In Site a l) *)
(* Goal: forall _ : not (@eq Site a s0), @eq Z (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  case (eq_site_dec s0 s0); intro.
(* Goal: forall _ : not (@In Site s0 l), @eq Z (sigma Site LS2 (fun s : Site => f x s (t x s))) (sigma_but Site s1 eq_site_dec LS2 (fun s : Site => f x s (t x s))) *)
(* Goal: forall _ : only_once Site eq_site_dec s0 l, @eq Z (sigma Site LS2 (fun s : Site => f x s (t x s))) (sigma_but Site s1 eq_site_dec LS2 (fun s : Site => f x s (t x s))) *)
(* Goal: forall _ : not (@eq Site x s0), @eq Z (sigma Site LS2 (fun s : Site => f x s (t x s))) (sigma Site LS2 (fun s : Site => f x s (t x s))) *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
(* Goal: not (@In Site a l) *)
(* Goal: not (@In Site a l) *)
(* Goal: forall _ : not (@eq Site a s0), @eq Z (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  intro H3.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim H3; rewrite <- e2; auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim n; auto.
  
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  intro n.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  generalize H0; simpl in |- *.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : not (@In Site s0 l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  rewrite e.
(* Goal: forall _ : if eq_site_dec s0 s0 then not (@In Site s0 l) else only_once Site eq_site_dec s0 l, not (@In Site s0 l) *)
(* Goal: not (@In Site a l) *)
(* Goal: forall _ : not (@eq Site a s0), @eq Z (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  case (eq_site_dec s0 s0); intro.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim n; auto.
  
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  generalize H0; simpl in |- *.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : if eq_site_dec s0 a then not (@In Site s0 l) else only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  case (eq_site_dec s0 a); intro.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  rewrite e; auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim n; auto.
  
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  intro n.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim n; auto.
  
(* Goal: forall _ : not (@eq Site a a), @eq Z (Z.add (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s))))) (Z.add (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma_but Site a eq_site_dec l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: only_once Site eq_site_dec a (@cons Site a l) *)
(* Goal: @eq Z (sigma_table Site (@cons Site a l) Z (Z_id Site) (fun s1 : Site => sigma_table Site LS2 Data (f s1) (t s1))) (Z.add (sigma_table Site (@cons Site a l) 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))) (f s0 s1 (t s0 s1))) *)
  intro n.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim n; auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  rewrite e; auto.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  generalize H0; rewrite e; auto.
  
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : not (@In Site s0 l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  generalize H0; rewrite e.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold sigma_table in |- *; simpl in |- *.
(* Goal: @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (f s0 s1 (t s0 s1))) *)
  generalize H.
(* Goal: forall _ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_table Site l LS2 Data f t) (Z.add (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f t) (f s0 s1 (t s0 s1))), @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (f s0 s1 (t s0 s1))) *)
  unfold sigma2_table in |- *.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma_table Site l 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))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold sigma_table in |- *.
(* Goal: forall _ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma Site l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (Z.add (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f t) (f s0 s1 (t s0 s1))), @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (f s0 s1 (t s0 s1))) *)
  intro H2.
(* Goal: @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (Z.add (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f a) (t a) else sigma Site LS2 (fun s : Site => f a s (t a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f s) (t s) else sigma Site LS2 (fun s0 : Site => f s s0 (t s s0)))))) (f s0 s1 (t s0 s1))) *)
  rewrite H2.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold Z_id in |- *; simpl in |- *.
(* Goal: @eq Z (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t1 a) else sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))))) (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t2 a) else sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) *)
  case (eq_site_dec a s0); intro.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim n; auto.
  
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold sigma2_but_table in |- *.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma_table Site l 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))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold sigma_table in |- *.
(* Goal: @eq Z (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold Z_id in |- *.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0)))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  omega.
  
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  generalize H0; simpl in |- *.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : if eq_site_dec s0 a then not (@In Site s0 l) else only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  case (eq_site_dec s0 a); intro.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim n; auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
    
Qed.

Lemma sigma2_but_simpl :
 forall (s0 s1 : Site) (t : Table2) (f g : Site -> Site -> Data -> Z),
 (forall x y : Site, ~ (x = s0 /\ y = s1) -> f x y (t x y) = g x y (t x y)) ->
 only_once Site eq_site_dec s0 LS1 ->
 only_once Site eq_site_dec s1 LS2 ->
 sigma2_but_table Site eq_site_dec LS1 LS2 Data s0 s1 f t =
 sigma2_but_table Site eq_site_dec LS1 LS2 Data s0 s1 g t.
Proof.
(* Goal: forall (s0 s1 : Site) (t : Table2) (f g : forall (_ : Site) (_ : Site) (_ : Data), Z) (_ : forall (x y : Site) (_ : not (and (@eq Site x s0) (@eq Site y s1))), @eq Z (f x y (t x y)) (g x y (t x y))) (_ : only_once Site eq_site_dec s0 LS1) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec LS1 LS2 Data s0 s1 f t) (sigma2_but_table Site eq_site_dec LS1 LS2 Data s0 s1 g t) *)
  intros s0 s1 t f0 g H.
(* Goal: forall (_ : only_once Site eq_site_dec s0 LS1) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec LS1 LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec LS1 LS2 Data s0 s1 f0 t2) *)
  elim LS1.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: forall (_ : False) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@nil Site) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@nil Site) LS2 Data s0 s1 f0 t2) *)
(* Goal: forall (a : Site) (l : list Site) (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 (@cons Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  intros; contradiction.
  
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: forall (a : Site) (l : list Site) (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : if eq_site_dec s0 a then not (@In Site s0 l) else only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  intros a l.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : if eq_site_dec s0 a then not (@In Site s0 l) else only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  case (eq_site_dec s0 a); intro.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : not (@In Site s0 l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  rewrite e.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t1 a) else sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))))) (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t2 a) else sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) *)
  intros H0 H1 H2.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold sigma2_but_table in |- *.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold sigma_table in |- *; simpl in |- *.
(* Goal: @eq Z (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold Z_id in |- *.
(* Goal: @eq Z (Z.add (if eq_site_dec a a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t1 a) else sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (if eq_site_dec a a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t2 a) else sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  case (eq_site_dec a a); intro.
(* Goal: @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply add_reduce3.
(* Goal: @eq Z (sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t1 a)) (sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t2 a)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  generalize H2.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  elim LS2; simpl in |- *.
(* Goal: forall _ : False, @eq Z (sigma_but_table Site eq_site_dec (@nil Site) Data s1 (f0 a) (t1 a)) (sigma_but_table Site eq_site_dec (@nil Site) Data s1 (f0 a) (t2 a)) *)
(* Goal: forall (a0 : Site) (l : list Site) (_ : forall _ : only_once Site eq_site_dec s1 l, @eq Z (sigma_but_table Site eq_site_dec l Data s1 (f0 a) (t1 a)) (sigma_but_table Site eq_site_dec l Data s1 (f0 a) (t2 a))) (_ : if eq_site_dec s1 a0 then not (@In Site s1 l) else only_once Site eq_site_dec s1 l), @eq Z (sigma_but_table Site eq_site_dec (@cons Site a0 l) Data s1 (f0 a) (t1 a)) (sigma_but_table Site eq_site_dec (@cons Site a0 l) Data s1 (f0 a) (t2 a)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  intro; contradiction.
  
(* Goal: forall (a0 : Site) (l : list Site) (_ : forall _ : only_once Site eq_site_dec s1 l, @eq Z (sigma_but_table Site eq_site_dec l Data s1 (f0 a) (t1 a)) (sigma_but_table Site eq_site_dec l Data s1 (f0 a) (t2 a))) (_ : if eq_site_dec s1 a0 then not (@In Site s1 l) else only_once Site eq_site_dec s1 l), @eq Z (sigma_but_table Site eq_site_dec (@cons Site a0 l) Data s1 (f0 a) (t1 a)) (sigma_but_table Site eq_site_dec (@cons Site a0 l) Data s1 (f0 a) (t2 a)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  intros a0 l0 H3 H4.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold sigma_but_table in |- *; simpl in |- *.
(* Goal: @eq Z (if eq_site_dec a0 s1 then sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)) else Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (if eq_site_dec a0 s1 then sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)) else Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  generalize H4.
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (if eq_site_dec a0 s1 then sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)) else Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (if eq_site_dec a0 s1 then sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)) else Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  case (eq_site_dec a0 s1); intro.
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  rewrite e1.
(* Goal: forall _ : if eq_site_dec s1 s1 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  case (eq_site_dec s1 s1); intros.
(* Goal: @eq Z (sigma Site l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: not (@In Site s1 l0) *)
(* Goal: @eq Z (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  rewrite <- (sigma_sigma_but_not_in Site s1 eq_site_dec).
(* Goal: @eq Z (sigma Site l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: not (@In Site s1 l0) *)
(* Goal: @eq Z (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  rewrite <- (sigma_sigma_but_not_in Site s1 eq_site_dec).
(* Goal: @eq Z (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply sigma_simpl.
(* Goal: forall (x : Site) (_ : @In Site x l0), @eq Z (f0 a x (t1 a x)) (f0 a x (t2 a x)) *)
(* Goal: not (@In Site s1 l0) *)
(* Goal: not (@In Site s1 l0) *)
(* Goal: @eq Z (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  intros x H6.
(* Goal: @eq Z (f0 a x (t1 a x)) (f0 a x (t2 a x)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply H.
(* Goal: not (and (@eq Site x s0) (@eq Site x0 s1)) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold not in |- *; intro.
(* Goal: False *)
(* Goal: not (@In Site s1 l0) *)
(* Goal: not (@In Site s1 l0) *)
(* Goal: @eq Z (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  decompose [and] H7.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim H5; rewrite <- H9; auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: not (@In Site s1 l0) *)
(* Goal: @eq Z (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  exact H5.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim n; auto.
  
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  case (eq_site_dec s1 a0); intro.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim n; auto.
  
(* Goal: forall _ : only_once Site eq_site_dec s1 l0, @eq Z (Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  intros H5.
(* Goal: @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply add_reduce3.
(* Goal: @eq Z (f0 a x (t1 a x)) (f0 a x (t2 a x)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply H.
(* Goal: not (and (@eq Site x s0) (@eq Site x0 s1)) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold not in |- *; intro.
(* Goal: False *)
(* Goal: @eq Z (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  decompose [and] H6.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim n; auto.
  
(* Goal: @eq Z (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  generalize H3.
(* Goal: forall _ : forall _ : only_once Site eq_site_dec s1 l0, @eq Z (sigma_but_table Site eq_site_dec l0 Data s1 (f0 a) (t1 a)) (sigma_but_table Site eq_site_dec l0 Data s1 (f0 a) (t2 a)), @eq Z (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold sigma_but_table in |- *.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: @eq Z (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply sigma_simpl.
(* Goal: forall (x : Site) (_ : @In Site x LS2), @eq Z (f0 a x (t1 a x)) (f0 a x (t2 a x)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  intros x H3.
(* Goal: @eq Z (if eq_site_dec x a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 x) (t1 x) else sigma Site LS2 (fun s : Site => f0 x s (t1 x s))) (if eq_site_dec x a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 x) (t2 x) else sigma Site LS2 (fun s : Site => f0 x s (t2 x s))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  case (eq_site_dec x a); intro.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim H1; rewrite <- e1; auto.
  
(* Goal: @eq Z (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply sigma_simpl.
(* Goal: forall (x0 : Site) (_ : @In Site x0 LS2), @eq Z (f0 x x0 (t1 x x0)) (f0 x x0 (t2 x x0)) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  intros x0 H4.
(* Goal: @eq Z (f0 a x (t1 a x)) (f0 a x (t2 a x)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply H.
(* Goal: not (and (@eq Site x s0) (@eq Site x0 s1)) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold not in |- *; intro.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  decompose [and] H5; elim n; rewrite <- e; auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim n; auto.
  
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold sigma2_but_table in |- *.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold sigma_table in |- *; simpl in |- *.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t1 a) else sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))))) (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t2 a) else sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) *)
  intros H0 H1 H2.
(* Goal: @eq Z (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t1 a) else sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))))) (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t2 a) else sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) *)
  case (eq_site_dec a s0); intro.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim n; auto.
  
(* Goal: @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))))) (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) *)
  rewrite H0.
(* Goal: @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply add_reduce3.
(* Goal: @eq Z (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold Z_id in |- *.
(* Goal: @eq Z (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply sigma_simpl.
(* Goal: forall (x : Site) (_ : @In Site x LS2), @eq Z (f0 a x (t1 a x)) (f0 a x (t2 a x)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  intros x H3.
(* Goal: @eq Z (f0 a x (t1 a x)) (f0 a x (t2 a x)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply H.
(* Goal: not (and (@eq Site a s0) (@eq Site x s1)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold not in |- *; intro; elim n0.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  decompose [and] H4; auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.

Qed.

(* Interestingly, the proof of the following Lemma is exactly the same
as the proof of the previous lemma *)

Lemma sigma2_but_simpl2 :
 forall (s0 s1 : Site) (t1 t2 : Table2) (f : Site -> Site -> Data -> Z),
 (forall x y : Site, ~ (x = s0 /\ y = s1) -> f x y (t1 x y) = f x y (t2 x y)) ->
 only_once Site eq_site_dec s0 LS1 ->
 only_once Site eq_site_dec s1 LS2 ->
 sigma2_but_table Site eq_site_dec LS1 LS2 Data s0 s1 f t1 =
 sigma2_but_table Site eq_site_dec LS1 LS2 Data s0 s1 f t2.
Proof.
(* Goal: forall (s0 s1 : Site) (t1 t2 : Table2) (f : forall (_ : Site) (_ : Site) (_ : Data), Z) (_ : forall (x y : Site) (_ : not (and (@eq Site x s0) (@eq Site y s1))), @eq Z (f x y (t1 x y)) (f x y (t2 x y))) (_ : only_once Site eq_site_dec s0 LS1) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec LS1 LS2 Data s0 s1 f t1) (sigma2_but_table Site eq_site_dec LS1 LS2 Data s0 s1 f t2) *)
  intros s0 s1 t1 t2 f0 H.
(* Goal: forall (_ : only_once Site eq_site_dec s0 LS1) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec LS1 LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec LS1 LS2 Data s0 s1 f0 t2) *)
  elim LS1.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: forall (_ : False) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@nil Site) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@nil Site) LS2 Data s0 s1 f0 t2) *)
(* Goal: forall (a : Site) (l : list Site) (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 (@cons Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  intros; contradiction.
  
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: forall (a : Site) (l : list Site) (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : if eq_site_dec s0 a then not (@In Site s0 l) else only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  intros a l.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : if eq_site_dec s0 a then not (@In Site s0 l) else only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  case (eq_site_dec s0 a); intro.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : not (@In Site s0 l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  rewrite e.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  simpl in |- *.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t1 a) else sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))))) (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t2 a) else sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) *)
  intros H0 H1 H2.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold sigma2_but_table in |- *.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold sigma_table in |- *; simpl in |- *.
(* Goal: @eq Z (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold Z_id in |- *.
(* Goal: @eq Z (Z.add (if eq_site_dec a a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t1 a) else sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (if eq_site_dec a a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t2 a) else sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  case (eq_site_dec a a); intro.
(* Goal: @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply add_reduce3.
(* Goal: @eq Z (sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t1 a)) (sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t2 a)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  generalize H2.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  elim LS2; simpl in |- *.
(* Goal: forall _ : False, @eq Z (sigma_but_table Site eq_site_dec (@nil Site) Data s1 (f0 a) (t1 a)) (sigma_but_table Site eq_site_dec (@nil Site) Data s1 (f0 a) (t2 a)) *)
(* Goal: forall (a0 : Site) (l : list Site) (_ : forall _ : only_once Site eq_site_dec s1 l, @eq Z (sigma_but_table Site eq_site_dec l Data s1 (f0 a) (t1 a)) (sigma_but_table Site eq_site_dec l Data s1 (f0 a) (t2 a))) (_ : if eq_site_dec s1 a0 then not (@In Site s1 l) else only_once Site eq_site_dec s1 l), @eq Z (sigma_but_table Site eq_site_dec (@cons Site a0 l) Data s1 (f0 a) (t1 a)) (sigma_but_table Site eq_site_dec (@cons Site a0 l) Data s1 (f0 a) (t2 a)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  intro; contradiction.
  
(* Goal: forall (a0 : Site) (l : list Site) (_ : forall _ : only_once Site eq_site_dec s1 l, @eq Z (sigma_but_table Site eq_site_dec l Data s1 (f0 a) (t1 a)) (sigma_but_table Site eq_site_dec l Data s1 (f0 a) (t2 a))) (_ : if eq_site_dec s1 a0 then not (@In Site s1 l) else only_once Site eq_site_dec s1 l), @eq Z (sigma_but_table Site eq_site_dec (@cons Site a0 l) Data s1 (f0 a) (t1 a)) (sigma_but_table Site eq_site_dec (@cons Site a0 l) Data s1 (f0 a) (t2 a)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  intros a0 l0 H3 H4.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold sigma_but_table in |- *; simpl in |- *.
(* Goal: @eq Z (if eq_site_dec a0 s1 then sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)) else Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (if eq_site_dec a0 s1 then sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)) else Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  generalize H4.
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (if eq_site_dec a0 s1 then sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)) else Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (if eq_site_dec a0 s1 then sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)) else Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  case (eq_site_dec a0 s1); intro.
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  rewrite e1.
(* Goal: forall _ : if eq_site_dec s1 s1 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  case (eq_site_dec s1 s1); intros.
(* Goal: @eq Z (sigma Site l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: not (@In Site s1 l0) *)
(* Goal: @eq Z (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  rewrite <- (sigma_sigma_but_not_in Site s1 eq_site_dec).
(* Goal: @eq Z (sigma Site l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: not (@In Site s1 l0) *)
(* Goal: @eq Z (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  rewrite <- (sigma_sigma_but_not_in Site s1 eq_site_dec).
(* Goal: @eq Z (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply sigma_simpl.
(* Goal: forall (x : Site) (_ : @In Site x l0), @eq Z (f0 a x (t1 a x)) (f0 a x (t2 a x)) *)
(* Goal: not (@In Site s1 l0) *)
(* Goal: not (@In Site s1 l0) *)
(* Goal: @eq Z (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  intros x H6.
(* Goal: @eq Z (f0 a x (t1 a x)) (f0 a x (t2 a x)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply H.
(* Goal: not (and (@eq Site x s0) (@eq Site x0 s1)) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold not in |- *; intro.
(* Goal: False *)
(* Goal: not (@In Site s1 l0) *)
(* Goal: not (@In Site s1 l0) *)
(* Goal: @eq Z (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  decompose [and] H7.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim H5; rewrite <- H9; auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: not (@In Site s1 l0) *)
(* Goal: @eq Z (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  exact H5.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim n; auto.
  
(* Goal: forall _ : if eq_site_dec s1 a0 then not (@In Site s1 l0) else only_once Site eq_site_dec s1 l0, @eq Z (Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  case (eq_site_dec s1 a0); intro.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim n; auto.
  
(* Goal: forall _ : only_once Site eq_site_dec s1 l0, @eq Z (Z.add (f0 a a0 (t1 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s)))) (Z.add (f0 a a0 (t2 a a0)) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  intros H5.
(* Goal: @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply add_reduce3.
(* Goal: @eq Z (f0 a x (t1 a x)) (f0 a x (t2 a x)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply H.
(* Goal: not (and (@eq Site x s0) (@eq Site x0 s1)) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold not in |- *; intro.
(* Goal: False *)
(* Goal: @eq Z (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  decompose [and] H6.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim n; auto.
  
(* Goal: @eq Z (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  generalize H3.
(* Goal: forall _ : forall _ : only_once Site eq_site_dec s1 l0, @eq Z (sigma_but_table Site eq_site_dec l0 Data s1 (f0 a) (t1 a)) (sigma_but_table Site eq_site_dec l0 Data s1 (f0 a) (t2 a)), @eq Z (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t1 a s))) (sigma_but Site s1 eq_site_dec l0 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold sigma_but_table in |- *.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: @eq Z (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply sigma_simpl.
(* Goal: forall (x : Site) (_ : @In Site x LS2), @eq Z (f0 a x (t1 a x)) (f0 a x (t2 a x)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  intros x H3.
(* Goal: @eq Z (if eq_site_dec x a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 x) (t1 x) else sigma Site LS2 (fun s : Site => f0 x s (t1 x s))) (if eq_site_dec x a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 x) (t2 x) else sigma Site LS2 (fun s : Site => f0 x s (t2 x s))) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  case (eq_site_dec x a); intro.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim H1; rewrite <- e1; auto.
  
(* Goal: @eq Z (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply sigma_simpl.
(* Goal: forall (x0 : Site) (_ : @In Site x0 LS2), @eq Z (f0 x x0 (t1 x x0)) (f0 x x0 (t2 x x0)) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  intros x0 H4.
(* Goal: @eq Z (f0 a x (t1 a x)) (f0 a x (t2 a x)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply H.
(* Goal: not (and (@eq Site x s0) (@eq Site x0 s1)) *)
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (Z.add (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) (sigma Site l (fun s : Site => if eq_site_dec s a then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold not in |- *; intro.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  decompose [and] H5; elim n; rewrite <- e; auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim n; auto.
  
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold sigma2_but_table in |- *.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec a l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data a s1 f0 t2)) (_ : not (@In Site a l)) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data a s1 f0 t2) *)
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec l LS2 Data s0 s1 f0 t2)) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t1) (sigma2_but_table Site eq_site_dec (@cons Site a l) LS2 Data s0 s1 f0 t2) *)
  unfold sigma_table in |- *; simpl in |- *.
(* Goal: forall (_ : forall (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) (_ : only_once Site eq_site_dec s0 l) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t1 a) else sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))))) (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t2 a) else sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) *)
  intros H0 H1 H2.
(* Goal: @eq Z (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t1 a) else sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))))) (Z.add (Z_id Site a (if eq_site_dec a s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 a) (t2 a) else sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) *)
  case (eq_site_dec a s0); intro.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim n; auto.
  
(* Goal: @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t1 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t1 s s0)))))) (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) *)
  rewrite H0.
(* Goal: @eq Z (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) (Z.add (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0)))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply add_reduce3.
(* Goal: @eq Z (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t1 a s)))) (Z_id Site a (sigma Site LS2 (fun s : Site => f0 a s (t2 a s)))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold Z_id in |- *.
(* Goal: @eq Z (sigma Site LS2 (fun s : Site => f0 a s (t1 a s))) (sigma Site LS2 (fun s : Site => f0 a s (t2 a s))) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply sigma_simpl.
(* Goal: forall (x : Site) (_ : @In Site x LS2), @eq Z (f0 a x (t1 a x)) (f0 a x (t2 a x)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  intros x H3.
(* Goal: @eq Z (f0 a x (t1 a x)) (f0 a x (t2 a x)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply H.
(* Goal: not (and (@eq Site a s0) (@eq Site x s1)) *)
(* Goal: @eq Z (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) (sigma Site l (fun s : Site => Z_id Site s (if eq_site_dec s s0 then sigma_but_table Site eq_site_dec LS2 Data s1 (f0 s) (t2 s) else sigma Site LS2 (fun s0 : Site => f0 s s0 (t2 s s0))))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  unfold not in |- *; intro; elim n0.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  decompose [and] H4; auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
Qed.

End BUT_XY.

Section NEW_BUT_XY.


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 f : Site -> Site -> Data -> Z.



Remark add_reduce17 : forall x y a : Z, x = y -> (x + a)%Z = (y + a)%Z.
Proof.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0)))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
intros; omega.
Qed.

Remark add_reduce18 : forall x y a : Z, x = y -> a = 0%Z -> x = (y + a)%Z.
Proof.
(* Goal: @eq Z (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (Z.add (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0)))) (f s0 s1 (t s0 s1)))) (Z.add (Z.add (sigma Site LS2 (fun s : Site => f a s (t a s))) (sigma Site l (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 Site LS2 (fun s0 : Site => f s s0 (t s s0))))) (f s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 l *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
intros; omega.
Qed.



(* another way of defining sigma_but:

   On the one hand, it is less convenient, because the functional
   argument is changed, which later, if we use sigma2_simpl, will
   imply a tedious case analysis.


   On the other hand, it is more convenient, because I can
   apply sigma2_but several times, there are transformed into
   a sigma2_table.
*)
Lemma new_sigma2_sigma2_but_x_y :
 forall (s0 s1 : Site) (Data : Set) (f : Site -> Site -> Data -> Z)
   (t : Site -> Site -> Data),
 only_once Site eq_site_dec s0 LS1 ->
 only_once Site eq_site_dec s1 LS2 ->
 sigma2_table Site LS1 LS2 Data f t =
 (new_sigma2_but_table Site eq_site_dec LS1 LS2 Data s0 s1 f t +
  f s0 s1 (t s0 s1))%Z.
Proof.
(* Goal: forall (s0 s1 : Site) (Data : Set) (f : forall (_ : Site) (_ : Site) (_ : Data), Z) (t : forall (_ : Site) (_ : Site), Data) (_ : only_once Site eq_site_dec s0 LS1) (_ : only_once Site eq_site_dec s1 LS2), @eq Z (sigma2_table Site LS1 LS2 Data f t) (Z.add (new_sigma2_but_table Site eq_site_dec LS1 LS2 Data s0 s1 f t) (f s0 s1 (t s0 s1))) *)
  intros s0 s1 Data0 f0 t H H0.
(* Goal: @eq Z (sigma2_table Site LS1 LS2 Data0 f0 t) (Z.add (new_sigma2_but_table Site eq_site_dec LS1 LS2 Data0 s0 s1 f0 t) (f0 s0 s1 (t s0 s1))) *)
  unfold new_sigma2_but_table in |- *.
  rewrite
   sigma2_sigma2_but_x_y
                         with
                         (s0 := s0)
                        (s1 := s1)
                        (eq_site_dec := eq_site_dec).
(* Goal: @eq Z (Z.add (sigma2_but_table Site eq_site_dec LS1 LS2 Data0 s0 s1 f0 t) (f0 s0 s1 (t s0 s1))) (Z.add (sigma2_table Site LS1 LS2 Data0 (fun (s2 s3 : Site) (d : Data0) => if eq_site_dec s2 s0 then if eq_site_dec s3 s1 then Z0 else f0 s2 s3 d else f0 s2 s3 d) t) (f0 s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 LS1 *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply add_reduce17.
  rewrite
   sigma2_sigma2_but_x_y
                         with
                         (s0 := s0)
                        (s1 := s1)
                        (eq_site_dec := eq_site_dec).
(* Goal: @eq Z (sigma2_but_table Site eq_site_dec LS1 LS2 Data0 s0 s1 f0 t) (Z.add (sigma2_but_table Site eq_site_dec LS1 LS2 Data0 s0 s1 (fun (s2 s3 : Site) (d : Data0) => if eq_site_dec s2 s0 then if eq_site_dec s3 s1 then Z0 else f0 s2 s3 d else f0 s2 s3 d) t) (if eq_site_dec s0 s0 then if eq_site_dec s1 s1 then Z0 else f0 s0 s1 (t s0 s1) else f0 s0 s1 (t s0 s1))) *)
(* Goal: only_once Site eq_site_dec s0 LS1 *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
(* Goal: only_once Site eq_site_dec s0 LS1 *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply add_reduce18.
(* Goal: @eq Z (sigma2_but_table Site eq_site_dec LS1 LS2 Data0 s0 s1 f0 t) (sigma2_but_table Site eq_site_dec LS1 LS2 Data0 s0 s1 (fun (s2 s3 : Site) (d : Data0) => if eq_site_dec s2 s0 then if eq_site_dec s3 s1 then Z0 else f0 s2 s3 d else f0 s2 s3 d) t) *)
(* Goal: @eq Z (if eq_site_dec s0 s0 then if eq_site_dec s1 s1 then Z0 else f0 s0 s1 (t s0 s1) else f0 s0 s1 (t s0 s1)) Z0 *)
(* Goal: only_once Site eq_site_dec s0 LS1 *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
(* Goal: only_once Site eq_site_dec s0 LS1 *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  apply sigma2_but_simpl.
(* Goal: forall (x y : Site) (_ : not (and (@eq Site x s0) (@eq Site y s1))), @eq Z (f0 x y (t x y)) (if eq_site_dec x s0 then if eq_site_dec y s1 then Z0 else f0 x y (t x y) else f0 x y (t x y)) *)
(* Goal: only_once Site eq_site_dec s0 LS1 *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
(* Goal: @eq Z (if eq_site_dec s0 s0 then if eq_site_dec s1 s1 then Z0 else f0 s0 s1 (t s0 s1) else f0 s0 s1 (t s0 s1)) Z0 *)
(* Goal: only_once Site eq_site_dec s0 LS1 *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
(* Goal: only_once Site eq_site_dec s0 LS1 *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  intros x y H1.
(* Goal: @eq Z (f0 x y (t x y)) (if eq_site_dec x s0 then if eq_site_dec y s1 then Z0 else f0 x y (t x y) else f0 x y (t x y)) *)
(* Goal: only_once Site eq_site_dec s0 LS1 *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
(* Goal: @eq Z (if eq_site_dec s0 s0 then if eq_site_dec s1 s1 then Z0 else f0 s0 s1 (t s0 s1) else f0 s0 s1 (t s0 s1)) Z0 *)
(* Goal: only_once Site eq_site_dec s0 LS1 *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
(* Goal: only_once Site eq_site_dec s0 LS1 *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  case (eq_site_dec x s0); intro.
(* Goal: @eq Z (f0 x y (t x y)) (if eq_site_dec y s1 then Z0 else f0 x y (t x y)) *)
(* Goal: @eq Z (f0 x y (t x y)) (f0 x y (t x y)) *)
(* Goal: only_once Site eq_site_dec s0 LS1 *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
(* Goal: @eq Z (if eq_site_dec s0 s0 then if eq_site_dec s1 s1 then Z0 else f0 s0 s1 (t s0 s1) else f0 s0 s1 (t s0 s1)) Z0 *)
(* Goal: only_once Site eq_site_dec s0 LS1 *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
(* Goal: only_once Site eq_site_dec s0 LS1 *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  case (eq_site_dec y s1); intro.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  elim H1; auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: @eq Z (if eq_site_dec s1 s1 then Z0 else f0 s0 s1 (t s0 s1)) Z0 *)
(* Goal: only_once Site eq_site_dec s0 LS1 *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
(* Goal: only_once Site eq_site_dec s0 LS1 *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  rewrite case_eq.
(* Goal: @eq Z (if eq_site_dec s1 s1 then Z0 else f0 s0 s1 (t s0 s1)) Z0 *)
(* Goal: only_once Site eq_site_dec s0 LS1 *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
(* Goal: only_once Site eq_site_dec s0 LS1 *)
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  rewrite case_eq.
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.
  
(* Goal: only_once Site eq_site_dec s1 LS2 *)
  auto.

Qed.


End NEW_BUT_XY.
