toysolver-0.5.0: Assorted decision procedures for SAT, SMT, Max-SAT, PB, MIP, etc

Copyright(c) Masahiro Sakai 2012-2014
LicenseBSD-style
Maintainermasahiro.sakai@gmail.com
Stabilityprovisional
Portabilitynon-portable (BangPatterns, ScopedTypeVariables, CPP, DeriveDataTypeable, RecursiveDo)
Safe HaskellNone
LanguageHaskell2010

ToySolver.SAT

Contents

Description

A CDCL SAT solver.

It follows the design of MiniSat and SAT4J.

See also:

Synopsis

The Solver type

newSolver :: IO Solver Source #

Create a new Solver instance.

newSolverWithConfig :: Config -> IO Solver Source #

Create a new Solver instance with a given configulation.

Basic data structures

type Var = Int Source #

Variable is represented as positive integers (DIMACS format).

type Lit = Int Source #

Positive (resp. negative) literals are represented as positive (resp. negative) integers. (DIMACS format).

literal Source #

Arguments

:: Var

variable

-> Bool

polarity

-> Lit 

Construct a literal from a variable and its polarity. True (resp False) means positive (resp. negative) literal.

litNot :: Lit -> Lit Source #

Negation of the Lit.

litVar :: Lit -> Var Source #

Underlying variable of the Lit

litPolarity :: Lit -> Bool Source #

Polarity of the Lit. True means positive literal and False means negative literal.

evalLit :: IModel m => m -> Lit -> Bool Source #

Problem specification

newVar :: NewVar m a => a -> m Var Source #

Add a new variable

newVars :: NewVar m a => a -> Int -> m [Var] Source #

Add variables. newVars a n = replicateM n (newVar a), but maybe faster.

newVars_ :: NewVar m a => a -> Int -> m () Source #

Add variables. newVars_ a n = newVars a n >> return (), but maybe faster.

resizeVarCapacity :: Solver -> Int -> IO () Source #

Pre-allocate internal buffer for n variables.

Clauses

class NewVar m a => AddClause m a | a -> m where Source #

Minimal complete definition

addClause

Methods

addClause :: a -> Clause -> m () Source #

Instances

AddClause IO Solver Source # 

Methods

addClause :: Solver -> Clause -> IO () Source #

Monad m => AddClause m (Encoder m) Source # 

Methods

addClause :: Encoder m -> Clause -> m () Source #

Monad m => AddClause m (Encoder m) Source # 

Methods

addClause :: Encoder m -> Clause -> m () Source #

Monad m => AddClause m (Encoder m) Source # 

Methods

addClause :: Encoder m -> Clause -> m () Source #

PrimMonad m => AddClause m (PBStore m) Source # 

Methods

addClause :: PBStore m -> Clause -> m () Source #

PrimMonad m => AddClause m (CNFStore m) Source # 

Methods

addClause :: CNFStore m -> Clause -> m () Source #

type Clause = [Lit] Source #

Disjunction of Lit.

Cardinality constraints

class AddClause m a => AddCardinality m a | a -> m where Source #

Minimal complete definition

addAtLeast

Methods

addAtLeast :: a -> [Lit] -> Int -> m () Source #

Add a cardinality constraints atleast({l1,l2,..},n).

addAtMost :: a -> [Lit] -> Int -> m () Source #

Add a cardinality constraints atmost({l1,l2,..},n).

addExactly :: a -> [Lit] -> Int -> m () Source #

Add a cardinality constraints exactly({l1,l2,..},n).

Instances

AddCardinality IO Solver Source # 

Methods

addAtLeast :: Solver -> [Lit] -> Int -> IO () Source #

addAtMost :: Solver -> [Lit] -> Int -> IO () Source #

addExactly :: Solver -> [Lit] -> Int -> IO () Source #

PrimMonad m => AddCardinality m (Encoder m) Source # 

Methods

addAtLeast :: Encoder m -> [Lit] -> Int -> m () Source #

addAtMost :: Encoder m -> [Lit] -> Int -> m () Source #

addExactly :: Encoder m -> [Lit] -> Int -> m () Source #

Monad m => AddCardinality m (Encoder m) Source # 

Methods

