let solve_all (graph : graph) : outcome =
let add oc g = match oc with
| UnSat -> Sat [g]
| Sat gl -> Sat (g::gl) in
let rec walk_all queue sol = match queue with
| [] -> sol
| q::qs when not (has_work_left q) && is_satisfying q -> walk_all qs (add sol q)
| q::qs when not (has_work_left q) -> walk_all qs sol
| q::qs -> walk_all (qs @ (solve_step q)) sol
in
walk_all [graph] UnSat