Contribution: DistributedReferenceCounting

Library DistributedReferenceCounting.machine3.invariant5


Require Export DistributedReferenceCounting.machine3.alternate.
Require Export DistributedReferenceCounting.machine3.invariant0.
Require Export DistributedReferenceCounting.machine3.invariant1.
Require Export DistributedReferenceCounting.machine3.invariant2.
Require Export DistributedReferenceCounting.machine3.invariant3.
Require Export DistributedReferenceCounting.machine3.invariant4.


Section INVARIANT5.



Lemma legal_alternate :
 forall (s : Site) (c : Config),
 legal c ->
 alternate (bm c s owner) /\ (rt c s = false -> D_queue (bm c s owner)).
Proof.
  intros.
  elim H.
  split.
  apply alt_null.

  simpl in |- *.
  intro.
  apply D_empty.


  simple induction t; simpl in |- *; intros.
  decompose [and] H1.
  split.
  case (eq_queue_dec s1 s s2 owner); intro.
  decompose [and] a0.
  rewrite H4; rewrite H5; rewrite post_here.
  apply alt_any_alt; auto.
  intro; discriminate.

  rewrite post_elsewhere.
  auto.

  auto.

  case (eq_site_dec s1 s); intro.
  generalize a; unfold access in |- *.
  rewrite e.
  intros.
  rewrite H4 in a0.
  discriminate.

  rewrite post_elsewhere.
  auto.

  left; auto.


  decompose [and] H1.
  split.
  apply alt_collect; auto.

  intro.
  apply D_collect; auto.


  decompose [and] H1.
  split.
  apply alt_post_elsewhere.
  right.
  apply (not_owner_inc3 c0 s1 owner H0 s3).
  apply first_in.
  auto.

  apply alt_collect; auto.

  intro.
  apply D_post_elsewhere.
  right.
  apply (not_owner_inc3 c0 s1 owner H0 s3).
  apply first_in.
  auto.

  apply D_collect.
  apply H3.
  auto.


  split.
  decompose [and] H1.
  case (eq_queue_dec s2 s s1 owner); intros.
  decompose [and] a.
  rewrite H4; rewrite H5.
  apply alt_post_any.
  intro; discriminate.

  apply alt_collect; auto.

  apply alt_post_elsewhere; auto.
  apply alt_collect; auto.

  decompose [and] H1.
  intro.
  case (eq_queue_dec s2 s s1 owner); intros; simpl in |- *.
  decompose [and] a.
  rewrite H5; rewrite H6.
  apply D_post_dec.
  apply alt_collect.
  decompose [and] H1; auto.

  rewrite post_elsewhere.
  apply D_collect.
  apply H3.
  auto.

  auto.


  decompose [and] H1; split.
  apply alt_collect; trivial.

  case (eq_site_dec s s2); intro.
  rewrite e1; unfold Set_rec_table in |- *; rewrite that_site.
  intro; discriminate.

  intro.
  apply D_collect.
  apply H3.
  generalize H4; unfold Set_rec_table in |- *; rewrite other_site; auto.


  decompose [and] H1; split.
  case (eq_site_dec s2 s); intro.
  rewrite e1; apply alt_post_inc.
  apply alt_collect; trivial.

  rewrite collect_elsewhere.
  rewrite e1 in e.
  generalize (H3 e).
  intro.
  elim H4.
  auto.

  simpl in |- *.
  intros.
  auto.

  rewrite <- e1.
  auto.

  apply alt_post_elsewhere; auto.
  apply alt_collect; trivial.

  case (eq_site_dec s s2); intro.
  rewrite e1; unfold Set_rec_table in |- *; rewrite that_site; intro;
   discriminate.

  intro.
  apply D_post_elsewhere; auto.
  apply D_collect; auto.
  apply H3.
  generalize H4; unfold Set_rec_table in |- *; rewrite other_site; auto.

  decompose [and] H1; split.
  case (eq_site_dec s0 s); intro.
  rewrite e1; apply alt_post_any; auto.
  intro; discriminate.

  apply alt_post_elsewhere; auto.

  case (eq_site_dec s0 s); intro.
  intro.
  rewrite e1.
  apply D_post_dec.
  auto.

  unfold Reset_rec_table in |- *; rewrite other_site.
  intro.
  apply D_post_elsewhere; auto.

  auto.

  decompose [and] H1; split.
  rewrite post_elsewhere.
  case (eq_site_dec s1 s); intro.
  rewrite e0.
  rewrite that_queue.
  rewrite e0 in e.
  rewrite e in H2.
  inversion H2.
  inversion H7.
  apply alt_null.

  auto.

  apply alt_any_alt.
  auto.

  auto.

  rewrite other_queue.
  auto.

  auto.

  right.
  apply (not_owner_inc3 c0 s1 owner).
  auto.

  rewrite e; simpl in |- *.
  right; left; auto.

  intro.
  rewrite post_elsewhere.
  case (eq_site_dec s1 s); intro.
  rewrite e0.
  rewrite that_queue.
  generalize (H3 H4).
  rewrite <- e0; rewrite e.
  intro.
  inversion H5.
  inversion H7.
  apply D_empty.

  generalize (H10 s2).
  intro.
  elim H12; auto.

  apply D_dec.
  auto.

  rewrite other_queue.
  apply H3; auto.

  auto.

  right.
  apply (not_owner_inc3 c0 s1 owner).
  auto.

  rewrite e.
  simpl in |- *.
  right; left; auto.