addAtLeast :: Encoder m -> [Lit] -> Int -> m () Source #

addAtMost :: Encoder m -> [Lit] -> Int -> m () Source #

addExactly :: Encoder m -> [Lit] -> Int -> m () Source #

PrimMonad m => AddCardinality m (PBStore m) Source # 

Methods

addAtLeast :: PBStore m -> [Lit] -> Int -> m () Source #

addAtMost :: PBStore m -> [Lit] -> Int -> m () Source #

addExactly :: PBStore m -> [Lit] -> Int -> m () Source #

type AtLeast = ([Lit], Int) Source #

type Exactly = ([Lit], Int) Source #

(Linear) pseudo-boolean constraints

class AddCardinality m a => AddPBLin m a | a -> m where Source #

Minimal complete definition

addPBAtLeast

Methods

addPBAtLeast :: a -> PBLinSum -> Integer -> m () Source #

Add a pseudo boolean constraints c1*l1 + c2*l2 + … ≥ n.

addPBAtMost :: a -> PBLinSum -> Integer -> m () Source #

Add a pseudo boolean constraints c1*l1 + c2*l2 + … ≤ n.

addPBExactly :: a -> PBLinSum -> Integer -> m () Source #

Add a pseudo boolean constraints c1*l1 + c2*l2 + … = n.

addPBAtLeastSoft :: a -> Lit -> PBLinSum -> Integer -> m () Source #

Add a soft pseudo boolean constraints sel ⇒ c1*l1 + c2*l2 + … ≥ n.

addPBAtMostSoft :: a -> Lit -> PBLinSum -> Integer -> m () Source #

Add a soft pseudo boolean constraints sel ⇒ c1*l1 + c2*l2 + … ≤ n.

addPBExactlySoft :: a -> Lit -> PBLinSum -> Integer -> m () Source #

Add a soft pseudo boolean constraints sel ⇒ c1*l1 + c2*l2 + … = n.

Instances

AddPBLin IO Solver Source # 
PrimMonad m => AddPBLin m (Encoder m) Source # 
Monad m => AddPBLin m (Encoder m) Source # 
PrimMonad m => AddPBLin m (PBStore m) Source # 

XOR clauses

class AddClause m a => AddXORClause m a | a -> m where Source #

Minimal complete definition

addXORClause

Methods

addXORClause :: a -> [Lit] -> Bool -> m () Source #

Add a parity constraint l1 ⊕ l2 ⊕ … ⊕ ln = rhs

addXORClauseSoft :: a -> Lit -> [Lit] -> Bool -> m () Source #

Add a soft parity constraint sel ⇒ l1 ⊕ l2 ⊕ … ⊕ ln = rhs

Instances

type XORClause = ([Lit], Bool) Source #

XOR clause

'([l1,l2..ln], b)' means l1 ⊕ l2 ⊕ ⋯ ⊕ ln = b.

Note that:

  • True can be represented as ([], False)
  • False can be represented as ([], True)

Theory

Solving

solve :: Solver -> IO Bool Source #

Solve constraints. Returns True if the problem is SATISFIABLE. Returns False if the problem is UNSATISFIABLE.

solveWith Source #

Arguments

:: Solver 
-> [Lit]

Assumptions

-> IO Bool 

Solve constraints under assuptions. Returns True if the problem is SATISFIABLE. Returns False if the problem is UNSATISFIABLE.

cancel :: Solver -> IO () Source #

Cancel exectution of solve or solveWith.

This can be called from other threads.

Extract results

class IModel a where Source #

Minimal complete definition

evalVar

Methods

evalVar :: a -> Var -> Bool Source #

Instances

type Model = UArray Var Bool Source #

A model is represented as a mapping from variables to its values.

getModel :: Solver -> IO Model Source #

After solve returns True, it returns an satisfying assignment.

getFailedAssumptions :: Solver -> IO [Lit] Source #

After solveWith returns False, it returns a set of assumptions that leads to contradiction. In particular, if it returns an empty set, the problem is unsatisiable without any assumptions.

getAssumptionsImplications :: Solver -> IO [Lit] Source #

EXPERIMENTAL API: After solveWith returns True or failed with BudgetExceeded exception, it returns a set of literals that are implied by assumptions.

