464 prop_for_sign_atom_eq (a2, Neg)) |
464 prop_for_sign_atom_eq (a2, Neg)) |
465 | prop_for_comp (a1, a2, cmp, xs) = |
465 | prop_for_comp (a1, a2, cmp, xs) = |
466 PropLogic.SOr (prop_for_exists_eq xs Neg, prop_for_comp (a1, a2, cmp, [])) |
466 PropLogic.SOr (prop_for_exists_eq xs Neg, prop_for_comp (a1, a2, cmp, [])) |
467 |
467 |
468 (* var -> (int -> bool option) -> literal list -> literal list *) |
468 (* var -> (int -> bool option) -> literal list -> literal list *) |
469 fun literals_from_assignments max_var asgns lits = |
469 fun literals_from_assignments max_var assigns lits = |
470 fold (fn x => fn accum => |
470 fold (fn x => fn accum => |
471 if AList.defined (op =) lits x then |
471 if AList.defined (op =) lits x then |
472 accum |
472 accum |
473 else case asgns x of |
473 else case assigns x of |
474 SOME b => (x, sign_from_bool b) :: accum |
474 SOME b => (x, sign_from_bool b) :: accum |
475 | NONE => accum) (max_var downto 1) lits |
475 | NONE => accum) (max_var downto 1) lits |
476 |
476 |
477 (* literal list -> sign_atom -> sign option *) |
477 (* literal list -> sign_atom -> sign option *) |
478 fun lookup_sign_atom _ (S sn) = SOME sn |
478 fun lookup_sign_atom _ (S sn) = SOME sn |
503 let |
503 let |
504 val _ = print_problem lits comps sexps |
504 val _ = print_problem lits comps sexps |
505 val prop = PropLogic.all (map prop_for_literal lits @ |
505 val prop = PropLogic.all (map prop_for_literal lits @ |
506 map prop_for_comp comps @ |
506 map prop_for_comp comps @ |
507 map prop_for_sign_expr sexps) |
507 map prop_for_sign_expr sexps) |
|
508 (* use the first ML solver (to avoid startup overhead) *) |
|
509 val solvers = !SatSolver.solvers |
|
510 |> filter (member (op =) ["dptsat", "dpll"] o fst) |
508 in |
511 in |
509 case SatSolver.invoke_solver "dpll" prop of |
512 case snd (hd solvers) prop of |
510 SatSolver.SATISFIABLE asgns => |
513 SatSolver.SATISFIABLE assigns => |
511 SOME (literals_from_assignments max_var asgns lits |
514 SOME (literals_from_assignments max_var assigns lits |
512 |> tap print_solution) |
515 |> tap print_solution) |
513 | _ => NONE |
516 | _ => NONE |
514 end |
517 end |
515 |
518 |
516 (* var -> constraint_set -> bool *) |
519 (* var -> constraint_set -> bool *) |