Library DistributedReferenceCounting.machine2.invariant4


Require Export DistributedReferenceCounting.machine2.invariant0.
Require Export DistributedReferenceCounting.machine2.invariant1.
Require Export DistributedReferenceCounting.machine2.invariant2.
Require Export DistributedReferenceCounting.machine2.invariant3.



Section INVARIANT4.

Definition new_inc_count (m : Message) :=
  match m with
  | inc_dec s ⇒ 1%Z
  | _ ⇒ 0%Z
  end.


Remark aux1 :
  c : Config,
 legal c
 st c owner =
 (sigma_receive_table (rt c) + sigma_weight (bm c) -
  sigma_table_but_owner Z (fun (_ : Site) (x : Z) ⇒ x) (st c) - 1)%Z.
Proof.
  intros.
  unfold sigma_send_table in |- ×.
  generalize (invariant1 c H).
  unfold sigma_send_table in |- ×.
  rewrite sigma_sigma_but_owner.
  generalize (sigma_table_but_owner Z (fun (_ : Site) (x : Z) ⇒ x) (st c)).
  intros.
  omega.
Qed.

Remark aux2 :
  c : Config,
 legal c
 sigma_table_but_owner Z (fun (_ : Site) (x : Z) ⇒ x) (st c) =
 sigma_but Site owner eq_site_dec LS (fun s : Sitesigma_rooted s (bm c)).
Proof.
  intros.
  unfold sigma_table_but_owner in |- ×.
  apply sigma_but_simpl.
  intros.
  rewrite (invariant2 c s).
  auto.
  auto.
  auto.
Qed.

Remark aux3 :
  (s1 s2 : Site) (q : queue Message),
 (cardinal q -
  sigma_but Site owner eq_site_dec LS (fun s : Siterooted s s1 s2 q))%Z =
 reduce Message
   (fun a : Message
    (cardinal_count a -
     sigma_but Site owner eq_site_dec LS
       (fun s : Siterooted_fun s s1 s2 a))%Z) q.
Proof.
  intros.
  unfold rooted in |- ×.
  unfold cardinal in |- ×.
  rewrite permute_sigma_but_reduce.
  rewrite <- disjoint_reduce3.
  unfold fun_minus in |- ×.
  auto.
Qed.

Remark aux4 :
  t : Site Site queue Message,
 sigma2_table Site LS LS (queue Message)
   (fun (s1 s2 : Site) (q : queue Message) ⇒
    (cardinal q -
     sigma_but Site owner eq_site_dec LS (fun s : Siterooted s s1 s2 q))%Z)
   t =
 sigma2_table Site LS LS (queue Message)
   (fun (s1 s2 : Site) (q : queue Message) ⇒
    reduce Message
      (fun a : Message
       (cardinal_count a -
        sigma_but Site owner eq_site_dec LS
          (fun s : Siterooted_fun s s1 s2 a))%Z) q) t.
Proof.
  intros.
  unfold sigma2_table in |- ×.
  apply sigma_table_simpl.
  apply funct_eq.
  intros.
  apply sigma_table_simpl2.
  intros.
  apply aux3.
Qed.

Remark aux5 :
  c : Config,
 legal c
 sigma2_table Site LS LS (queue Message)
   (fun (s1 s2 : Site) (q : queue Message) ⇒
    reduce Message
      (fun a : Message
       (cardinal_count a -
        sigma_but Site owner eq_site_dec LS
          (fun s : Siterooted_fun s s1 s2 a))%Z) q)
   (bm c) =
 (sigma2_table Site LS LS (queue Message)
    (fun (s1 s2 : Site) (q : queue Message) ⇒
     if eq_site_dec s2 owner
     then reduce Message dec_count q
     else 0) (bm c) +
  sigma2_table Site LS LS (queue Message)
    (fun (s1 s2 : Site) (q : queue Message) ⇒
     if eq_site_dec s1 owner
     then reduce Message copy_count q
     else 0) (bm c) -
  sigma2_table Site LS LS (queue Message)
    (fun (s1 s2 : Site) (q : queue Message) ⇒ reduce Message new_inc_count q)
    (bm c))%Z.

