(* une configuration est un etat de la machine a un instant donne,
bien qu'il n'y ait pas d'horloge globale ou plus exactement que les
transitions ne soient pas deterministes, la variable time permet
d'ordonner les transitions et donc de dater le dernier positionnement
du drapeau rt sur chaque site *)

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}.Record Config : Set := mkconfig
  {time : nat;
   dt : Date_table;
   st : Send_table;
   rt : Rec_table;
   bm : Bag_of_message}.Record Config : Set := mkconfig
  {time : nat;
   dt : Date_table;
   st : Send_table;
   rt : Rec_table;
   bm : Bag_of_message}.Record Config : Set := mkconfig
  {time : nat;
   dt : Date_table;
   st : Send_table;
   rt : Rec_table;
   bm : Bag_of_message}.Record Config : Set := mkconfig
  {time : nat;
   dt : Date_table;
   st : Send_table;
   rt : Rec_table;
   bm : Bag_of_message}.Record Config : Set := mkconfig
  {time : nat;
   dt : Date_table;
   st : Send_table;
   rt : Rec_table;
   bm : Bag_of_message}.Record Config : Set := mkconfig
  {time : nat;
   dt : Date_table;
   st : Send_table;
   rt : Rec_table;
   bm : Bag_of_message}.(* la nature de la file d'attente entre un site et l'owner est
particuliere. C'est une alternance de messages dec et inc_dec dans
laquelle les messages inc_dec sont isoles. De plus l'information
pernmettant de savoir qu'une file est vide ou commence par un message
dec est utile car elle est caracteristique d'un site ayant son drapeau
rt non positionne *)

Inductive D_queue : queue Message -> Prop :=
  | D_empty : D_queue (empty Message)
  | D_dec : forall qm : queue Message, D_queue (input Message dec qm).(* la nature de la file d'attente entre un site et l'owner est
particuliere. C'est une alternance de messages dec et inc_dec dans
laquelle les messages inc_dec sont isoles. De plus l'information
pernmettant de savoir qu'une file est vide ou commence par un message
dec est utile car elle est caracteristique d'un site ayant son drapeau
rt non positionne *)

Inductive D_queue : queue Message -> Prop :=
  | D_empty : D_queue (empty Message)
  | D_dec : forall qm : queue Message, D_queue (input Message dec qm).(* la nature de la file d'attente entre un site et l'owner est
particuliere. C'est une alternance de messages dec et inc_dec dans
laquelle les messages inc_dec sont isoles. De plus l'information
pernmettant de savoir qu'une file est vide ou commence par un message
dec est utile car elle est caracteristique d'un site ayant son drapeau
rt non positionne *)

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)).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)).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)).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)).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)).

(* Specifications: *)
Lemma not_D_queue : forall (q0 : queue Message) (s0 : Site), ~ D_queue (input Message (inc_dec s0) q0).
Lemma D_first_out : forall q0 : queue Message, D_queue q0 -> D_queue (first_out Message q0).
Lemma alt_first_out : forall q0 : queue Message, alternate q0 -> alternate (first_out Message q0).