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