module Jukebox.Sat.ThreeValued where
import Jukebox.Sat
data Lit3 = Lit3{ isFalse :: Lit, isTrue :: Lit }
false3, true3, bottom3 :: Lit3
false3 = Lit3 true false
true3 = neg3 false3
bottom3 = Lit3 false false
neg3 :: Lit3 -> Lit3
neg3 (Lit3 f t) = Lit3 t f
newLit3 :: SatSolver s => s -> IO Lit3
newLit3 s =
do a <- newLit s
b <- newLit s
addClause s [neg a, neg b]
return (Lit3 a b)
newLit2 :: SatSolver s => s -> IO Lit3
newLit2 s =
do a <- newLit s
return (Lit3 a (neg a))
modelValue3 :: SatSolver s => s -> Lit3 -> IO (Maybe Bool)
modelValue3 s = val3 (modelValue s)
value3 :: SatSolver s => s -> Lit3 -> IO (Maybe Bool)
value3 s = val3 (value s)
val3 :: (Lit -> IO (Maybe Bool)) -> Lit3 -> IO (Maybe Bool)
val3 get (Lit3 f t) =
do mf <- get f
case mf of
Just True -> do return (Just False)
_ -> do mt <- get t
case mt of
Just True -> return (Just True)
_ -> return Nothing