let solve_single (graph : graph) : outcome = 
  let rec walk queue = match queue with
    | [] -> UnSat
    | q::qs when not (has_work_left q) && is_satisfying q -> Sat [q]
    | q::qs when not (has_work_left q) -> walk qs
    | q::qs -> walk (qs @ (solve_step q)) 
  in
    walk [graph]