let normalize_nfa (nfa : nfa) 
                  (base : int) : nfa =
  let curq = ref base in
  let qmap = Hashtbl.create (size nfa.q) in
  let convert q = try Hashtbl.find qmap q with Not_found -> 
    Hashtbl.replace qmap q !curq;
    incr curq;
    (!curq - 1) in
  let q       = create (size nfa.q) in
  let delta   = Hashtbl.create (Hashtbl.length nfa.delta) in
  let epsilon = Hashtbl.create (Hashtbl.length nfa.epsilon) in
    iter (fun s -> add q (convert s)) nfa.q;
    copy_table nfa.delta delta convert;
    copy_table nfa.epsilon epsilon convert;
    { s = convert nfa.s;
      f = convert nfa.f;
      delta = delta;
      epsilon = epsilon;
      q = q;
      next_q = !curq}