{-# 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
x <- String -> Symbolic SFloat
sFloat String
"x"
constrain $ x ./= x
query $ do mbR <- caseSplit True [ ("fpIsNegativeZero", fpIsNegativeZero x)
, ("fpIsPositiveZero", fpIsPositiveZero x)
, ("fpIsNormal", fpIsNormal x)
, ("fpIsSubnormal", fpIsSubnormal x)
, ("fpIsPoint", fpIsPoint x)
, ("fpIsNaN", fpIsNaN x)
]
case 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"
Just (String
s, SMTResult
_) -> do xv <- SFloat -> Query Float
forall a. SymVal a => SBV a -> Query a
getValue SFloat
x
return (s, 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
x <- String -> Symbolic SInteger
sInteger String
"x"
constrain $ x .== 10
query $ do mbR <- caseSplit True [ ("negative" , x .< 0)
, ("less than 8", x .< 8)
]
case 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 xv <- SInteger -> Query Integer
forall a. SymVal a => SBV a -> Query a
getValue SInteger
x
return (s, xv)