Library DistributedReferenceCounting.machine1.invariant1


Require Export DistributedReferenceCounting.machine1.machine.
Require Export DistributedReferenceCounting.machine1.cardinal.
Require Export DistributedReferenceCounting.machine1.comm.

Section INVARIANT1.

Lemma invariant1_init :
 sigma_send_table send_init =
 (sigma_receive_table rec_init + sigma_weight bag_init)%Z.
Proof.
  unfold send_init, rec_init, bag_init in |- ×.
  unfold sigma_send_table, sigma_receive_table, sigma_weight in |- ×.
  unfold sigma_table in |- ×.
  simpl in |- ×.
  rewrite sigma_null.
  replace
   (sigma2_table Site LS LS (queue Message) (fun _ _ : Sitecardinal)
      (fun _ _ : Siteempty Message)) with 0%Z.
  omega.

  unfold sigma2_table in |- ×.
  unfold sigma_table in |- ×.
  symmetry in |- ×.
  simpl in |- ×.
  rewrite sigma_null.
  apply sigma_null.
Qed.

Lemma invariant1_inductive :
  (c : Config) (t : class_trans c),
 legal c
 sigma_send_table (st c) =
 (sigma_receive_table (rt c) + sigma_weight (bm c))%Z
 sigma_send_table (st (transition c t)) =
 (sigma_receive_table (rt (transition c t)) +
  sigma_weight (bm (transition c t)))%Z.

Proof.
  simple induction t.


  intros; simpl in |- ×.
  rewrite sigma_weight_post_message.
  rewrite sigma_inc_send_table.
  unfold cardinal_count in |- *; unfold fun_sum in |- *; simpl in |- ×.
  rewrite H0; omega.


  intros; simpl in |- ×.
  rewrite (sigma_weight_collect_message dec).
  rewrite sigma_dec_send_table.
  unfold cardinal_count in |- *; unfold fun_sum in |- *; simpl in |- ×.
  rewrite H0; omega.
  auto.


  intros; simpl in |- ×.
  rewrite sigma_weight_post_message.
  rewrite sigma_inc_send_table.
  rewrite sigma_weight_collect_message with (m := inc_dec s3).
  unfold cardinal_count in |- *; unfold fun_sum in |- *; simpl in |- ×.
  rewrite H0; omega.
  auto.


  intros; simpl in |- ×.
  rewrite sigma_weight_post_message.
  rewrite sigma_weight_collect_message with (m := copy).
  unfold cardinal_count in |- *; unfold fun_sum in |- *; simpl in |- ×.
  rewrite H0; omega.
  auto.


  intros; simpl in |- ×.
  rewrite sigma_weight_collect_message with (m := copy).
  rewrite sigma_set_receive_table.
  unfold cardinal_count in |- *; unfold fun_sum in |- *; simpl in |- ×.
  rewrite H0; omega.
  auto.
  auto.


  intros; simpl in |- ×.
  rewrite sigma_weight_post_message.
  rewrite sigma_weight_collect_message with (m := copy).
  rewrite sigma_set_receive_table.
  unfold cardinal_count in |- *; unfold fun_sum in |- *; simpl in |- ×.
  rewrite H0; omega.
  auto.
  auto.


  intros; simpl in |- ×.
  rewrite sigma_weight_post_message.
  rewrite sigma_reset_receive_table.
  unfold cardinal_count in |- *; unfold fun_sum in |- *; simpl in |- ×.
  rewrite H0; omega.
  auto.
Qed.

Lemma invariant1 :
  c : Config,
 legal c
 sigma_send_table (st c) =
 (sigma_receive_table (rt c) + sigma_weight (bm c))%Z.
Proof.
  intros.
  elim H.
  apply invariant1_init.
  exact invariant1_inductive.
Qed.

End INVARIANT1.