| @@ -148,6 +148,19 @@ let graph () = |
| 148 | 148 | Printf.printf "unfenced graph closed: %d states, %d edges, %d violating states\n%!" |
| 149 | 149 | (Array.length graph.states) graph.edges (List.length graph.violations) |
| 150 | 150 | |
| 151 | +let constraints () = |
| 152 | + List.iter (fun (count, clauses) -> |
| 153 | + rejects (fun () -> ignore (Solver.candidate ~count ~budget:1 clauses)) |
| 154 | + "invalid fence constraint") |
| 155 | + [-1, []; 1, [[-1]]; 1, [[1]]; 0, [[0]]]; |
| 156 | + let solve count budget clauses = Solver.solve (Solver.candidate ~count ~budget clauses) in |
| 157 | + require (solve 0 0 [] = Solver.Sat []) "empty candidate set satisfies zero budget"; |
| 158 | + require (solve 0 (-1) [] = Solver.Unsat) "negative lower budget remains unsatisfiable"; |
| 159 | + require (solve 2 0 [[0; 1]] = Solver.Unsat) "zero budget cannot hit a nonempty clause"; |
| 160 | + require (solve 2 1 [[0]; [1]] = Solver.Unsat) "independent singleton clauses require two fences"; |
| 161 | + require (solve 2 2 [[0]; [1]] = Solver.Sat [Solver.Truth true; Solver.Truth true]) |
| 162 | + "candidate values follow clause indices" |
| 163 | + |
| 151 | 164 | let validation () = |
| 152 | 165 | let case = read "buffering" in |
| 153 | 166 | let open Sexp in |