sig
  type state
  type letter
  module StateSet : Set.S
  module Alphabet : Set.S
  module StateToTransitionMap : Map.S
  module TransitionMap : Map.S
  type nfa = {
    mutable nfa_states : StateSet.t;
    mutable nfa_alphabet : Alphabet.t;
    mutable nfa_start_state : StateSet.elt option;
    mutable nfa_final_states : StateSet.t;
    mutable nfa_transitions :
      StateSet.t TransitionMap.t StateToTransitionMap.t;
  }
  val nfa_empty : Nfa.NFA.nfa
  val fresh_nfa_empty : unit -> Nfa.NFA.nfa
  val get_nfa_alphabet : Nfa.NFA.nfa -> Alphabet.t
  val add_letter : Nfa.NFA.nfa -> Alphabet.elt -> unit
  val add_all_letters : Nfa.NFA.nfa -> Alphabet.t -> unit
  val get_nfa_states : Nfa.NFA.nfa -> StateSet.t
  val get_nfa_start_state : Nfa.NFA.nfa -> StateSet.elt option
  val get_nfa_final_states : Nfa.NFA.nfa -> StateSet.t
  val add_state : Nfa.NFA.nfa -> StateSet.elt -> unit
  val set_start_state : Nfa.NFA.nfa -> StateSet.elt -> unit
  val set_final_states : Nfa.NFA.nfa -> StateSet.t -> unit
  val add_final_state : Nfa.NFA.nfa -> StateSet.elt -> unit
  val get_nfa_transitions :
    Nfa.NFA.nfa -> StateSet.t TransitionMap.t StateToTransitionMap.t
  val get_TransitionMap :
    Nfa.NFA.nfa -> StateToTransitionMap.key -> StateSet.t TransitionMap.t
  val get_destStateSet : 'TransitionMap.t -> TransitionMap.key -> 'a
  val get_destStateSet_s :
    Nfa.NFA.nfa ->
    StateToTransitionMap.key -> TransitionMap.key -> StateSet.t
  val add_transitions_aux :
    Nfa.NFA.nfa ->
    StateToTransitionMap.key -> Alphabet.elt * StateSet.elt -> unit
  val add_transitions :
    Nfa.NFA.nfa -> StateSet.elt -> (Alphabet.elt * StateSet.elt) list -> unit
  val print_automata :
    Nfa.NFA.nfa -> (Alphabet.elt -> unit) -> (StateSet.elt -> unit) -> unit
  val empty : Nfa.NFA.nfa -> bool
end