{-# OPTIONS_GHC -Wall #-}
{-# OPTIONS_HADDOCK show-extensions #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
module ToySolver.SAT.Encoder.Tseitin
(
Encoder
, newEncoder
, newEncoderWithPBLin
, setUsePB
, Polarity (..)
, negatePolarity
, polarityPos
, polarityNeg
, polarityBoth
, polarityNone
, module ToySolver.SAT.Formula
, addFormula
, encodeFormula
, encodeFormulaWithPolarity
, encodeConj
, encodeConjWithPolarity
, encodeDisj
, encodeDisjWithPolarity
, encodeITE
, encodeITEWithPolarity
, encodeXOR
, encodeXORWithPolarity
, encodeFASum
, encodeFASumWithPolarity
, encodeFACarry
, encodeFACarryWithPolarity
, getDefinitions
) where
import Control.Monad
import Control.Monad.Primitive
import Data.Primitive.MutVar
import Data.Map (Map)
import qualified Data.Map as Map
import qualified Data.IntSet as IntSet
import ToySolver.Data.Boolean
import ToySolver.SAT.Formula
import qualified ToySolver.SAT.Types as SAT
data Encoder m =
forall a. SAT.AddClause m a =>
Encoder
{ ()
encBase :: a
, forall (m :: * -> *).
Encoder m -> Maybe (PBLinSum -> Integer -> m ())
encAddPBAtLeast :: Maybe (SAT.PBLinSum -> Integer -> m ())
, forall (m :: * -> *). Encoder m -> MutVar (PrimState m) Bool
encUsePB :: !(MutVar (PrimState m) Bool)
, forall (m :: * -> *).
Encoder m -> MutVar (PrimState m) (Map LitSet (Var, Bool, Bool))
encConjTable :: !(MutVar (PrimState m) (Map SAT.LitSet (SAT.Var, Bool, Bool)))
, forall (m :: * -> *).
Encoder m
-> MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
encITETable :: !(MutVar (PrimState m) (Map (SAT.Lit, SAT.Lit, SAT.Lit) (SAT.Var, Bool, Bool)))
, forall (m :: * -> *).
Encoder m
-> MutVar (PrimState m) (Map (Var, Var) (Var, Bool, Bool))
encXORTable :: !(MutVar (PrimState m) (Map (SAT.Lit, SAT.Lit) (SAT.Var, Bool, Bool)))
, forall (m :: * -> *).
Encoder m
-> MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
encFASumTable :: !(MutVar (PrimState m) (Map (SAT.Lit, SAT.Lit, SAT.Lit) (SAT.Var, Bool, Bool)))
, forall (m :: * -> *).
Encoder m
-> MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
encFACarryTable :: !(MutVar (PrimState m) (Map (SAT.Lit, SAT.Lit, SAT.Lit) (SAT.Var, Bool, Bool)))
}
instance Monad m => SAT.NewVar m (Encoder m) where
newVar :: Encoder m -> m Var
newVar Encoder{ encBase :: ()
encBase = a
a } = forall (m :: * -> *) a. NewVar m a => a -> m Var
SAT.newVar a
a
newVars :: Encoder m -> Var -> m [Var]
newVars Encoder{ encBase :: ()
encBase = a
a } = forall (m :: * -> *) a. NewVar m a => a -> Var -> m [Var]
SAT.newVars a
a
newVars_ :: Encoder m -> Var -> m ()
newVars_ Encoder{ encBase :: ()
encBase = a
a } = forall (m :: * -> *) a. NewVar m a => a -> Var -> m ()
SAT.newVars_ a
a
instance Monad m => SAT.AddClause m (Encoder m) where
addClause :: Encoder m -> [Var] -> m ()
addClause Encoder{ encBase :: ()
encBase = a
a } = forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause a
a
newEncoder :: PrimMonad m => SAT.AddClause m a => a -> m (Encoder m)
newEncoder :: forall (m :: * -> *) a.
(PrimMonad m, AddClause m a) =>
a -> m (Encoder m)
newEncoder a
solver = do
MutVar (PrimState m) Bool
usePBRef <- forall (m :: * -> *) a.
PrimMonad m =>
a -> m (MutVar (PrimState m) a)
newMutVar Bool
False
MutVar (PrimState m) (Map LitSet (Var, Bool, Bool))
tableConj <- forall (m :: * -> *) a.
PrimMonad m =>
a -> m (MutVar (PrimState m) a)
newMutVar forall k a. Map k a
Map.empty
MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
tableITE <- forall (m :: * -> *) a.
PrimMonad m =>
a -> m (MutVar (PrimState m) a)
newMutVar forall k a. Map k a
Map.empty
MutVar (PrimState m) (Map (Var, Var) (Var, Bool, Bool))
tableXOR <- forall (m :: * -> *) a.
PrimMonad m =>
a -> m (MutVar (PrimState m) a)
newMutVar forall k a. Map k a
Map.empty
MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
tableFASum <- forall (m :: * -> *) a.
PrimMonad m =>
a -> m (MutVar (PrimState m) a)
newMutVar forall k a. Map k a
Map.empty
MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
tableFACarry <- forall (m :: * -> *) a.
PrimMonad m =>
a -> m (MutVar (PrimState m) a)
newMutVar forall k a. Map k a
Map.empty
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$
Encoder
{ encBase :: a
encBase = a
solver
, encAddPBAtLeast :: Maybe (PBLinSum -> Integer -> m ())
encAddPBAtLeast = forall a. Maybe a
Nothing
, encUsePB :: MutVar (PrimState m) Bool
encUsePB = MutVar (PrimState m) Bool
usePBRef
, encConjTable :: MutVar (PrimState m) (Map LitSet (Var, Bool, Bool))
encConjTable = MutVar (PrimState m) (Map LitSet (Var, Bool, Bool))
tableConj
, encITETable :: MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
encITETable = MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
tableITE
, encXORTable :: MutVar (PrimState m) (Map (Var, Var) (Var, Bool, Bool))
encXORTable = MutVar (PrimState m) (Map (Var, Var) (Var, Bool, Bool))
tableXOR
, encFASumTable :: MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
encFASumTable = MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
tableFASum
, encFACarryTable :: MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
encFACarryTable = MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
tableFACarry
}
newEncoderWithPBLin :: PrimMonad m => SAT.AddPBLin m a => a -> m (Encoder m)
newEncoderWithPBLin :: forall (m :: * -> *) a.
(PrimMonad m, AddPBLin m a) =>
a -> m (Encoder m)
newEncoderWithPBLin a
solver = do
MutVar (PrimState m) Bool
usePBRef <- forall (m :: * -> *) a.
PrimMonad m =>
a -> m (MutVar (PrimState m) a)
newMutVar Bool
False
MutVar (PrimState m) (Map LitSet (Var, Bool, Bool))
tableConj <- forall (m :: * -> *) a.
PrimMonad m =>
a -> m (MutVar (PrimState m) a)
newMutVar forall k a. Map k a
Map.empty
MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
tableITE <- forall (m :: * -> *) a.
PrimMonad m =>
a -> m (MutVar (PrimState m) a)
newMutVar forall k a. Map k a
Map.empty
MutVar (PrimState m) (Map (Var, Var) (Var, Bool, Bool))
tableXOR <- forall (m :: * -> *) a.
PrimMonad m =>
a -> m (MutVar (PrimState m) a)
newMutVar forall k a. Map k a
Map.empty
MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
tableFASum <- forall (m :: * -> *) a.
PrimMonad m =>
a -> m (MutVar (PrimState m) a)
newMutVar forall k a. Map k a
Map.empty
MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
tableFACarry <- forall (m :: * -> *) a.
PrimMonad m =>
a -> m (MutVar (PrimState m) a)
newMutVar forall k a. Map k a
Map.empty
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$
Encoder
{ encBase :: a
encBase = a
solver
, encAddPBAtLeast :: Maybe (PBLinSum -> Integer -> m ())
encAddPBAtLeast = forall a. a -> Maybe a
Just (forall (m :: * -> *) a.
AddPBLin m a =>
a -> PBLinSum -> Integer -> m ()
SAT.addPBAtLeast a
solver)
, encUsePB :: MutVar (PrimState m) Bool
encUsePB = MutVar (PrimState m) Bool
usePBRef
, encConjTable :: MutVar (PrimState m) (Map LitSet (Var, Bool, Bool))
encConjTable = MutVar (PrimState m) (Map LitSet (Var, Bool, Bool))
tableConj
, encITETable :: MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
encITETable = MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
tableITE
, encXORTable :: MutVar (PrimState m) (Map (Var, Var) (Var, Bool, Bool))
encXORTable = MutVar (PrimState m) (Map (Var, Var) (Var, Bool, Bool))
tableXOR
, encFASumTable :: MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
encFASumTable = MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
tableFASum
, encFACarryTable :: MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
encFACarryTable = MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
tableFACarry
}
setUsePB :: PrimMonad m => Encoder m -> Bool -> m ()
setUsePB :: forall (m :: * -> *). PrimMonad m => Encoder m -> Bool -> m ()
setUsePB Encoder m
encoder Bool
usePB = forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> a -> m ()
writeMutVar (forall (m :: * -> *). Encoder m -> MutVar (PrimState m) Bool
encUsePB Encoder m
encoder) Bool
usePB
addFormula :: PrimMonad m => Encoder m -> Formula -> m ()
addFormula :: forall (m :: * -> *). PrimMonad m => Encoder m -> Formula -> m ()
addFormula Encoder m
encoder Formula
formula = do
case Formula
formula of
And [Formula]
xs -> forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (forall (m :: * -> *). PrimMonad m => Encoder m -> Formula -> m ()
addFormula Encoder m
encoder) [Formula]
xs
Equiv Formula
a Formula
b -> do
Var
lit1 <- forall (m :: * -> *). PrimMonad m => Encoder m -> Formula -> m Var
encodeFormula Encoder m
encoder Formula
a
Var
lit2 <- forall (m :: * -> *). PrimMonad m => Encoder m -> Formula -> m Var
encodeFormula Encoder m
encoder Formula
b
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [Var -> Var
SAT.litNot Var
lit1, Var
lit2]
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [Var -> Var
SAT.litNot Var
lit2, Var
lit1]
Not (Not Formula
a) -> forall (m :: * -> *). PrimMonad m => Encoder m -> Formula -> m ()
addFormula Encoder m
encoder Formula
a
Not (Or [Formula]
xs) -> forall (m :: * -> *). PrimMonad m => Encoder m -> Formula -> m ()
addFormula Encoder m
encoder (forall a. MonotoneBoolean a => [a] -> a
andB (forall a b. (a -> b) -> [a] -> [b]
map forall a. Complement a => a -> a
notB [Formula]
xs))
Not (Imply Formula
a Formula
b) -> forall (m :: * -> *). PrimMonad m => Encoder m -> Formula -> m ()
addFormula Encoder m
encoder (Formula
a forall a. MonotoneBoolean a => a -> a -> a
.&&. forall a. Complement a => a -> a
notB Formula
b)
Not (Equiv Formula
a Formula
b) -> do
Var
lit1 <- forall (m :: * -> *). PrimMonad m => Encoder m -> Formula -> m Var
encodeFormula Encoder m
encoder Formula
a
Var
lit2 <- forall (m :: * -> *). PrimMonad m => Encoder m -> Formula -> m Var
encodeFormula Encoder m
encoder Formula
b
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [Var
lit1, Var
lit2]
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [Var -> Var
SAT.litNot Var
lit1, Var -> Var
SAT.litNot Var
lit2]
ITE Formula
c Formula
t Formula
e -> do
Var
c' <- forall (m :: * -> *). PrimMonad m => Encoder m -> Formula -> m Var
encodeFormula Encoder m
encoder Formula
c
Var
t' <- forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Formula -> m Var
encodeFormulaWithPolarity Encoder m
encoder Polarity
polarityPos Formula
t
Var
e' <- forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Formula -> m Var
encodeFormulaWithPolarity Encoder m
encoder Polarity
polarityPos Formula
e
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [-Var
c', Var
t']
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [ Var
c', Var
e']
Formula
_ -> do
[Var]
c <- forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Formula -> m [Var]
encodeToClause Encoder m
encoder Formula
formula
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [Var]
c
encodeToClause :: PrimMonad m => Encoder m -> Formula -> m SAT.Clause
encodeToClause :: forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Formula -> m [Var]
encodeToClause Encoder m
encoder Formula
formula =
case Formula
formula of
And [Formula
x] -> forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Formula -> m [Var]
encodeToClause Encoder m
encoder Formula
x
Or [Formula]
xs -> do
[[Var]]
cs <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Formula -> m [Var]
encodeToClause Encoder m
encoder) [Formula]
xs
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Var]]
cs
Not (Not Formula
x) -> forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Formula -> m [Var]
encodeToClause Encoder m
encoder Formula
x
Not (And [Formula]
xs) -> do
forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Formula -> m [Var]
encodeToClause Encoder m
encoder (forall a. MonotoneBoolean a => [a] -> a
orB (forall a b. (a -> b) -> [a] -> [b]
map forall a. Complement a => a -> a
notB [Formula]
xs))
Imply Formula
a Formula
b -> do
forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Formula -> m [Var]
encodeToClause Encoder m
encoder (forall a. Complement a => a -> a
notB Formula
a forall a. MonotoneBoolean a => a -> a -> a
.||. Formula
b)
Formula
_ -> do
Var
l <- forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Formula -> m Var
encodeFormulaWithPolarity Encoder m
encoder Polarity
polarityPos Formula
formula
forall (m :: * -> *) a. Monad m => a -> m a
return [Var
l]
encodeFormula :: PrimMonad m => Encoder m -> Formula -> m SAT.Lit
encodeFormula :: forall (m :: * -> *). PrimMonad m => Encoder m -> Formula -> m Var
encodeFormula Encoder m
encoder = forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Formula -> m Var
encodeFormulaWithPolarity Encoder m
encoder Polarity
polarityBoth
encodeWithPolarityHelper
:: (PrimMonad m, Ord k)
=> Encoder m
-> MutVar (PrimState m) (Map k (SAT.Var, Bool, Bool))
-> (SAT.Lit -> m ()) -> (SAT.Lit -> m ())
-> Polarity
-> k
-> m SAT.Var
encodeWithPolarityHelper :: forall (m :: * -> *) k.
(PrimMonad m, Ord k) =>
Encoder m
-> MutVar (PrimState m) (Map k (Var, Bool, Bool))
-> (Var -> m ())
-> (Var -> m ())
-> Polarity
-> k
-> m Var
encodeWithPolarityHelper Encoder m
encoder MutVar (PrimState m) (Map k (Var, Bool, Bool))
tableRef Var -> m ()
definePos Var -> m ()
defineNeg (Polarity Bool
pos Bool
neg) k
k = do
Map k (Var, Bool, Bool)
table <- forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar MutVar (PrimState m) (Map k (Var, Bool, Bool))
tableRef
case forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup k
k Map k (Var, Bool, Bool)
table of
Just (Var
v, Bool
posDefined, Bool
negDefined) -> do
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool
pos Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
posDefined) forall a b. (a -> b) -> a -> b
$ Var -> m ()
definePos Var
v
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool
neg Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
negDefined) forall a b. (a -> b) -> a -> b
$ Var -> m ()
defineNeg Var
v
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool
posDefined forall a. Ord a => a -> a -> Bool
< Bool
pos Bool -> Bool -> Bool
|| Bool
negDefined forall a. Ord a => a -> a -> Bool
< Bool
neg) forall a b. (a -> b) -> a -> b
$
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> (a -> a) -> m ()
modifyMutVar' MutVar (PrimState m) (Map k (Var, Bool, Bool))
tableRef (forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert k
k (Var
v, (forall a. Ord a => a -> a -> a
max Bool
posDefined Bool
pos), (forall a. Ord a => a -> a -> a
max Bool
negDefined Bool
neg)))
forall (m :: * -> *) a. Monad m => a -> m a
return Var
v
Maybe (Var, Bool, Bool)
Nothing -> do
Var
v <- forall (m :: * -> *) a. NewVar m a => a -> m Var
SAT.newVar Encoder m
encoder
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
pos forall a b. (a -> b) -> a -> b
$ Var -> m ()
definePos Var
v
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
neg forall a b. (a -> b) -> a -> b
$ Var -> m ()
defineNeg Var
v
forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> (a -> a) -> m ()
modifyMutVar' MutVar (PrimState m) (Map k (Var, Bool, Bool))
tableRef (forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert k
k (Var
v, Bool
pos, Bool
neg))
forall (m :: * -> *) a. Monad m => a -> m a
return Var
v
encodeFormulaWithPolarity :: PrimMonad m => Encoder m -> Polarity -> Formula -> m SAT.Lit
encodeFormulaWithPolarity :: forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Formula -> m Var
encodeFormulaWithPolarity Encoder m
encoder Polarity
p Formula
formula = do
case Formula
formula of
Atom Var
l -> forall (m :: * -> *) a. Monad m => a -> m a
return Var
l
And [Formula]
xs -> forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> [Var] -> m Var
encodeConjWithPolarity Encoder m
encoder Polarity
p forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Formula -> m Var
encodeFormulaWithPolarity Encoder m
encoder Polarity
p) [Formula]
xs
Or [Formula]
xs -> forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> [Var] -> m Var
encodeDisjWithPolarity Encoder m
encoder Polarity
p forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Formula -> m Var
encodeFormulaWithPolarity Encoder m
encoder Polarity
p) [Formula]
xs
Not Formula
x -> forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM Var -> Var
SAT.litNot forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Formula -> m Var
encodeFormulaWithPolarity Encoder m
encoder (Polarity -> Polarity
negatePolarity Polarity
p) Formula
x
Imply Formula
x Formula
y -> do
forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Formula -> m Var
encodeFormulaWithPolarity Encoder m
encoder Polarity
p (forall a. Complement a => a -> a
notB Formula
x forall a. MonotoneBoolean a => a -> a -> a
.||. Formula
y)
Equiv Formula
x Formula
y -> do
Var
lit1 <- forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Formula -> m Var
encodeFormulaWithPolarity Encoder m
encoder Polarity
polarityBoth Formula
x
Var
lit2 <- forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Formula -> m Var
encodeFormulaWithPolarity Encoder m
encoder Polarity
polarityBoth Formula
y
forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Formula -> m Var
encodeFormulaWithPolarity Encoder m
encoder Polarity
p forall a b. (a -> b) -> a -> b
$
(Var -> Formula
Atom Var
lit1 forall a. Boolean a => a -> a -> a
.=>. Var -> Formula
Atom Var
lit2) forall a. MonotoneBoolean a => a -> a -> a
.&&. (Var -> Formula
Atom Var
lit2 forall a. Boolean a => a -> a -> a
.=>. Var -> Formula
Atom Var
lit1)
ITE Formula
c Formula
t Formula
e -> do
Var
c' <- forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Formula -> m Var
encodeFormulaWithPolarity Encoder m
encoder Polarity
polarityBoth Formula
c
Var
t' <- forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Formula -> m Var
encodeFormulaWithPolarity Encoder m
encoder Polarity
p Formula
t
Var
e' <- forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Formula -> m Var
encodeFormulaWithPolarity Encoder m
encoder Polarity
p Formula
e
forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Var -> Var -> Var -> m Var
encodeITEWithPolarity Encoder m
encoder Polarity
p Var
c' Var
t' Var
e'
encodeConj :: PrimMonad m => Encoder m -> [SAT.Lit] -> m SAT.Lit
encodeConj :: forall (m :: * -> *). PrimMonad m => Encoder m -> [Var] -> m Var
encodeConj Encoder m
encoder = forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> [Var] -> m Var
encodeConjWithPolarity Encoder m
encoder Polarity
polarityBoth
encodeConjWithPolarity :: forall m. PrimMonad m => Encoder m -> Polarity -> [SAT.Lit] -> m SAT.Lit
encodeConjWithPolarity :: forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> [Var] -> m Var
encodeConjWithPolarity Encoder m
_ Polarity
_ [Var
l] = forall (m :: * -> *) a. Monad m => a -> m a
return Var
l
encodeConjWithPolarity Encoder m
encoder Polarity
polarity [Var]
ls = do
Bool
usePB <- forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (forall (m :: * -> *). Encoder m -> MutVar (PrimState m) Bool
encUsePB Encoder m
encoder)
Map LitSet (Var, Bool, Bool)
table <- forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (forall (m :: * -> *).
Encoder m -> MutVar (PrimState m) (Map LitSet (Var, Bool, Bool))
encConjTable Encoder m
encoder)
let ls3 :: LitSet
ls3 = [Var] -> LitSet
IntSet.fromList [Var]
ls
ls2 :: LitSet
ls2 = case forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup LitSet
IntSet.empty Map LitSet (Var, Bool, Bool)
table of
Maybe (Var, Bool, Bool)
Nothing -> LitSet
ls3
Just (Var
litTrue, Bool
_, Bool
_)
| Var
litFalse Var -> LitSet -> Bool
`IntSet.member` LitSet
ls3 -> Var -> LitSet
IntSet.singleton Var
litFalse
| Bool
otherwise -> Var -> LitSet -> LitSet
IntSet.delete Var
litTrue LitSet
ls3
where litFalse :: Var
litFalse = Var -> Var
SAT.litNot Var
litTrue
if LitSet -> Var
IntSet.size LitSet
ls2 forall a. Eq a => a -> a -> Bool
== Var
1 then do
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a. [a] -> a
head forall a b. (a -> b) -> a -> b
$ LitSet -> [Var]
IntSet.toList LitSet
ls2
else do
let
definePos :: SAT.Lit -> m ()
definePos :: Var -> m ()
definePos Var
l = do
case forall (m :: * -> *).
Encoder m -> Maybe (PBLinSum -> Integer -> m ())
encAddPBAtLeast Encoder m
encoder of
Just PBLinSum -> Integer -> m ()
addPBAtLeast | Bool
usePB -> do
let n :: Var
n = LitSet -> Var
IntSet.size LitSet
ls2
PBLinSum -> Integer -> m ()
addPBAtLeast ((- forall a b. (Integral a, Num b) => a -> b
fromIntegral Var
n, Var
l) forall a. a -> [a] -> [a]
: [(Integer
1,Var
li) | Var
li <- LitSet -> [Var]
IntSet.toList LitSet
ls2]) Integer
0
Maybe (PBLinSum -> Integer -> m ())
_ -> do
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ (LitSet -> [Var]
IntSet.toList LitSet
ls2) forall a b. (a -> b) -> a -> b
$ \Var
li -> do
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [Var -> Var
SAT.litNot Var
l, Var
li]
defineNeg :: SAT.Lit -> m ()
defineNeg :: Var -> m ()
defineNeg Var
l = do
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder (Var
l forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map Var -> Var
SAT.litNot (LitSet -> [Var]
IntSet.toList LitSet
ls2))
forall (m :: * -> *) k.
(PrimMonad m, Ord k) =>
Encoder m
-> MutVar (PrimState m) (Map k (Var, Bool, Bool))
-> (Var -> m ())
-> (Var -> m ())
-> Polarity
-> k
-> m Var
encodeWithPolarityHelper Encoder m
encoder (forall (m :: * -> *).
Encoder m -> MutVar (PrimState m) (Map LitSet (Var, Bool, Bool))
encConjTable Encoder m
encoder) Var -> m ()
definePos Var -> m ()
defineNeg Polarity
polarity LitSet
ls2
encodeDisj :: PrimMonad m => Encoder m -> [SAT.Lit] -> m SAT.Lit
encodeDisj :: forall (m :: * -> *). PrimMonad m => Encoder m -> [Var] -> m Var
encodeDisj Encoder m
encoder = forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> [Var] -> m Var
encodeDisjWithPolarity Encoder m
encoder Polarity
polarityBoth
encodeDisjWithPolarity :: PrimMonad m => Encoder m -> Polarity -> [SAT.Lit] -> m SAT.Lit
encodeDisjWithPolarity :: forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> [Var] -> m Var
encodeDisjWithPolarity Encoder m
_ Polarity
_ [Var
l] = forall (m :: * -> *) a. Monad m => a -> m a
return Var
l
encodeDisjWithPolarity Encoder m
encoder Polarity
p [Var]
ls = do
Var
l <- forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> [Var] -> m Var
encodeConjWithPolarity Encoder m
encoder (Polarity -> Polarity
negatePolarity Polarity
p) [Var -> Var
SAT.litNot Var
li | Var
li <- [Var]
ls]
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Var -> Var
SAT.litNot Var
l
encodeITE :: PrimMonad m => Encoder m -> SAT.Lit -> SAT.Lit -> SAT.Lit -> m SAT.Lit
encodeITE :: forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Var -> Var -> Var -> m Var
encodeITE Encoder m
encoder = forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Var -> Var -> Var -> m Var
encodeITEWithPolarity Encoder m
encoder Polarity
polarityBoth
encodeITEWithPolarity :: forall m. PrimMonad m => Encoder m -> Polarity -> SAT.Lit -> SAT.Lit -> SAT.Lit -> m SAT.Lit
encodeITEWithPolarity :: forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Var -> Var -> Var -> m Var
encodeITEWithPolarity Encoder m
encoder Polarity
p Var
c Var
t Var
e | Var
c forall a. Ord a => a -> a -> Bool
< Var
0 =
forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Var -> Var -> Var -> m Var
encodeITEWithPolarity Encoder m
encoder Polarity
p (- Var
c) Var
e Var
t
encodeITEWithPolarity Encoder m
encoder Polarity
polarity Var
c Var
t Var
e = do
let definePos :: SAT.Lit -> m ()
definePos :: Var -> m ()
definePos Var
x = do
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [-Var
x, -Var
c, Var
t]
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [-Var
x, Var
c, Var
e]
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [Var
t, Var
e, -Var
x]
defineNeg :: SAT.Lit -> m ()
defineNeg :: Var -> m ()
defineNeg Var
x = do
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [-Var
c, -Var
t, Var
x]
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [Var
c, -Var
e, Var
x]
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [-Var
t, -Var
e, Var
x]
forall (m :: * -> *) k.
(PrimMonad m, Ord k) =>
Encoder m
-> MutVar (PrimState m) (Map k (Var, Bool, Bool))
-> (Var -> m ())
-> (Var -> m ())
-> Polarity
-> k
-> m Var
encodeWithPolarityHelper Encoder m
encoder (forall (m :: * -> *).
Encoder m
-> MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
encITETable Encoder m
encoder) Var -> m ()
definePos Var -> m ()
defineNeg Polarity
polarity (Var
c,Var
t,Var
e)
encodeXOR :: PrimMonad m => Encoder m -> SAT.Lit -> SAT.Lit -> m SAT.Lit
encodeXOR :: forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Var -> Var -> m Var
encodeXOR Encoder m
encoder = forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Var -> Var -> m Var
encodeXORWithPolarity Encoder m
encoder Polarity
polarityBoth
encodeXORWithPolarity :: forall m. PrimMonad m => Encoder m -> Polarity -> SAT.Lit -> SAT.Lit -> m SAT.Lit
encodeXORWithPolarity :: forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Var -> Var -> m Var
encodeXORWithPolarity Encoder m
encoder Polarity
polarity Var
a Var
b = do
let defineNeg :: Var -> m ()
defineNeg Var
x = do
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [Var
a, -Var
b, Var
x]
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [-Var
a, Var
b, Var
x]
definePos :: Var -> m ()
definePos Var
x = do
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [Var
a, Var
b, -Var
x]
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [-Var
a, -Var
b, -Var
x]
forall (m :: * -> *) k.
(PrimMonad m, Ord k) =>
Encoder m
-> MutVar (PrimState m) (Map k (Var, Bool, Bool))
-> (Var -> m ())
-> (Var -> m ())
-> Polarity
-> k
-> m Var
encodeWithPolarityHelper Encoder m
encoder (forall (m :: * -> *).
Encoder m
-> MutVar (PrimState m) (Map (Var, Var) (Var, Bool, Bool))
encXORTable Encoder m
encoder) Var -> m ()
definePos Var -> m ()
defineNeg Polarity
polarity (Var
a,Var
b)
encodeFASum :: forall m. PrimMonad m => Encoder m -> SAT.Lit -> SAT.Lit -> SAT.Lit -> m SAT.Lit
encodeFASum :: forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Var -> Var -> Var -> m Var
encodeFASum Encoder m
encoder = forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Var -> Var -> Var -> m Var
encodeFASumWithPolarity Encoder m
encoder Polarity
polarityBoth
encodeFASumWithPolarity :: forall m. PrimMonad m => Encoder m -> Polarity -> SAT.Lit -> SAT.Lit -> SAT.Lit -> m SAT.Lit
encodeFASumWithPolarity :: forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Var -> Var -> Var -> m Var
encodeFASumWithPolarity Encoder m
encoder Polarity
polarity Var
a Var
b Var
c = do
let defineNeg :: Var -> m ()
defineNeg Var
x = do
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [-Var
a,-Var
b,-Var
c,Var
x]
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [-Var
a,Var
b,Var
c,Var
x]
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [Var
a,-Var
b,Var
c,Var
x]
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [Var
a,Var
b,-Var
c,Var
x]
definePos :: Var -> m ()
definePos Var
x = do
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [Var
a,Var
b,Var
c,-Var
x]
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [Var
a,-Var
b,-Var
c,-Var
x]
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [-Var
a,Var
b,-Var
c,-Var
x]
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [-Var
a,-Var
b,Var
c,-Var
x]
forall (m :: * -> *) k.
(PrimMonad m, Ord k) =>
Encoder m
-> MutVar (PrimState m) (Map k (Var, Bool, Bool))
-> (Var -> m ())
-> (Var -> m ())
-> Polarity
-> k
-> m Var
encodeWithPolarityHelper Encoder m
encoder (forall (m :: * -> *).
Encoder m
-> MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
encFASumTable Encoder m
encoder) Var -> m ()
definePos Var -> m ()
defineNeg Polarity
polarity (Var
a,Var
b,Var
c)
encodeFACarry :: forall m. PrimMonad m => Encoder m -> SAT.Lit -> SAT.Lit -> SAT.Lit -> m SAT.Lit
encodeFACarry :: forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Var -> Var -> Var -> m Var
encodeFACarry Encoder m
encoder = forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Var -> Var -> Var -> m Var
encodeFACarryWithPolarity Encoder m
encoder Polarity
polarityBoth
encodeFACarryWithPolarity :: forall m. PrimMonad m => Encoder m -> Polarity -> SAT.Lit -> SAT.Lit -> SAT.Lit -> m SAT.Lit
encodeFACarryWithPolarity :: forall (m :: * -> *).
PrimMonad m =>
Encoder m -> Polarity -> Var -> Var -> Var -> m Var
encodeFACarryWithPolarity Encoder m
encoder Polarity
polarity Var
a Var
b Var
c = do
let defineNeg :: Var -> m ()
defineNeg Var
x = do
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [-Var
a,-Var
b,Var
x]
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [-Var
a,-Var
c,Var
x]
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [-Var
b,-Var
c,Var
x]
definePos :: Var -> m ()
definePos Var
x = do
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [Var
a,Var
b,-Var
x]
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [Var
a,Var
c,-Var
x]
forall (m :: * -> *) a. AddClause m a => a -> [Var] -> m ()
SAT.addClause Encoder m
encoder [Var
b,Var
c,-Var
x]
forall (m :: * -> *) k.
(PrimMonad m, Ord k) =>
Encoder m
-> MutVar (PrimState m) (Map k (Var, Bool, Bool))
-> (Var -> m ())
-> (Var -> m ())
-> Polarity
-> k
-> m Var
encodeWithPolarityHelper Encoder m
encoder (forall (m :: * -> *).
Encoder m
-> MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
encFACarryTable Encoder m
encoder) Var -> m ()
definePos Var -> m ()
defineNeg Polarity
polarity (Var
a,Var
b,Var
c)
getDefinitions :: PrimMonad m => Encoder m -> m [(SAT.Var, Formula)]
getDefinitions :: forall (m :: * -> *).
PrimMonad m =>
Encoder m -> m [(Var, Formula)]
getDefinitions Encoder m
encoder = do
Map LitSet (Var, Bool, Bool)
tableConj <- forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (forall (m :: * -> *).
Encoder m -> MutVar (PrimState m) (Map LitSet (Var, Bool, Bool))
encConjTable Encoder m
encoder)
Map (Var, Var, Var) (Var, Bool, Bool)
tableITE <- forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (forall (m :: * -> *).
Encoder m
-> MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
encITETable Encoder m
encoder)
Map (Var, Var) (Var, Bool, Bool)
tableXOR <- forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (forall (m :: * -> *).
Encoder m
-> MutVar (PrimState m) (Map (Var, Var) (Var, Bool, Bool))
encXORTable Encoder m
encoder)
Map (Var, Var, Var) (Var, Bool, Bool)
tableFASum <- forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (forall (m :: * -> *).
Encoder m
-> MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
encFASumTable Encoder m
encoder)
Map (Var, Var, Var) (Var, Bool, Bool)
tableFACarry <- forall (m :: * -> *) a.
PrimMonad m =>
MutVar (PrimState m) a -> m a
readMutVar (forall (m :: * -> *).
Encoder m
-> MutVar (PrimState m) (Map (Var, Var, Var) (Var, Bool, Bool))
encFACarryTable Encoder m
encoder)
let m1 :: [(Var, Formula)]
m1 = [(Var
v, forall a. MonotoneBoolean a => [a] -> a
andB [Var -> Formula
Atom Var
l1 | Var
l1 <- LitSet -> [Var]
IntSet.toList LitSet
ls]) | (LitSet
ls, (Var
v, Bool
_, Bool
_)) <- forall k a. Map k a -> [(k, a)]
Map.toList Map LitSet (Var, Bool, Bool)
tableConj]
m2 :: [(Var, Formula)]
m2 = [(Var
v, forall b a. IfThenElse b a => b -> a -> a -> a
ite (Var -> Formula
Atom Var
c) (Var -> Formula
Atom Var
t) (Var -> Formula
Atom Var
e)) | ((Var
c,Var
t,Var
e), (Var
v, Bool
_, Bool
_)) <- forall k a. Map k a -> [(k, a)]
Map.toList Map (Var, Var, Var) (Var, Bool, Bool)
tableITE]
m3 :: [(Var, Formula)]
m3 = [(Var
v, (Var -> Formula
Atom Var
a forall a. MonotoneBoolean a => a -> a -> a
.||. Var -> Formula
Atom Var
b) forall a. MonotoneBoolean a => a -> a -> a
.&&. (Var -> Formula
Atom (-Var
a) forall a. MonotoneBoolean a => a -> a -> a
.||. Var -> Formula
Atom (-Var
b))) | ((Var
a,Var
b), (Var
v, Bool
_, Bool
_)) <- forall k a. Map k a -> [(k, a)]
Map.toList Map (Var, Var) (Var, Bool, Bool)
tableXOR]
m4 :: [(Var, Formula)]
m4 = [(Var
v, forall a. MonotoneBoolean a => [a] -> a
orB [forall a. MonotoneBoolean a => [a] -> a
andB [Var -> Formula
Atom Var
l | Var
l <- [Var]
ls] | [Var]
ls <- [[Var
a,Var
b,Var
c],[Var
a,-Var
b,-Var
c],[-Var
a,Var
b,-Var
c],[-Var
a,-Var
b,Var
c]]])
| ((Var
a,Var
b,Var
c), (Var
v, Bool
_, Bool
_)) <- forall k a. Map k a -> [(k, a)]
Map.toList Map (Var, Var, Var) (Var, Bool, Bool)
tableFASum]
m5 :: [(Var, Formula)]
m5 = [(Var
v, forall a. MonotoneBoolean a => [a] -> a
orB [forall a. MonotoneBoolean a => [a] -> a
andB [Var -> Formula
Atom Var
l | Var
l <- [Var]
ls] | [Var]
ls <- [[Var
a,Var
b],[Var
a,Var
c],[Var
b,Var
c]]])
| ((Var
a,Var
b,Var
c), (Var
v, Bool
_, Bool
_)) <- forall k a. Map k a -> [(k, a)]
Map.toList Map (Var, Var, Var) (Var, Bool, Bool)
tableFACarry]
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[(Var, Formula)]
m1, [(Var, Formula)]
m2, [(Var, Formula)]
m3, [(Var, Formula)]
m4, [(Var, Formula)]
m5]
data Polarity
= Polarity
{ Polarity -> Bool
polarityPosOccurs :: Bool
, Polarity -> Bool
polarityNegOccurs :: Bool
}
deriving (Polarity -> Polarity -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Polarity -> Polarity -> Bool
$c/= :: Polarity -> Polarity -> Bool
== :: Polarity -> Polarity -> Bool
$c== :: Polarity -> Polarity -> Bool
Eq, Var -> Polarity -> ShowS
[Polarity] -> ShowS
Polarity -> String
forall a.
(Var -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Polarity] -> ShowS
$cshowList :: [Polarity] -> ShowS
show :: Polarity -> String
$cshow :: Polarity -> String
showsPrec :: Var -> Polarity -> ShowS
$cshowsPrec :: Var -> Polarity -> ShowS
Show)
negatePolarity :: Polarity -> Polarity
negatePolarity :: Polarity -> Polarity
negatePolarity (Polarity Bool
pos Bool
neg) = (Bool -> Bool -> Polarity
Polarity Bool
neg Bool
pos)
polarityPos :: Polarity
polarityPos :: Polarity
polarityPos = Bool -> Bool -> Polarity
Polarity Bool
True Bool
False
polarityNeg :: Polarity
polarityNeg :: Polarity
polarityNeg = Bool -> Bool -> Polarity
Polarity Bool
False Bool
True
polarityBoth :: Polarity
polarityBoth :: Polarity
polarityBoth = Bool -> Bool -> Polarity
Polarity Bool
True Bool
True
polarityNone :: Polarity
polarityNone :: Polarity
polarityNone = Bool -> Bool -> Polarity
Polarity Bool
False Bool
False