{-# 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 = Symbolic (String, Float) -> IO (String, Float)
forall a. Symbolic a -> IO a
runSMT (Symbolic (String, Float) -> IO (String, Float))
-> Symbolic (String, Float) -> IO (String, Float)
forall a b. (a -> b) -> a -> b
$ do
       SFloat
x <- String -> Symbolic SFloat
sFloat String
"x"
       SBool -> SymbolicT IO ()
forall (m :: * -> *). SolverContext m => SBool -> m ()
constrain (SBool -> SymbolicT IO ()) -> SBool -> SymbolicT IO ()
forall a b. (a -> b) -> a -> b
$ SFloat
x SFloat -> SFloat -> SBool
forall a. EqSymbolic a => a -> a -> SBool
./= SFloat
x 
       Query (String, Float) -> Symbolic (String, Float)
forall a. Query a -> Symbolic a
query (Query (String, Float) -> Symbolic (String, Float))
-> Query (String, Float) -> Symbolic (String, Float)
forall a b. (a -> b) -> a -> b
$ do Maybe (String, SMTResult)
mbR <- Bool -> [(String, SBool)] -> Query (Maybe (String, SMTResult))
caseSplit Bool
True [ (String
"fpIsNegativeZero", SFloat -> SBool
forall a. IEEEFloating a => SBV a -> SBool
fpIsNegativeZero SFloat
x)
                                        , (String
"fpIsPositiveZero", SFloat -> SBool
forall a. IEEEFloating a => SBV a -> SBool
fpIsPositiveZero SFloat
x)
                                        , (String
"fpIsNormal",       SFloat -> SBool
forall a. IEEEFloating a => SBV a -> SBool
fpIsNormal       SFloat
x)
                                        , (String
"fpIsSubnormal",    SFloat -> SBool
forall a. IEEEFloating a => SBV a -> SBool
fpIsSubnormal    SFloat
x)
                                        , (String
"fpIsPoint",        SFloat -> SBool
forall a. IEEEFloating a => SBV a -> SBool
fpIsPoint        SFloat
x)
                                        , (String
"fpIsNaN",          SFloat -> SBool
forall a. IEEEFloating a => SBV a -> SBool
fpIsNaN          SFloat
x)
                                        ]
                  case Maybe (String, SMTResult)
mbR of
                    Maybe (String, SMTResult)
Nothing     -> String -> Query (String, Float)
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 <- SFloat -> Query Float
forall a. SymVal a => SBV a -> Query a
getValue SFloat
x
                                      (String, Float) -> Query (String, Float)
forall (m :: * -> *) a. Monad m => a -> m a
return (String
s, Float
xv)
csDemo2 :: IO (String, Integer)
csDemo2 :: IO (String, Integer)
csDemo2 = Symbolic (String, Integer) -> IO (String, Integer)
forall a. Symbolic a -> IO a
runSMT (Symbolic (String, Integer) -> IO (String, Integer))
-> Symbolic (String, Integer) -> IO (String, Integer)
forall a b. (a -> b) -> a -> b
$ do
       SInteger
x <- String -> Symbolic SInteger
sInteger String
"x"
       SBool -> SymbolicT IO ()
forall (m :: * -> *). SolverContext m => SBool -> m ()
constrain (SBool -> SymbolicT IO ()) -> SBool -> SymbolicT IO ()
forall a b. (a -> b) -> a -> b
$ SInteger
x SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
10
       Query (String, Integer) -> Symbolic (String, Integer)
forall a. Query a -> Symbolic a
query (Query (String, Integer) -> Symbolic (String, Integer))
-> Query (String, Integer) -> Symbolic (String, Integer)
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 SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.< SInteger
0)
                                        , (String
"less than 8", SInteger
x SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.< SInteger
8)
                                        ]
                  case Maybe (String, SMTResult)
mbR of
                    Maybe (String, SMTResult)
Nothing     -> String -> Query (String, Integer)
forall a. HasCallStack => String -> a
error String
"Cannot find a solution!" 
                    Just (String
s, SMTResult
_) -> do Integer
xv <- SInteger -> Query Integer
forall a. SymVal a => SBV a -> Query a
getValue SInteger
x
                                      (String, Integer) -> Query (String, Integer)
forall (m :: * -> *) a. Monad m => a -> m a
return (String
s, Integer
xv)