Contribution: DistributedReferenceCounting

Library DistributedReferenceCounting.machine0.machine




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

Section MACHINE.


Parameter Site : Set.

Parameter owner : Site.

Axiom eq_site_dec : eq_dec Site.

Definition change_site (E : Set) := change_x0 Site E eq_site_dec.

Lemma that_site :
 forall (E : Set) (f : Site -> E) (s0 : Site) (x : E),
 change_site E f s0 x s0 = x.
Proof.
 intros; unfold change_site in |- *; apply here.
Qed.

Lemma other_site :
 forall (E : Set) (f : Site -> E) (s0 s1 : Site) (x : E),
 s0 <> s1 -> change_site E f s0 x s1 = f s1.
Proof.
 intros; unfold change_site in |- *; apply elsewhere; trivial.
Qed.


Definition eq_queue_dec := eq_couple_dec Site Site eq_site_dec eq_site_dec.

Definition change_queue (Q : Set) :=
  change_x0y0 Site Site Q eq_site_dec eq_site_dec.

Lemma that_queue :
 forall (E : Set) (f : Site -> Site -> E) (s0 s1 : Site) (x : E),
 change_queue E f s0 s1 x s0 s1 = x.
Proof.
 intros; unfold change_queue in |- *; apply here2.
Qed.

Lemma other_queue :
 forall (E : Set) (f : Site -> Site -> E) (s0 s1 s2 s3 : Site) (x : E),
 s2 <> s0 \/ s3 <> s1 -> change_queue E f s0 s1 x s2 s3 = f s2 s3.
Proof.
 intros; unfold change_queue in |- *; apply elsewhere2; trivial.
Qed.


Parameter LS : list Site.

Axiom finite_site : list_of_elements Site eq_site_dec LS.

Lemma in_s_LS : forall s : Site, In s LS.
Proof.
 intros; apply only_once_in with (eq_E_dec := eq_site_dec);
  exact (finite_site s).
Qed.

End MACHINE.

Section MESSAGES.


Inductive Message : Set :=
  | dec : Message
  | inc_dec : Site -> Message
  | copy : Message.

Theorem eq_message_dec : eq_dec Message.
Proof.
 unfold eq_dec in |- *; double induction a b; intros.
 auto.

 right; discriminate.

 right; discriminate.

 right; discriminate.

 case (eq_site_dec s0 s); intros.
 rewrite e; auto.

 right; injection; auto.

 right; discriminate.

 right; discriminate.

 right; discriminate.

 auto.
Qed.

End MESSAGES.

Section TABLES.


Definition Date_table := Site -> nat.

Definition Send_table := Site -> Z.

Definition Rec_table := Site -> bool.

End TABLES.

Section BAG.


Definition Bag_of_message := Site -> Site -> queue Message.

Definition card_mess (m : Message) (q : queue Message) :=
  card Message eq_message_dec m q.

Lemma pos_card_mess :
 forall (m : Message) (q : queue Message), (card_mess m q >= 0)%Z.
Proof.
 intros; unfold card_mess in |- *; apply card_pos.
Qed.

Lemma strct_pos_card_mess :
 forall (m : Message) (q : queue Message),
 In_queue Message m q -> (card_mess m q > 0)%Z.
Proof.
 intros; unfold card_mess in |- *; apply card_strct_pos; trivial.
Qed.

Lemma diff_or_elsewhere :
 forall (m m' : Message) (bom : Bag_of_message) (s1 s2 s3 s4 : Site),
 first Message (bom s3 s4) = value Message m ->
 m <> m' ->
 first Message (bom s1 s2) <> value Message m' \/ s1 <> s3 \/ s2 <> s4.
Proof.
 intros; case (eq_queue_dec s1 s3 s2 s4); intro.
 decompose [and] a; rewrite H1; rewrite H2; rewrite H; left; injection; auto.

 auto.
Qed.

End BAG.

Section CONFIGURATION.


Definition access (s : Site) (rt : Rec_table) := s = owner \/ rt s = true.

Record Config : Set := mkconfig
  {time : nat;
   dt : Date_table;
   st : Send_table;
   rt : Rec_table;
   bm : Bag_of_message}.

End CONFIGURATION.

Section ALT_DEF.


Inductive D_queue : queue Message -> Prop :=
  | D_empty : D_queue (empty Message)
  | D_dec : forall qm : queue Message, D_queue (input Message dec qm).

Inductive alternate : queue Message -> Prop :=
  | alt_null : alternate (empty Message)
  | alt_single_inc :
      forall s0 : Site,
      alternate (input Message (inc_dec s0) (empty Message))
  | alt_dec_alt :
      forall qm : queue Message,
      alternate qm -> alternate (input Message dec qm)
  | alt_inc_dec :
      forall (qm : queue Message) (s0 : Site),
      alternate qm ->
      alternate (input Message (inc_dec s0) (input Message dec qm)).

Lemma not_D_queue :
 forall (q0 : queue Message) (s0 : Site),
 ~ D_queue (input Message (inc_dec s0) q0).
Proof.
 intros; red in |- *; intro.
 inversion H.
Qed.

Lemma D_first_out :
 forall q0 : queue Message, D_queue q0 -> D_queue (first_out Message q0).
Proof.
 intros; elim H; simpl in |- *.
 apply D_empty.

 simple destruct qm.
 apply D_empty.

 intros; apply D_dec.
Qed.

Lemma alt_first_out :
 forall q0 : queue Message, alternate q0 -> alternate (first_out Message q0).
Proof.
 intros; elim H; simpl in |- *.
 apply alt_null.

 intro; apply alt_null.

 simple induction qm; intros.
 apply alt_null.

 apply alt_dec_alt; trivial.

 simple induction qm; intros.
 apply alt_single_inc.

 apply alt_inc_dec; trivial.
Qed.

End ALT_DEF.

Section RELAT_DEF.


Variable c0 : Config.

Inductive parent : Site -> Site -> Prop :=
    parent_intro :
      forall s1 s0 : Site,
      In_queue Message (inc_dec s1) (bm c0 s0 owner) -> parent s1 s0.

Inductive ancestor : Site -> Site -> Prop :=
  | short : forall s1 s0 : Site, parent s1 s0 -> ancestor s1 s0
  | long :
      forall s2 s1 s0 : Site,
      parent s2 s1 -> ancestor s1 s0 -> ancestor s2 s0.

End RELAT_DEF.