{-# OPTIONS_GHC -Wall -Werror #-}
module Documentation.SBV.Examples.Queries.AllSat where
import Data.SBV
import Data.SBV.Control
goodSum :: Symbolic [(Integer, Integer)]
goodSum :: Symbolic [(Integer, Integer)]
goodSum = do x <- String -> Symbolic SInteger
sInteger String
"x"
y <- sInteger "y"
constrain $ x .>= 0
constrain $ y .>= 0
constrain $ x + y .== 10
let next Integer
i [(Integer, Integer)]
sofar = do
IO () -> Query ()
forall a. IO a -> Query a
io (IO () -> Query ()) -> IO () -> Query ()
forall a b. (a -> b) -> a -> b
$ String -> IO ()
putStrLn (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"Iteration: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Integer -> String
forall a. Show a => a -> String
show (Integer
i :: Integer)
cs <- [SBool] -> Query CheckSatResult
checkSatAssuming [SInteger
x SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== Integer -> SInteger
forall a. SymVal a => a -> SBV a
literal (Integer
iInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
-Integer
1)]
case cs of
CheckSatResult
Unk -> String -> QueryT IO [(Integer, Integer)]
forall a. HasCallStack => String -> a
error String
"Too bad, solver said unknown.."
DSat{} -> String -> QueryT IO [(Integer, Integer)]
forall a. HasCallStack => String -> a
error String
"Unexpected dsat result.."
CheckSatResult
Unsat -> do IO () -> Query ()
forall a. IO a -> Query a
io (IO () -> Query ()) -> IO () -> Query ()
forall a b. (a -> b) -> a -> b
$ String -> IO ()
putStrLn String
"No other solution!"
[(Integer, Integer)] -> QueryT IO [(Integer, Integer)]
forall a. a -> QueryT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ([(Integer, Integer)] -> QueryT IO [(Integer, Integer)])
-> [(Integer, Integer)] -> QueryT IO [(Integer, Integer)]
forall a b. (a -> b) -> a -> b
$ [(Integer, Integer)] -> [(Integer, Integer)]
forall a. [a] -> [a]
reverse [(Integer, Integer)]
sofar
CheckSatResult
Sat -> do xv <- SInteger -> Query Integer
forall a. SymVal a => SBV a -> Query a
getValue SInteger
x
yv <- getValue y
io $ putStrLn $ "Current solution is: " ++ show (xv, yv)
constrain $ x ./= literal xv
.|| y ./= literal yv
next (i+1) ((xv, yv) : sofar)
query $ do io $ putStrLn "Starting the all-sat engine!"
next 1 []
demo :: IO ()
demo :: IO ()
demo = [(Integer, Integer)] -> IO ()
forall a. Show a => a -> IO ()
print ([(Integer, Integer)] -> IO ()) -> IO [(Integer, Integer)] -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Symbolic [(Integer, Integer)] -> IO [(Integer, Integer)]
forall a. Symbolic a -> IO a
runSMT Symbolic [(Integer, Integer)]
goodSum