Contribution: DistributedReferenceCounting

Library DistributedReferenceCounting.machine0.counting



Require Export DistributedReferenceCounting.machine0.machine.

Section CONTROL.


Variable s0 : Site.

Definition ctrl_copy (s1 : Site) (bom : Bag_of_message) :=
  card_mess copy (bom s0 s1).

Definition ctrl_dec (s1 : Site) (bom : Bag_of_message) :=
  card_mess dec (bom s1 s0).

Definition ctrl_inc (s1 : Site) (bom : Bag_of_message) :=
  card_mess (inc_dec s0) (bom s1 owner).

Definition sigma_ctrl_copy (bom : Bag_of_message) :=
  sigma Site LS (fun si : Site => ctrl_copy si bom).

Definition sigma_ctrl_dec (bom : Bag_of_message) :=
  sigma Site LS (fun si : Site => ctrl_dec si bom).

Definition sigma_ctrl_inc (bom : Bag_of_message) :=
  sigma Site LS (fun si : Site => ctrl_inc si bom).

Definition sigma_ctrl (bom : Bag_of_message) :=
  (sigma_ctrl_copy bom + sigma_ctrl_dec bom + sigma_ctrl_inc bom)%Z.

End CONTROL.

Section CONTROL_POS.


Variable bom : Bag_of_message.

Lemma ctrl_copy_pos : forall s0 s1 : Site, (ctrl_copy s0 s1 bom >= 0)%Z.
Proof.
 intros; unfold ctrl_copy in |- *; apply pos_card_mess.
Qed.

Lemma ctrl_dec_pos : forall s0 s1 : Site, (ctrl_dec s0 s1 bom >= 0)%Z.
Proof.
 intros; unfold ctrl_dec in |- *; apply pos_card_mess.
Qed.

Remark ctrl_inc_pos : forall s0 s1 : Site, (ctrl_inc s0 s1 bom >= 0)%Z.
Proof.
 intros; unfold ctrl_inc in |- *; apply pos_card_mess.
Qed.

Remark ctrl_inc_strct_pos :
 forall s0 s1 : Site,
 In_queue Message (inc_dec s0) (bom s1 owner) -> (ctrl_inc s0 s1 bom > 0)%Z.
Proof.
 unfold ctrl_inc in |- *; intros; apply strct_pos_card_mess; trivial.
Qed.

Remark sigma_ctrl_copy_pos :
 forall s0 : Site, (sigma_ctrl_copy s0 bom >= 0)%Z.
Proof.
 intro; unfold sigma_ctrl_copy in |- *; apply sigma_pos; intro;
  apply ctrl_copy_pos.
Qed.

Remark sigma_ctrl_dec_pos : forall s0 : Site, (sigma_ctrl_dec s0 bom >= 0)%Z.
Proof.
 intro; unfold sigma_ctrl_dec in |- *; apply sigma_pos; intro;
  apply ctrl_dec_pos.
Qed.

Remark sigma_ctrl_inc_strct_pos :
 forall s0 s1 : Site,
 In_queue Message (inc_dec s0) (bom s1 owner) ->
 (sigma_ctrl_inc s0 bom > 0)%Z.
Proof.
 intros; unfold sigma_ctrl_inc in |- *.
 generalize
  (le_sigma Site LS (fun si : Site => ctrl_inc s0 si bom) s1
     (ctrl_inc_pos s0) (in_s_LS s1)); intros.
 generalize (ctrl_inc_strct_pos s0 s1 H); intro; omega.
Qed.

Lemma sigma_ctrl_strct_pos :
 forall s0 s1 : Site,
 In_queue Message (inc_dec s0) (bom s1 owner) -> (sigma_ctrl s0 bom > 0)%Z.
Proof.
 intros; unfold sigma_ctrl in |- *.
 generalize (sigma_ctrl_copy_pos s0); intro.
 generalize (sigma_ctrl_dec_pos s0); intro.
 generalize (sigma_ctrl_inc_strct_pos s0 s1 H); intro.
 omega.
Qed.

End CONTROL_POS.

Section XY.


Variable c0 : Config.

Definition xi (s0 : Site) :=
  (Int (rt c0 s0) + ctrl_copy owner s0 (bm c0) + ctrl_dec owner s0 (bm c0))%Z.

Definition yi (s0 : Site) :=
  sigma Site LS (fun s' : Site => ctrl_inc s' s0 (bm c0)).

Definition sigma_xi := sigma Site LS (fun s' : Site => xi s').

Definition sigma_yi := sigma Site LS (fun s' : Site => yi s').

End XY.

Section ALT_CTRL.


Remark S_card_mess :
 forall (q0 : queue Message) (m : Message),
 card_mess m (input Message m q0) = (card_mess m q0 + 1)%Z.
Proof.
 intros; unfold card_mess in |- *; apply input_S_card; trivial.
Qed.

Remark card_mess_diff :
 forall (q0 : queue Message) (m m' : Message),
 m <> m' -> card_mess m (input Message m' q0) = card_mess m q0.
Proof.
 intros; unfold card_mess in |- *; apply input_diff_card; trivial.
Qed.

Remark S_sigma_card_inc :
 forall (s0 : Site) (q0 : queue Message),
 sigma Site LS
   (fun s' : Site => card_mess (inc_dec s') (input Message (inc_dec s0) q0)) =
 (sigma Site LS (fun s' : Site => card_mess (inc_dec s') q0) + 1)%Z.
Proof.
 intros; apply sigma__S with (eq_E_dec := eq_site_dec) (x0 := s0).
 exact finite_site.

 apply S_card_mess.

 intros; apply card_mess_diff; injection; auto.
Qed.

Remark diff_sigma_card_inc :
 forall q0 : queue Message,
 sigma Site LS
   (fun s' : Site => card_mess (inc_dec s') (input Message dec q0)) =
 sigma Site LS (fun s' : Site => card_mess (inc_dec s') q0).
Proof.
 intros; apply sigma_simpl.
 intros; apply card_mess_diff.
 discriminate.
Qed.

Lemma alt_dec_inc :
 forall q0 : queue Message,
 alternate q0 ->
 (card_mess dec q0 + 1 >=
  sigma Site LS (fun s' : Site => card_mess (inc_dec s') q0))%Z.
Proof.
 intros; elim H; intros.
 simpl in |- *; rewrite sigma_null; omega.

 rewrite card_mess_diff.
 rewrite S_sigma_card_inc.
 simpl in |- *; rewrite sigma_null; omega.

 discriminate.

 rewrite S_card_mess.
 rewrite diff_sigma_card_inc.
 omega.

 rewrite card_mess_diff.
 rewrite S_card_mess.
 rewrite S_sigma_card_inc.
 rewrite diff_sigma_card_inc.
 omega.

 discriminate.
Qed.

Lemma D_dec_inc :
 forall q0 : queue Message,
 alternate q0 ->
 D_queue q0 ->
 (card_mess dec q0 >=
  sigma Site LS (fun s' : Site => card_mess (inc_dec s') q0))%Z.
Proof.
 intros q0 H; elim H; intros.
 simpl in |- *; rewrite sigma_null; omega.

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

 trivial.

 rewrite S_card_mess.
 rewrite diff_sigma_card_inc.
 apply alt_dec_inc; trivial.

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

 trivial.
Qed.

End ALT_CTRL.