sig
  type state = State.t
  type label = TransLabel.t
  module Repr :
    sig
      type state = state
      type label = label
      type attr = unit
      type transition = state * label * state
      type itransition = label * state
      type t
      module State :
        sig
          type t = state
          val compare : t -> t -> int
          val to_string : t -> string
        end
      module Label :
        sig
          type t = label
          val compare : t -> t -> int
          val to_string : t -> string
        end
      module Attr : sig type t = attr val to_string : t -> string end
      module States :
        sig
          type elt = state
          type 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 compare : t -> t -> int
          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 min_elt_opt : t -> elt option
          val max_elt : t -> elt
          val max_elt_opt : t -> elt option
          val choose : t -> elt
          val choose_opt : t -> elt option
          val split : elt -> t -> t * bool * t
          val find : elt -> t -> elt
          val find_opt : elt -> t -> elt option
          val find_first : (elt -> bool) -> t -> elt
          val find_first_opt : (elt -> bool) -> t -> elt option
          val find_last : (elt -> bool) -> t -> elt
          val find_last_opt : (elt -> bool) -> t -> elt option
          val of_list : elt list -> t
          module Elt :
            sig
              type t = elt
              val compare : t -> t -> int
              val to_string : t -> string
            end
          val map : (elt -> elt) -> t -> t
          val power : t -> t list
          val extract : t -> elt * t
          val to_string : t -> string
        end
      module Attrs :
        sig
          type key = state
          type +'a t
          val empty : 'a t
          val is_empty : 'a t -> bool
          val mem : key -> 'a t -> bool
          val add : key -> '-> 'a t -> 'a t
          val update : key -> ('a option -> 'a option) -> 'a t -> 'a t
          val singleton : key -> '-> 'a t
          val remove : key -> 'a t -> 'a t
          val merge :
            (key -> 'a option -> 'b option -> 'c option) ->
            'a t -> 'b t -> 'c t
          val union : (key -> '-> '-> 'a option) -> 'a t -> 'a t -> 'a t
          val compare : ('-> '-> int) -> 'a t -> 'a t -> int
          val equal : ('-> '-> bool) -> 'a t -> 'a t -> bool
          val iter : (key -> '-> unit) -> 'a t -> unit
          val fold : (key -> '-> '-> 'b) -> 'a t -> '-> 'b
          val for_all : (key -> '-> bool) -> 'a t -> bool
          val exists : (key -> '-> bool) -> 'a t -> bool
          val filter : (key -> '-> bool) -> 'a t -> 'a t
          val partition : (key -> '-> bool) -> 'a t -> 'a t * 'a t
          val cardinal : 'a t -> int
          val bindings : 'a t -> (key * 'a) list
          val min_binding : 'a t -> key * 'a
          val min_binding_opt : 'a t -> (key * 'a) option
          val max_binding : 'a t -> key * 'a
          val max_binding_opt : 'a t -> (key * 'a) option
          val choose : 'a t -> key * 'a
          val choose_opt : 'a t -> (key * 'a) option
          val split : key -> 'a t -> 'a t * 'a option * 'a t
          val find : key -> 'a t -> 'a
          val find_opt : key -> 'a t -> 'a option
          val find_first : (key -> bool) -> 'a t -> key * 'a
          val find_first_opt : (key -> bool) -> 'a t -> (key * 'a) option
          val find_last : (key -> bool) -> 'a t -> key * 'a
          val find_last_opt : (key -> bool) -> 'a t -> (key * 'a) option
          val map : ('-> 'b) -> 'a t -> 'b t
          val mapi : (key -> '-> 'b) -> 'a t -> 'b t
        end
      module Tree :
        sig
          type node = state
          type edge = label
          type t = Empty | Node of node * (t * edge) list
          val fold : (node -> node -> node) -> node -> t -> node
          val dot_output :
            string ->
            string -> ?options:Utils.Dot.graph_style list -> t -> unit
          val dot_view :
            string ->
            ?options:Utils.Dot.graph_style list ->
            ?dir:string -> ?cmd:string -> t -> int
        end
      val states : t -> States.t
      val states' : t -> (state * attr) list
      val istates : t -> States.t
      val istates' : t -> state list
      val transitions : t -> transition list
      val itransitions : t -> itransition list
      val string_of_state : state -> string
      val string_of_label : label -> string
      val string_of_attr : attr -> string
      val is_state : t -> state -> bool
      val is_init_state : t -> state -> bool
      val is_reachable : t -> state -> bool
      val is_transition : t -> transition -> bool
      val succs : t -> state -> States.t
      val succs' : t -> state -> (state * label) list
      val preds : t -> state -> States.t
      val preds' : t -> state -> (state * label) list
      val succs_hat : t -> state -> States.t
      val preds_hat : t -> state -> States.t
      val attr_of : t -> state -> attr
      val empty : t
      val create :
        states:(state * attr) list ->
        itrans:(label * state) list ->
        trans:(state * label * state) list -> t
      val add_state : state * attr -> t -> t
      exception Invalid_state of state
      val add_transition : state * label * state -> t -> t
      val add_itransition : label * state -> t -> t
      val remove_state : state -> t -> t
      val iter_states : (state -> attr -> unit) -> t -> unit
      val fold_states : (state -> attr -> '-> 'a) -> t -> '-> 'a
      val iter_transitions : (transition -> unit) -> t -> unit
      val fold_transitions : (transition -> '-> 'a) -> t -> '-> 'a
      val iter_itransitions : (itransition -> unit) -> t -> unit
      val fold_itransitions : (itransition -> '-> 'a) -> t -> '-> 'a
      val fold_succs : t -> state -> (state -> label -> '-> 'a) -> '-> 'a
      val iter_succs : t -> state -> (state -> label -> unit) -> unit
      val fold_preds : t -> state -> (state -> label -> '-> 'a) -> '-> 'a
      val iter_preds : t -> state -> (state -> label -> unit) -> unit
      val map_state : (state -> state) -> t -> t
      val map_attr : (attr -> attr) -> t -> t
      val map_label : (label -> label) -> t -> t
      val clean : t -> t
      val unwind : int -> t -> Tree.t list
      val dot_output :
        string ->
        ?fname:string ->
        ?options:Utils.Dot.graph_style list ->
        ?marked_states:(state * Utils.Dot.node_style) list ->
        ?extra_nodes:(string * Utils.Dot.node_style) list ->
        ?implicit_transitions:transition list -> t -> unit
      val dot_output_oc :
        string ->
        out_channel ->
        ?options:Utils.Dot.graph_style list ->
        ?marked_states:(state * Utils.Dot.node_style) list ->
        ?extra_nodes:(string * Utils.Dot.node_style) list ->
        ?implicit_transitions:transition list -> t -> unit
      val dot_output_execs :
        string ->
        ?fname:string ->
        ?options:Utils.Dot.graph_style list -> int -> t -> unit
      val tex_output :
        string ->
        ?fname:string -> ?listed_transitions:label list option -> t -> unit
    end
  type t = Repr.t
  val repr_of : t -> Repr.t
  val of_repr : Repr.t -> t
  type transition = state * label * state
  type itransition = label * state
  module State :
    sig
      type t = state
      val compare : t -> t -> int
      val to_string : t -> string
    end
  module Label :
    sig
      type t = label
      val compare : t -> t -> int
      val to_string : t -> string
    end
  module States :
    sig
      type elt = state
      type 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 compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val map : (elt -> elt) -> t -> t
      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 min_elt_opt : t -> elt option
      val max_elt : t -> elt
      val max_elt_opt : t -> elt option
      val choose : t -> elt
      val choose_opt : t -> elt option
      val split : elt -> t -> t * bool * t
      val find : elt -> t -> elt
      val find_opt : elt -> t -> elt option
      val find_first : (elt -> bool) -> t -> elt
      val find_first_opt : (elt -> bool) -> t -> elt option
      val find_last : (elt -> bool) -> t -> elt
      val find_last_opt : (elt -> bool) -> t -> elt option
      val of_list : elt list -> t
    end
  val states : t -> States.t
  val states' : t -> state list
  val istates : t -> States.t
  val istates' : t -> state list
  val transitions : t -> transition list
  val itransitions : t -> itransition list
  val string_of_state : state -> string
  val string_of_label : label -> string
  val string_of_transition : transition -> string
  val is_state : t -> state -> bool
  val is_init_state : t -> state -> bool
  val is_reachable : t -> state -> bool
  val is_transition : t -> transition -> bool
  val succs : t -> state -> States.t
  val succs' : t -> state -> (state * label) list
  val preds : t -> state -> States.t
  val preds' : t -> state -> (state * label) list
  val succs_hat : t -> state -> States.t
  val preds_hat : t -> state -> States.t
  val empty : t
  val create :
    states:state list ->
    itrans:(label * state) list -> trans:(state * label * state) list -> t
  val add_state : state -> t -> t
  exception Invalid_state of state
  val add_transition : state * label * state -> t -> t
  val add_itransition : label * state -> t -> t
  val remove_state : state -> t -> t
  val iter_states : (state -> unit) -> t -> unit
  val fold_states : (state -> '-> 'a) -> t -> '-> 'a
  val iter_transitions : (transition -> unit) -> t -> unit
  val fold_transitions : (transition -> '-> 'a) -> t -> '-> 'a
  val iter_itransitions : (itransition -> unit) -> t -> unit
  val fold_itransitions : (itransition -> '-> 'a) -> t -> '-> 'a
  val fold_succs : t -> state -> (state -> label -> '-> 'a) -> '-> 'a
  val iter_succs : t -> state -> (state -> label -> unit) -> unit
  val fold_preds : t -> state -> (state -> label -> '-> 'a) -> '-> 'a
  val iter_preds : t -> state -> (state -> label -> unit) -> unit
  val map_label : (label -> label) -> t -> t
  val clean : t -> t
  val dot_output :
    string ->
    ?fname:string ->
    ?options:Utils.Dot.graph_style list ->
    ?marked_states:(state * Utils.Dot.node_style) list ->
    ?extra_nodes:(string * Utils.Dot.node_style) list ->
    ?implicit_transitions:transition list -> t -> unit
  val dot_output_oc :
    string ->
    out_channel ->
    ?options:Utils.Dot.graph_style list ->
    ?marked_states:(state * Utils.Dot.node_style) list ->
    ?extra_nodes:(string * Utils.Dot.node_style) list ->
    ?implicit_transitions:transition list -> t -> unit
  val dot_output_execs :
    string ->
    ?fname:string -> ?options:Utils.Dot.graph_style list -> int -> t -> unit
  val tex_output :
    string ->
    ?fname:string -> ?listed_transitions:label list option -> t -> unit
end