Files
sift/src/Sift/Cdcl.hs
T

35 lines
888 B
Haskell

module Sift.Cdcl
( CdclResult(..)
, solveCdcl
, solveCdclStats
, lubySequence
) where
import Control.Monad.ST (runST)
import qualified Data.Map.Strict as Map
import Sift.Types
import Sift.Stats
import Sift.Cdcl.Search (solveInternal, luby)
data CdclResult
= CdclSat Assignment
| CdclUnsat
deriving (Eq, Show)
lubySequence :: Int -> [Int]
lubySequence k = map luby [0 .. k - 1]
solveCdcl :: CNF -> CdclResult
solveCdcl = fst . solveCdclStats
solveCdclStats :: CNF -> (CdclResult, Stats)
solveCdclStats (CNF cs) =
let nv = maximum (0 : map varId (concatMap varsOfClause cs))
dimacsClauses = map (map litToInt) cs
(model, st) = runST (solveInternal nv dimacsClauses)
in case model of
Nothing -> (CdclUnsat, st)
Just bools ->
let asn = Map.fromList [ (Var (i + 1), b) | (i, b) <- zip [0 ..] bools ]
in (CdclSat asn, st)