satchmo-1.0: Satchmo/Boolean/Op.hs
module Satchmo.Boolean.Op
( constant
, and, or, xor
, monadic
)
where
import Prelude hiding ( and, or, not )
import Satchmo.Internal
import Satchmo.Code
import Satchmo.Boolean.Data
and :: [ Boolean ] -> SAT Boolean
and xs = do
y <- boolean
sequence $ do
x <- xs
return $ assert [ not y, x ]
assert $ y : map not xs
return y
or :: [ Boolean ] -> SAT Boolean
or xs = do
y <- and $ map not xs
return $ not y
xor :: [ Boolean ] -> SAT Boolean
xor [x] = return x
xor (x : xs) = do
rest <- xor xs
xor2 x rest
xor2 :: Boolean -> Boolean -> SAT Boolean
xor2 x y = do
a <- and [ x, not y ]
b <- and [ not x, y ]
or [ a, b ]