Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
Synopsis
- data SAT s a
- runSAT :: (forall s. SAT s a) -> IO a
- runSATMaybe :: (forall s. SAT s a) -> IO (Maybe a)
- data UnsatException = UnsatException
- data Lit s
- newLit :: SAT s (Lit s)
- class Neg a where
- neg :: a -> a
- addClause :: [Lit s] -> SAT s ()
- assertAtLeastOne :: [Lit s] -> SAT s ()
- assertAtMostOne :: [Lit s] -> SAT s ()
- assertAtMostOnePairwise :: [Lit s] -> SAT s ()
- assertAtMostOneSequential :: [Lit s] -> SAT s ()
- assertEqual :: Lit s -> Lit s -> SAT s ()
- assertAllEqual :: [Lit s] -> SAT s ()
- data Prop s
- true :: Prop s
- false :: Prop s
- lit :: Lit s -> Prop s
- (\/) :: Prop s -> Prop s -> Prop s
- (/\) :: Prop s -> Prop s -> Prop s
- (<->) :: Prop s -> Prop s -> Prop s
- (-->) :: Prop s -> Prop s -> Prop s
- xor :: Prop s -> Prop s -> Prop s
- ite :: Prop s -> Prop s -> Prop s -> Prop s
- addDefinition :: Prop s -> SAT s (Lit s)
- addProp :: Prop s -> SAT s ()
- trueLit :: SAT s (Lit s)
- falseLit :: SAT s (Lit s)
- addConjDefinition :: Lit s -> [Lit s] -> SAT s ()
- addDisjDefinition :: Lit s -> [Lit s] -> SAT s ()
- solve :: Traversable model => model (Lit s) -> SAT s (model Bool)
- solve_ :: SAT s ()
- simplify :: SAT s ()
- numberOfVariables :: SAT s Int
- numberOfClauses :: SAT s Int
- numberOfLearnts :: SAT s Int
- numberOfConflicts :: SAT s Int
SAT Monad
Satisfiability monad.
runSATMaybe :: (forall s. SAT s a) -> IO (Maybe a) Source #
Run SAT
computation. Return Nothing
if UnsatException
is thrown.
data UnsatException Source #
Unsatisfiable exception.
It may be thrown by various functions: in particular solve
and solve_
, but also addClause
, simplify
.
The reason to use an exception is because after unsatisfiable state is reached the underlying solver instance is unusable.
You may use runSATMaybe
to catch it.
Instances
Exception UnsatException Source # | |
Defined in Control.Monad.SAT | |
Show UnsatException Source # | |
Defined in Control.Monad.SAT showsPrec :: Int -> UnsatException -> ShowS # show :: UnsatException -> String # showList :: [UnsatException] -> ShowS # |
Literals
Literal.
To negate literate use neg
.
Negation
Clauses
assertAtMostOne :: [Lit s] -> SAT s () Source #
At most one -constraint.
Uses atMostOnePairwise
for lists of length 2 to 5
and atMostOneSequential
for longer lists.
The cutoff is chosen by picking encoding with least clauses:
For 5 literals, atMostOnePairwise
needs 10 clauses and assertAtMostOneSequential
needs 11 (and 4 new variables).
For 6 literals, atMostOnePairwise
needs 15 clauses and assertAtMostOneSequential
needs 14.
assertAtMostOnePairwise :: [Lit s] -> SAT s () Source #
At most one -constraint using pairwise encoding.
\[ \mathrm{AMO}(x_1, \ldots, x_n) = \bigwedge_{1 \le i < j \le n} \neg x_i \lor \neg x_j \]
\(n(n-1)/2\) clauses, zero auxiliary variables.
assertAtMostOneSequential :: [Lit s] -> SAT s () Source #
At most one -constraint using sequential counter encoding.
\[ \mathrm{AMO}(x_1, \ldots, x_n) = (\neg x_1 \lor s_1) \land (\neg x_n \lor \neg s_{n-1}) \land \bigwedge_{1 < i < n} (\neg x_i \lor a_i) \land (\neg a_{i-1} \lor a_i) \land (\neg x_i \lor \neg a_{i-1}) \]
Sinz, C.: Towards an optimal CNF encoding of Boolean cardinality constraints, Proceedings of Principles and Practice of Constraint Programming (CP), 827–831 (2005)
\(3n-4\) clauses, \(n-1\) auxiliary variables.
We optimize the two literal case immediately ([resolution](https:/en.wikipedia.orgwiki/Resolution_(logic)) on \(s_1\).
\[ (\neg x_1 \lor s_1) \land (\neg x_2 \lor \neg s_1) \Longrightarrow \neg x_1 \lor \neg x_2 \]
assertAllEqual :: [Lit s] -> SAT s () Source #
Assert that all literals in the list are equal.
Propositional formulas
Propositional formula.
addProp :: Prop s -> SAT s () Source #
Assert that given Prop
is true.
This is equivalent to
addProp p = do l <- addDefinition p addClause l
but avoid creating the definition, asserting less clauses.
Clause definitions
addConjDefinition :: Lit s -> [Lit s] -> SAT s () Source #
Add conjunction definition.
addConjDefinition x ys
asserts that x ↔ ⋀ yᵢ
addDisjDefinition :: Lit s -> [Lit s] -> SAT s () Source #
Add disjunction definition.
addDisjDefinition x ys
asserts that x ↔ ⋁ yᵢ
Solving
solve :: Traversable model => model (Lit s) -> SAT s (model Bool) Source #
Search and return a model.
Simplification
Statistics
numberOfVariables :: SAT s Int Source #
The current number of variables.
numberOfClauses :: SAT s Int Source #
The current number of original clauses.
numberOfLearnts :: SAT s Int Source #
The current number of learnt clauses.
numberOfConflicts :: SAT s Int Source #
The current number of conflicts.