Proof.
  intros.
  rewrite <- sigma2_disjoint.
  rewrite <- sigma2_disjoint2.
  apply sigma2_table_simpl_partial.
  unfold fun_minus_site2 in |- ×.
  unfold fun_minus_site in |- ×.
  unfold fun_sum_site2 in |- ×.
  unfold fun_sum_site in |- ×.
  intros.
  generalize (not_owner_inc4 c s1 s2 H).
  generalize (inc_dec_owner4 c s1 s2 H).
  generalize (inc_dec_owner2 c s1 s2 H).
  generalize (empty_queue2 c H s1 s2 owner).
  rewrite H0.
  clear H0.
  elim d.
  intros; simpl in |- ×.
  case (eq_site_dec s2 owner).
  case (eq_site_dec s1 owner).
  intros; omega.

  intros; omega.

  case (eq_site_dec s1 owner).
  intros; omega.

  intros; omega.

  intros.
  simpl in |- ×.
  rewrite H0.
  case (eq_site_dec s2 owner).
  intro.
  case (eq_site_dec s1 owner).
  intro.
  generalize (H1 e0 e).
  intro.
  discriminate.

  intro.
  rewrite e.
  unfold cardinal_count in |- ×.
  unfold fun_sum in |- ×.
  generalize (H4 d0).
  elim d0.
  intros.
  rewrite sigma_rooted_fun3.
  simpl in |- ×.
  omega.

  intros.
  rewrite sigma_rooted_fun5.
  simpl in |- ×.
  omega.

  apply finite_site.

  apply H5.
  auto.

  simpl in |- ×.
  left; auto.

  intros.
  rewrite sigma_rooted_fun7.
  simpl in |- ×.
  omega.

  apply finite_site.

  auto.

  intros.
  case (eq_site_dec s1 owner).
  intro.
  rewrite e.
  simpl in |- ×.
  replace
   (cardinal_count d0 -
    sigma_but Site owner eq_site_dec LS
      (fun s : Siterooted_fun s owner s2 d0))%Z with
   (copy_count d0 - new_inc_count d0)%Z.
  omega.

  unfold cardinal_count in |- ×.
  unfold fun_sum in |- ×.
  generalize H3.
  elim d0.
  intros.
  rewrite sigma_rooted_fun9.
  simpl in |- ×.
  auto.

  apply finite_site.

  auto.

  intros.
  generalize (H5 e s).
  simpl in |- ×.
  intro.
  elim H6.
  left; auto.

  rewrite sigma_rooted_fun10.
  simpl in |- ×.
  auto.

  intro.
  replace
   (cardinal_count d0 -
    sigma_but Site owner eq_site_dec LS
      (fun s : Siterooted_fun s s1 s2 d0))%Z with
   (- new_inc_count d0)%Z.
  omega.

  simpl in |- ×.
  generalize (H2 n0 n).
  elim d0.
  intros.
  rewrite sigma_rooted_fun12.
  simpl in |- ×.
  auto.

  auto.

  auto.

  apply finite_site.

  intros.
  generalize (H5 s).
  simpl in |- ×.
  intro.
  elim H6.
  left; auto.

  intros.
  rewrite sigma_rooted_fun14.
  simpl in |- ×.
  auto.

  auto.

  auto.

  apply finite_site.

  intros.
  generalize (H1 H5 H6).
  intro; discriminate.

  intros.
  generalize (H2 H5 H6 s0).
  simpl in |- ×.
  intuition.

  intros.
  generalize (H3 H5 s0).
  simpl in |- ×.
  intuition.

  intros.
  generalize (H4 m s0 H5).
  simpl in |- ×.
  intro.
  apply H7.
  right; auto.
Qed.

Lemma simpl_dec_sum :
  c : Config,
 legal c
 sigma2_table Site LS LS (queue Message)
   (fun (s1 s2 : Site) (q : queue Message) ⇒
    if eq_site_dec s2 owner
    then reduce Message dec_count q
    else 0%Z) (bm c) =
 sigma_table Site LS Z (Z_id Site)
   (fun s1 : Sitereduce Message dec_count (bm c s1 owner)).

Proof.
  intros.
  unfold sigma2_table in |- ×.
  apply sigma_table_simpl.
  apply funct_eq.
  intros.
  unfold sigma_table in |- ×.
  rewrite
   (sigma_sigma_but Site owner eq_site_dec
      (fun s : Site
       match eq_site_dec s owner with
       | left _reduce Message dec_count (bm c e s)
       | right _ ⇒ 0%Z
       end)).
  replace
   (sigma_but Site owner eq_site_dec LS
      (fun s : Site
       match eq_site_dec s owner with
       | left _reduce Message dec_count (bm c e s)
       | right _ ⇒ 0%Z
       end)) with 0%Z.
  case (eq_site_dec owner owner).
  intro; auto.
  intuition.
  rewrite sigma_but_null.
  auto.
  intros.
  rewrite case_ineq.
  auto.
  auto.
  apply finite_site.
Qed.

Lemma simpl_copy_sum :
  c : Config,
 legal c
 sigma2_table Site LS LS (queue Message)
   (fun (s1 _ : Site) (q : queue Message) ⇒
    match eq_site_dec s1 owner with
    | left _reduce Message copy_count q
    | right _ ⇒ 0%Z
    end) (bm c) =
 sigma_table Site LS Z (Z_id Site)
   (fun s2 : Sitereduce Message copy_count (bm c owner s2)).
