module Main where import Control.Monad import Data.List (nub) import SatMicro import System(getArgs) import System.Exit import qualified Language.CNF.Parse.ParseDIMACS as ParseCNF usage :: String usage = "Usage:\nsat-micro " -- | Run the SAT solver on the CNF file given as an argument. main :: IO () main = do args <- getArgs case args of [] -> putStrLn usage path:_ -> readFile path >>= parseAndSolve where parseAndSolve contents = let cnf = asCnf $ ParseCNF.parseCNF path contents in do putStrLn ("Solving " ++ path ++ "...") let result = dpll cnf when (not (verifyResult result cnf)) $ do print "VERIFICATION ERROR" exitWith (ExitFailure 1) print result -- | Parse CNF file into internal representation. asCnf :: ParseCNF.CNF -> CNF asCnf (ParseCNF.CNF _ _ is) = map (nub . map fromIntegral) $ is