module Satchmo.Solver.Quantor
( 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 quantor
quantor :: Satchmo.Solve.Implementation
quantor cs = do
let debug = True
if debug
then putStrLn cs
else putStrLn $ head $ lines cs
( code, stdout, stderr ) <-
readProcessWithExitCode "quantor" [ "-v", "--resolve-exported=0" ] cs
when debug $ putStrLn stdout
let
case filter ( \ ws -> take 1 ws /= [ "c" ] ) $ map words $ lines stdout of
[ "s", ok ] : rest | ok `elem` [ "TRUE", "SATISFIABLE" ] ->
return $ Just $ M.fromList $ do
"v" : vars <- rest
x <- takeWhile ( /= 0 ) $ map read vars
let l = literal $ abs x
return ( l, x > 0 )
_ -> return $ Nothing