Proof.
  intros.
  unfold sigma2_table in |- ×.
  unfold sigma in |- ×.
  unfold sigma_table in |- ×.
  rewrite
   (sigma_sigma_but Site owner eq_site_dec
      (fun s : Site
       Z_id Site s
         (sigma Site LS
            (fun s0 : Site
             match eq_site_dec s owner with
             | left _reduce Message copy_count (bm c s s0)
             | right _ ⇒ 0%Z
             end)))).
  rewrite Z_id_reduce.
  replace
   (sigma_but Site owner eq_site_dec LS
      (fun s : Site
       Z_id Site s
         (sigma Site LS
            (fun s0 : Site
             match eq_site_dec s owner with
             | left _reduce Message copy_count (bm c s s0)
             | right _ ⇒ 0%Z
             end)))) with 0%Z.
  simpl in |- ×.
  apply sigma_simpl.
  intros.
  rewrite case_eq.
  rewrite Z_id_reduce.
  auto.

  rewrite sigma_but_null.
  auto.

  intros.
  rewrite Z_id_reduce.
  case (eq_site_dec s owner).
  intro; elim H0; auto.

  intro.
  apply sigma_null.

  apply finite_site.
Qed.

Lemma no_inc_dec :
  q : queue Message,
 ( s0 : Site, ¬ In_queue Message (inc_dec s0) q)
 reduce Message new_inc_count q = 0%Z.
Proof.
  simple induction q.
  simpl in |- ×.
  auto.

  simpl in |- ×.
  intros d q0 H.
  elim d.
  simpl in |- ×.
  intro.
  rewrite H.
  auto.

  intro.
  generalize (H0 s0).
  intuition.

  simpl in |- ×.
  intro.
  intro.
  generalize (H0 s).
  intro.
  elim H1; left; auto.

  simpl in |- ×.
  intro.
  rewrite H.
  auto.

  intro.
  generalize (H0 s0).
  intuition.
Qed.

Lemma simpl_inc_sum :
  c : Config,
 legal c
 sigma2_table Site LS LS (queue Message)
   (fun (_ _ : Site) (q : queue Message) ⇒ reduce Message new_inc_count q)
   (bm c) =
 sigma_table Site LS Z (Z_id Site)
   (fun s1 : Sitereduce Message new_inc_count (bm c s1 owner)).

Proof.
  intros.
  unfold sigma2_table in |- ×.
  generalize (inc_dec_owner2 c).
  generalize (inc_dec_owner3 c).
  generalize (bm c).
  intros.
  apply sigma_table_simpl.
  apply funct_eq.
  intros.
  unfold sigma_table in |- ×.
  case (eq_site_dec e owner).
  intro.
  rewrite
   (sigma_sigma_but Site owner eq_site_dec
      (fun s : Sitereduce Message new_inc_count (b e s)))
   .
  replace
   (sigma_but Site owner eq_site_dec LS
      (fun s : Sitereduce Message new_inc_count (b e s))) with 0%Z.
  omega.

  rewrite sigma_but_null.
  auto.

  intros.
  generalize (H0 e s H H2).
  intro.
  apply no_inc_dec.
  auto.

  apply finite_site.

  intro.
  rewrite
   (sigma_sigma_but Site owner eq_site_dec
      (fun s : Sitereduce Message new_inc_count (b e s)))
   .
  replace
   (sigma_but Site owner eq_site_dec LS
      (fun s : Sitereduce Message new_inc_count (b e s))) with 0%Z.
  auto.

  rewrite sigma_but_null.
  auto.

  intros.
  generalize (H1 e s H n H2).
  intro.
  apply no_inc_dec.
  auto.

  apply finite_site.
Qed.

Remark add_reduce :
  x y a u w z : Z,
 (y - a)%Z = (z + w - u)%Z (x + y - a - 1)%Z = (x + z + w - u - 1)%Z.
Proof.
intros; omega.
Qed.

Lemma invariant4 :
  c : Config,
 legal c
 st c owner =
 (sigma_receive_table (rt c) +
  sigma_table Site LS Z (Z_id Site)
    (fun s1 : Sitereduce Message dec_count (bm c s1 owner)) +
  sigma_table Site LS Z (Z_id Site)
    (fun s2 : Sitereduce Message copy_count (bm c owner s2)) -
  sigma_table Site LS Z (Z_id Site)
    (fun s1 : Sitereduce Message new_inc_count (bm c s1 owner)) - 1)%Z.
Proof.
  intros.
  rewrite (aux1 c H).
  rewrite aux2.
  unfold sigma_weight in |- ×.
  unfold sigma_rooted in |- ×.
  rewrite sigma2_sigma_but.
  apply add_reduce.
  rewrite <- sigma2_disjoint2.
  unfold fun_minus_site2 in |- ×.
  unfold fun_minus_site in |- ×.
  rewrite aux4.
  rewrite aux5.
  rewrite simpl_dec_sum.
  rewrite simpl_copy_sum.
  rewrite simpl_inc_sum.
  auto.
  auto.
  auto.
  auto.
  auto.
  auto.
Qed.

End INVARIANT4.