satplus-0.1.0.0: README.md
# SAT+
This is a Haskell library for constraint programming using a SAT-solver,
in particular MiniSAT.
The names and types of these functions may change at any moment!
## Basic MiniSAT
The basic MiniSAT functions are:
```haskell
newSolver :: IO Solver
newLit :: Solver -> IO Lit
addClause :: Solver -> [Lit] -> IO ()
solve :: Solver -> [Lit] -> IO Bool
modelValue :: Solver -> Lit -> IO Bool
conflict :: Solver -> IO [Lit]
valueMaybe :: Solver -> Lit -> IO (Maybe Bool)
modelValueMaybe :: Solver -> Lit -> IO (Maybe Bool)
```
## Boolean functions
This library also supports boolean operators:
```haskell
andl, orl, xorl :: Solver -> [Lit] -> IO Lit
```
And binary operators:
```haskell
implies :: Solver -> Lit -> Lit -> IO Lit
equiv :: Solver -> Lit -> Lit -> IO Lit
```
## Values
We also have implemented a convenient type that links Haskell values
with the SAT-solver:
```haskell
type Val a
newVal :: Ord a => Solver -> [a] -> IO (Val a)
val :: a -> Val a
(.=) :: Ord a => Val a -> a -> Lit
domain :: Val a -> [a]
```
We also provide:
```haskell
modelValue :: Solver -> Val a -> IO a
```
## Equality
We often want to add constraints that say that two things are equal,
or not equal, to each other.
```haskell
class Equal a where
equal :: Solver -> a -> a -> IO ()
notEqual :: Solver -> a -> a -> IO ()
...
```
Instances of this class are:
```haskell
instance Equal ()
instance Equal Lit
instance (Equal a, Equal b) => Equal (a,b)
instance (Equal a, Equal b) => Equal (Either a b)
instance Equal a => Equal [a]
instance Equal a => Equal (Maybe a)
instance Ord a => Equal (Val a)
instance Equal Unary
instance Equal Binary
```
## Order
We often want to add constraints that say that one thing is smaller than
another.
```haskell
class Order a where
lessThan :: Solver -> a -> a -> IO ()
lessThanEqual :: Solver -> a -> a -> IO ()
greaterThan :: Solver -> a -> a -> IO ()
greaterThanEqual :: Solver -> a -> a -> IO ()
...
```
Instances of this class are:
```haskell
instance Order ()
instance Order Lit
instance (Order a, Order b) => Equal (a,b)
instance (Order a, Order b) => Equal (Either a b)
instance Order a => Order [a]
instance Order a => Order (Maybe a)
instance Ord a => Order (Val a)
instance Order Unary
instance Order Binary
```
## Unary numbers
We have support for unary numbers (represented as sorted lists of Lits).
These are handy when you want to count number of literals in a set being
true, for example.
```haskell
type Unary
zero :: Unary
digit :: Lit -> Unary
number :: Int -> Unary
count :: Solver -> [Lit] -> IO Unary
countMax :: Solver -> Int -> [Lit] -> IO Unary
add :: Solver -> Unary -> Unary -> IO Unary
addList :: Solver -> [Unary] -> IO Unary
(.<=), (.<), (.>=), (.>) :: Unary -> Int -> Lit
```
We also provide:
```haskell
modelValue :: Solver -> Unary -> IO Int
```
## Binary numbers
We have support for binary numbers (represented as lists of Lits).
These are handy when you want to represent numbers that are large.
```haskell
type Binary
zero :: Binary
digit :: Lit -> Binary
number :: Integer -> Binary
count :: Solver -> [Lit] -> IO Binary
countMax :: Solver -> Int -> [Lit] -> IO Binary
add :: Solver -> Binary -> Binary -> IO Binary
addList :: Solver -> [Binary] -> IO Binary
```
We also provide:
```haskell
modelValue :: Solver -> Binary -> IO Integer
```
## Terms
We also support linear arithmetic terms over a base type of variables
(for example Lit, Unary, or Binary).
(not done yet)
## Minimization / Maximization
We also support finding solutions that are minimized or maximized w.r.t.
a particular argument.
```haskell
solveMinimize :: Order a => Solver -> [Lit] -> Unary -> IO Bool
solveMaximize :: Order a => Solver -> [Lit] -> Unary -> IO Bool
```
TODO: add optimization over binary numbers.