sig
  module type MACHINE_TYPE =
    sig
      type t
      val name : string
      val compare : t -> t -> int
      val pair : t -> t -> t
      val of_string : string -> t
      val to_string : t -> string
      val print : ?oc:out_channel -> t -> unit
      val print_ : ?oc:out_channel -> t -> unit
      type nodeSet
      type edgeSet
      val empty : t
      val make :
        Machines.MACHINE_TYPE.nodeSet ->
        Machines.MACHINE_TYPE.nodeSet -> Machines.MACHINE_TYPE.edgeSet -> t
      val of_file : string -> t
      val to_file : string -> t -> unit
      val to_dotstring :
        ?size:string ->
        ?rd:string -> ?shape:string -> ?fs:string -> string -> t -> string
      val to_dotfile :
        ?size:string ->
        ?rd:string ->
        ?shape:string -> ?fs:string -> string -> string -> t -> unit
      val report : t -> unit
      val starts : t -> Machines.MACHINE_TYPE.nodeSet
      val finals : t -> Machines.MACHINE_TYPE.nodeSet
      val edges : t -> Machines.MACHINE_TYPE.edgeSet
      val nodes : t -> Machines.MACHINE_TYPE.nodeSet
      val is_cyclic : t -> bool
      val is_stripped : t -> bool
      val are_isomorphic : t -> t -> bool
      val equal : t -> t -> bool
      val reverse : t -> t
      val trim : t -> t
      val rename : t -> t
      val rename_n : int -> t -> t
      val inter : t -> t -> t
      val union : t -> t -> t
    end
  module Make :
    functor (Node : X.X_TYPE->
      functor
        (NodeSet : sig
                     type t
                     val name : string
                     val compare : t -> t -> int
                     val pair : t -> t -> t
                     val of_string : string -> t
                     val to_string : t -> string
                     val print : ?oc:out_channel -> t -> unit
                     val print_ : ?oc:out_channel -> t -> unit
                     type elt = Node.t
                     val of_list : elt list -> t
                     val to_file : string -> t -> unit
                     val of_file : string -> t
                     val cross : t -> t -> t
                     val empty : t
                     val is_empty : t -> bool
                     val mem : elt -> t -> bool
                     val add : elt -> t -> t
                     val singleton : elt -> t
                     val remove : elt -> t -> t
                     val union : t -> t -> t
                     val inter : t -> t -> t
                     val diff : t -> t -> t
                     val equal : t -> t -> bool
                     val subset : t -> t -> bool
                     val iter : (elt -> unit) -> t -> unit
                     val fold : (elt -> '-> 'a) -> t -> '-> 'a
                     val for_all : (elt -> bool) -> t -> bool
                     val exists : (elt -> bool) -> t -> bool
                     val filter : (elt -> bool) -> t -> t
                     val partition : (elt -> bool) -> t -> t * t
                     val cardinal : t -> int
                     val elements : t -> elt list
                     val min_elt : t -> elt
                     val max_elt : t -> elt
                     val choose : t -> elt
                     val split : elt -> t -> t * bool * t
                   end->
        functor
          (Edge : sig
                    type t
                    val name : string
                    val compare : t -> t -> int
                    val pair : t -> t -> t
                    val of_string : string -> t
                    val to_string : t -> string
                    val print : ?oc:out_channel -> t -> unit
                    val print_ : ?oc:out_channel -> t -> unit
                    type node = Node.t
                    type label
                    val origin : t -> node
                    val terminus : t -> node
                    val label : t -> label
                    val make : node -> node -> label -> t
                    val label_compare : label -> label -> int
                    val to_dotstring : t -> string
                  end->
          functor
            (EdgeSet : sig
                         type t
                         val name : string
                         val compare : t -> t -> int
                         val pair : t -> t -> t
                         val of_string : string -> t
                         val to_string : t -> string
                         val print : ?oc:out_channel -> t -> unit
                         val print_ : ?oc:out_channel -> t -> unit
                         type elt = Edge.t
                         val of_list : elt list -> t
                         val to_file : string -> t -> unit
                         val of_file : string -> t
                         val cross : t -> t -> t
                         val empty : t
                         val is_empty : t -> bool
                         val mem : elt -> t -> bool
                         val add : elt -> t -> t
                         val singleton : elt -> t
                         val remove : elt -> t -> t
                         val union : t -> t -> t
                         val inter : t -> t -> t
                         val diff : t -> t -> t
                         val equal : t -> t -> bool
                         val subset : t -> t -> bool
                         val iter : (elt -> unit) -> t -> unit
                         val fold : (elt -> '-> 'a) -> t -> '-> 'a
                         val for_all : (elt -> bool) -> t -> bool
                         val exists : (elt -> bool) -> t -> bool
                         val filter : (elt -> bool) -> t -> t
                         val partition : (elt -> bool) -> t -> t * t
                         val cardinal : t -> int
                         val elements : t -> elt list
                         val min_elt : t -> elt
                         val max_elt : t -> elt
                         val choose : t -> elt
                         val split : elt -> t -> t * bool * t
                       end->
            functor (D : Delim.DELIM_TYPE->
              sig
                type t
                val name : string
                val compare : t -> t -> int
                val pair : t -> t -> t
                val of_string : string -> t
                val to_string : t -> string
                val print : ?oc:out_channel -> t -> unit
                val print_ : ?oc:out_channel -> t -> unit
                type nodeSet = NodeSet.t
                type edgeSet = EdgeSet.t
                val empty : t
                val make : nodeSet -> nodeSet -> edgeSet -> t
                val of_file : string -> t
                val to_file : string -> t -> unit
                val to_dotstring :
                  ?size:string ->
                  ?rd:string ->
                  ?shape:string -> ?fs:string -> string -> t -> string
                val to_dotfile :
                  ?size:string ->
                  ?rd:string ->
                  ?shape:string ->
                  ?fs:string -> string -> string -> t -> unit
                val report : t -> unit
                val starts : t -> nodeSet
                val finals : t -> nodeSet
                val edges : t -> edgeSet
                val nodes : t -> nodeSet
                val is_cyclic : t -> bool
                val is_stripped : t -> bool
                val are_isomorphic : t -> t -> bool
                val equal : t -> t -> bool
                val reverse : t -> t
                val trim : t -> t
                val rename : t -> t
                val rename_n : int -> t -> t
                val inter : t -> t -> t
                val union : t -> t -> t
              end
end