Qed.

Lemma count_inc_and_dec_alt_queue :
 forall q : queue Message,
 alternate q ->
 (reduce Message dec_count q + 1 >= reduce Message new_inc_count q)%Z.
Proof.
  intros.
  elim H.
  simpl in |- *; omega.

  intro; simpl in |- *; omega.

  simpl in |- *; intros.
  generalize H0; case m; simpl in |- *.
  intro; omega.

  intros.
  elim (H3 s); auto.

  intro; omega.

  simpl in |- *; intros.
  omega.
Qed.

Lemma count_inc_and_dec_D_queue :
 forall q : queue Message,
 alternate q ->
 D_queue q ->
 (reduce Message dec_count q >= reduce Message new_inc_count q)%Z.
Proof.
  intros q H.
  elim H; intros.
  simpl in |- *; omega.

  absurd (D_queue (input Message (inc_dec s0) (empty Message))).
  apply not_D_queue.
  discriminate.
  auto.

  generalize H3.
  case m.
  intro; simpl in |- *.
  generalize (count_inc_and_dec_alt_queue qm H1); intro; omega.

  intros.
  absurd (D_queue (input Message (inc_dec s) qm)).
  apply not_D_queue.
  discriminate.
  auto.

  intros.
  absurd (D_queue (input Message copy qm)).
  apply not_D_queue.
  discriminate.
  auto.

  absurd (D_queue (input Message (inc_dec s0) (input Message dec qm))).
  apply not_D_queue.
  discriminate.

  auto.
Qed.

Lemma copy_count_is_positive :
 forall q : queue Message, (reduce Message copy_count q >= 0)%Z.
Proof.
  intros.
  apply reduce_positive_or_null.
  intro.
  elim a; simpl in |- *; intros; omega.
Qed.

Lemma dec_count_is_positive :
 forall q : queue Message, (reduce Message dec_count q >= 0)%Z.
Proof.
  intros.
  apply reduce_positive_or_null.
  intro.
  elim a; simpl in |- *; intros; omega.
Qed.

Lemma invariant5 :
 forall c : Config,
 legal c ->
 forall s : Site,
 (Int (rt c s) + reduce Message dec_count (bm c s owner) +
  reduce Message copy_count (bm c owner s) -
  reduce Message new_inc_count (bm c s owner) >= 0)%Z.

Proof.
  intros.
  generalize (copy_count_is_positive (bm c owner s)); intro.
  generalize (legal_alternate s c H); intro.
  case (eq_bool_dec (rt c s)); intro; rewrite e; unfold Int in |- *.
  decompose [and] H1.
  generalize (count_inc_and_dec_alt_queue (bm c s owner) H2); intro.
  omega.
  decompose [and] H1.
  generalize (H3 e); intro.
  generalize (count_inc_and_dec_D_queue (bm c s owner) H2 H4); intro.
  omega.
Qed.

Let Recv_T := Site -> bool.

Lemma other_definition_for_sigma_receive_table :
 forall t : Recv_T,
 sigma_receive_table t =
 sigma_table Site LS Z (Z_id Site) (fun s : Site => Int (t s)).
Proof.
  intros.
  unfold sigma_receive_table in |- *.
  unfold sigma_table in |- *.
  unfold Z_id in |- *.
  auto.
Qed.

Remark add_reduce : forall x : Z, (x + 1 - 1)%Z = x.
Proof.
  intro; omega.
Qed.

Lemma owner_st_positive : forall c : Config, legal c -> (st c owner >= 0)%Z.
Proof.
  intros.
  rewrite (invariant4 c H).
  rewrite other_definition_for_sigma_receive_table.
  rewrite <- sigma_same_table.
  rewrite <- sigma_same_table.
  rewrite <- sigma_same_table2.
  unfold Z_id in |- *.
  unfold fun_minus in |- *.
  unfold fun_sum in |- *.
  rewrite sigma_sigma_but_owner.
  rewrite owner_rt_true.
  rewrite empty_q_to_me.
  simpl in |- *.
  simpl in |- *.
  rewrite add_reduce.
  unfold sigma_table_but_owner in |- *.
  apply sigma_but_pos.
  exact (invariant5 c H).
  auto.
  auto.
Qed.

End INVARIANT5.