module Jukebox.Sat
( Solver
, newSolver
, deleteSolver
, Lit, neg
, false, true
, SatSolver(..)
, newLit
, addClause
, solve
, conflict
, modelValue
, value
)
where
import MiniSat
( Solver
, deleteSolver
, Lit(..)
, neg
)
import qualified MiniSat as M
false, true :: Lit
true = MkLit 0
false = neg true
newSolver :: IO Solver
newSolver =
do s <- M.newSolver
x <- M.newLit s
if x == false || x == true
then do M.addClause s [true]
return s
else do error "failed to initialize false and true!"
class SatSolver s where
getSolver :: s -> Solver
instance SatSolver Solver where
getSolver s = s
newLit :: SatSolver s => s -> IO Lit
newLit s = M.newLit (getSolver s)
addClause :: SatSolver s => s -> [Lit] -> IO ()
addClause s xs = M.addClause (getSolver s) xs >> return ()
solve :: SatSolver s => s -> [Lit] -> IO Bool
solve s xs = M.solve (getSolver s) xs
conflict :: SatSolver s => s -> IO [Lit]
conflict s = M.conflict (getSolver s)
modelValue :: SatSolver s => s -> Lit -> IO (Maybe Bool)
modelValue s x = M.modelValue (getSolver s) x
value :: SatSolver s => s -> Lit -> IO (Maybe Bool)
value s x = M.value (getSolver s) x