Definition Client_index := (fin num_Clients).Inductive Name :=
  | Client : Client_index -> Name
  | Server : Name.Inductive Name :=
  | Client : Client_index -> Name
  | Server : Name.Inductive Name :=
  | Client : Client_index -> Name
  | Server : Name.Definition list_Clients := map Client (all_fin num_Clients).Definition Name_eq_dec : forall a b : Name, {a = b} + {a <> b}.Inductive Msg :=
  | Lock   : Msg
  | Unlock : Msg
  | Locked : Msg.Inductive Msg :=
  | Lock   : Msg
  | Unlock : Msg
  | Locked : Msg.Inductive Msg :=
  | Lock   : Msg
  | Unlock : Msg
  | Locked : Msg.Inductive Msg :=
  | Lock   : Msg
  | Unlock : Msg
  | Locked : Msg.Definition Msg_eq_dec : forall a b : Msg, {a = b} + {a <> b}.Definition Input := Msg.Definition Output := Msg.Record Data := mkData { queue : list Client_index ; held : bool }.Record Data := mkData { queue : list Client_index ; held : bool }.Record Data := mkData { queue : list Client_index ; held : bool }.Record Data := mkData { queue : list Client_index ; held : bool }.Definition Handler (S : Type) := GenHandler (Name * Msg) S Output unit.Definition ServerIOHandler (m : Msg) : Handler Data := nop.Definition NetHandler (nm src : Name) (m : Msg) : Handler Data :=
    match nm with
      | Client c => ClientNetHandler c m
      | Server   => ServerNetHandler src m
    end.Definition InputHandler (nm : Name) (m : Msg) : Handler Data :=
    match nm with
      | Client c => ClientIOHandler c m
      | Server   => ServerIOHandler m
    end.Ltac handler_unfold :=
    repeat (monad_unfold; unfold NetHandler,
                                 InputHandler,
                                 ServerNetHandler,
                                 ClientNetHandler,
                                 ClientIOHandler,
                                 ServerIOHandler in *).Definition Nodes := Server :: list_Clients.

(* Specifications: *)
Theorem In_n_Nodes : forall n : Name, In n Nodes.
Theorem nodup : NoDup Nodes.