Solver configulation

setVarPolarity :: Solver -> Var -> Bool -> IO () Source #

The default polarity of a variable.

setLogger :: Solver -> (String -> IO ()) -> IO () Source #

set callback function for receiving messages.

setRandomGen :: Solver -> GenIO -> IO () Source #

Set random generator used by the random variable selection

getRandomGen :: Solver -> IO GenIO Source #

Get random generator used by the random variable selection

Deprecated

setRestartStrategy :: Solver -> RestartStrategy -> IO () Source #

Deprecated: Use setConfig

setRestartFirst :: Solver -> Int -> IO () Source #

Deprecated: Use setConfig

The initial restart limit. (default 100) Zero and negative values are used to disable restart.

setRestartInc :: Solver -> Double -> IO () Source #

Deprecated: Use setConfig

The factor with which the restart limit is multiplied in each restart. (default 1.5)

This must be >1.

setLearntSizeFirst :: Solver -> Int -> IO () Source #

Deprecated: Use setConfig

The initial limit for learnt clauses.

Negative value means computing default value from problem instance.

setLearntSizeInc :: Solver -> Double -> IO () Source #

Deprecated: Use setConfig

The limit for learnt clauses is multiplied with this factor each restart. (default 1.1)

This must be >1.

setCCMin :: Solver -> Int -> IO () Source #

Deprecated: Use setConfig

Controls conflict clause minimization (0=none, 1=basic, 2=deep)

setLearningStrategy :: Solver -> LearningStrategy -> IO () Source #

Deprecated: Use setConfig

setEnablePhaseSaving :: Solver -> Bool -> IO () Source #

Deprecated: Use setConfig

getEnablePhaseSaving :: Solver -> IO Bool Source #

Deprecated: Use getConfig

setEnableForwardSubsumptionRemoval :: Solver -> Bool -> IO () Source #

Deprecated: Use setConfig

getEnableForwardSubsumptionRemoval :: Solver -> IO Bool Source #

Deprecated: Use getConfig

setEnableBackwardSubsumptionRemoval :: Solver -> Bool -> IO () Source #

Deprecated: Use setConfig

getEnableBackwardSubsumptionRemoval :: Solver -> IO Bool Source #

Deprecated: Use getConfig

setCheckModel :: Solver -> Bool -> IO () Source #

Deprecated: Use setConfig

setRandomFreq :: Solver -> Double -> IO () Source #

Deprecated: Use setConfig

The frequency with which the decision heuristic tries to choose a random variable

setPBHandlerType :: Solver -> PBHandlerType -> IO () Source #

Deprecated: Use setConfig

setPBSplitClausePart :: Solver -> Bool -> IO () Source #

Deprecated: Use setConfig

Split PB-constraints into a PB part and a clause part.

Example from minisat+ paper:

  • 4 x1 + 4 x2 + 4 x3 + 4 x4 + 2y1 + y2 + y3 ≥ 4

would be split into

  • x1 + x2 + x3 + x4 + ¬z ≥ 1 (clause part)
  • 2 y1 + y2 + y3 + 4 z ≥ 4 (PB part)

where z is a newly introduced variable, not present in any other constraint.

Reference:

  • N. Eén and N. Sörensson. Translating Pseudo-Boolean Constraints into SAT. JSAT 2:1–26, 2006.

Read state

getNVars :: Solver -> IO Int Source #

number of variables of the problem.

getNConstraints :: Solver -> IO Int Source #

number of constraints.

getNLearntConstraints :: Solver -> IO Int Source #

number of learnt constrints.

getFixedLiterals :: Solver -> IO [Lit] Source #

it returns a set of literals that are fixed without any assumptions.

Read state (deprecated)

nVars :: Solver -> IO Int Source #

Deprecated: Use getNVars instead

number of variables of the problem.

nAssigns :: Solver -> IO Int Source #

Deprecated: nAssigns is deprecated

number of assigned variables.

nConstraints :: Solver -> IO Int Source #

Deprecated: Use getNConstraints instead

number of constraints.

nLearnt :: Solver -> IO Int Source #

Deprecated: Use getNLearntConstraints instead

number of learnt constrints.

Internal API