module Satchmo.Solver.Minisat
( solve
)
where
import Satchmo.Data
import qualified Satchmo.Solve
import System.Process
import Control.Monad ( when )
import qualified Data.Map as M
solve = Satchmo.Solve.solve minisat
minisat :: Satchmo.Solve.Implementation
minisat cs = do
let debug = False
if debug
then putStrLn cs
else putStrLn $ head $ lines cs
( code, stdout, stderr ) <-
readProcessWithExitCode "minisat" [ "/dev/stdin", "/dev/stdout" ] cs
when debug $ putStrLn stdout
case lines stdout of
"SAT" : xs : _ -> return $ Just $ M.fromList $ do
x <- takeWhile ( /= 0 ) $ map read $ words xs
let l = literal $ abs x
return ( l, x > 0 )
_ -> return $ Nothing