let state_of_string =
  let l = List.flatten
      (List.map
         (fun (s, l) -> List.map (fun str -> (str, s)) l)
         state_strings
      )
  in
  fun s ->
    try List.assoc s l
    with Not_found ->
      failwith (Printf.sprintf "Bad state string: %s" s)