src/HOL/Tools/Nitpick/nitpick_mono.ML
changeset 34123 c4988215a691
parent 34121 5e831d805118
child 34936 c4f04bee79f3
equal deleted inserted replaced
34122:9e6326db46b4 34123:c4988215a691
   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 *)