{-# OPTIONS_GHC -Wall -Werror #-}
module Documentation.SBV.Examples.Misc.ModelExtract where
import Data.SBV
outside :: [Integer] -> IO SatResult
outside :: [Integer] -> IO SatResult
outside [Integer]
disallow = SymbolicT IO SBool -> IO SatResult
forall a. Satisfiable a => a -> IO SatResult
sat (SymbolicT IO SBool -> IO SatResult)
-> SymbolicT IO SBool -> IO SatResult
forall a b. (a -> b) -> a -> b
$ do x <- String -> Symbolic SInteger
sInteger String
"x"
let notEq Integer
i = SBool -> m ()
forall a. QuantifiedBool a => a -> m ()
forall (m :: * -> *) a.
(SolverContext m, QuantifiedBool a) =>
a -> m ()
constrain (SBool -> m ()) -> SBool -> m ()
forall a b. (a -> b) -> a -> b
$ SInteger
x SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
./= Integer -> SInteger
forall a. SymVal a => a -> SBV a
literal Integer
i
mapM_ notEq disallow
return $ x .>= 0
genVals :: IO [Integer]
genVals :: IO [Integer]
genVals = [Integer] -> [Integer] -> IO [Integer]
go [] []
where go :: [Integer] -> [Integer] -> IO [Integer]
go [Integer]
_ [Integer]
model
| [Integer] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Integer]
model Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
10 = [Integer] -> IO [Integer]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [Integer]
model
go [Integer]
disallow [Integer]
model
= do res <- [Integer] -> IO SatResult
outside [Integer]
disallow
case "x" `getModelValue` res of
Just Integer
c -> [Integer] -> [Integer] -> IO [Integer]
go ([Integer
cInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
-Integer
4 .. Integer
cInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
+Integer
4] [Integer] -> [Integer] -> [Integer]
forall a. [a] -> [a] -> [a]
++ [Integer]
disallow) (Integer
c Integer -> [Integer] -> [Integer]
forall a. a -> [a] -> [a]
: [Integer]
model)
Maybe Integer
_ -> [Integer] -> IO [Integer]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [Integer]
model