let complement (dfa : nfa) : unit =
  let newfinal = new_state dfa in
    iter (fun q ->
            let rhs = which_states ~create:false dfa.epsilon q in
              if empty rhs then
                add_trans dfa q Epsilon newfinal
              else 
                Hashtbl.remove dfa.epsilon q) dfa.q;
    Hashtbl.remove dfa.epsilon dfa.f;
    Hashtbl.remove dfa.epsilon newfinal;
    dfa.f <- newfinal