let backward_reachable (nfa : nfa)
(s : state) : state hashset =
let mapping = backward_mapping nfa in
let mapped x =
let neighbors = try Hashtbl.find mapping x with Not_found -> (create 0) in
fold (fun x acc -> x::acc) neighbors []
in
let visited = create (size nfa.q) in
let rec walk q =
match q with
| x::xs when not (mem visited x) ->
add visited x;
walk (List.rev_append (mapped x) xs)
| x::xs -> walk xs
| _ -> ()
in
walk [s];
visited