{-# OPTIONS_GHC -Wall -Werror #-}
module Documentation.SBV.Examples.Queries.CaseSplit where
import Data.SBV
import Data.SBV.Control
csDemo1 :: IO (String, Float)
csDemo1 :: IO (String, Float)
csDemo1 = forall a. Symbolic a -> IO a
runSMT forall a b. (a -> b) -> a -> b
$ do
SFloat
x <- String -> Symbolic SFloat
sFloat String
"x"
forall (m :: * -> *). SolverContext m => SBool -> m ()
constrain forall a b. (a -> b) -> a -> b
$ SFloat
x forall a. EqSymbolic a => a -> a -> SBool
./= SFloat
x
forall a. Query a -> Symbolic a
query forall a b. (a -> b) -> a -> b
$ do Maybe (String, SMTResult)
mbR <- Bool -> [(String, SBool)] -> Query (Maybe (String, SMTResult))
caseSplit Bool
True [ (String
"fpIsNegativeZero", forall a. IEEEFloating a => SBV a -> SBool
fpIsNegativeZero SFloat
x)
, (String
"fpIsPositiveZero", forall a. IEEEFloating a => SBV a -> SBool
fpIsPositiveZero SFloat
x)
, (String
"fpIsNormal", forall a. IEEEFloating a => SBV a -> SBool
fpIsNormal SFloat
x)
, (String
"fpIsSubnormal", forall a. IEEEFloating a => SBV a -> SBool
fpIsSubnormal SFloat
x)
, (String
"fpIsPoint", forall a. IEEEFloating a => SBV a -> SBool
fpIsPoint SFloat
x)
, (String
"fpIsNaN", forall a. IEEEFloating a => SBV a -> SBool
fpIsNaN SFloat
x)
]
case Maybe (String, SMTResult)
mbR of
Maybe (String, SMTResult)
Nothing -> forall a. HasCallStack => String -> a
error String
"Cannot find a FP number x such that x == x + 1"
Just (String
s, SMTResult
_) -> do Float
xv <- forall a. SymVal a => SBV a -> Query a
getValue SFloat
x
forall (m :: * -> *) a. Monad m => a -> m a
return (String
s, Float
xv)
csDemo2 :: IO (String, Integer)
csDemo2 :: IO (String, Integer)
csDemo2 = forall a. Symbolic a -> IO a
runSMT forall a b. (a -> b) -> a -> b
$ do
SInteger
x <- String -> Symbolic SInteger
sInteger String
"x"
forall (m :: * -> *). SolverContext m => SBool -> m ()
constrain forall a b. (a -> b) -> a -> b
$ SInteger
x forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
10
forall a. Query a -> Symbolic a
query forall a b. (a -> b) -> a -> b
$ do Maybe (String, SMTResult)
mbR <- Bool -> [(String, SBool)] -> Query (Maybe (String, SMTResult))
caseSplit Bool
True [ (String
"negative" , SInteger
x forall a. OrdSymbolic a => a -> a -> SBool
.< SInteger
0)
, (String
"less than 8", SInteger
x forall a. OrdSymbolic a => a -> a -> SBool
.< SInteger
8)
]
case Maybe (String, SMTResult)
mbR of
Maybe (String, SMTResult)
Nothing -> forall a. HasCallStack => String -> a
error String
"Cannot find a solution!"
Just (String
s, SMTResult
_) -> do Integer
xv <- forall a. SymVal a => SBV a -> Query a
getValue SInteger
x
forall (m :: * -> *) a. Monad m => a -> m a
return (String
s, Integer
xv)