{-# LANGUAGE CPP #-}
{-# OPTIONS_GHC -Wall -Werror #-}
module Documentation.SBV.Examples.BitPrecise.BrokenSearch where
import Data.SBV
import Data.SBV.Tools.Overflow
#ifndef HADDOCK
#endif
midPointBroken :: SInt32 -> SInt32 -> SInt32
midPointBroken :: SInt32 -> SInt32 -> SInt32
midPointBroken SInt32
low SInt32
high = (SInt32
low SInt32 -> SInt32 -> SInt32
forall a.
(CheckedArithmetic a, ?loc::CallStack) =>
SBV a -> SBV a -> SBV a
+! SInt32
high) SInt32 -> SInt32 -> SInt32
forall a.
(CheckedArithmetic a, ?loc::CallStack) =>
SBV a -> SBV a -> SBV a
/! SInt32
2
midPointFixed :: SInt32 -> SInt32 -> SInt32
midPointFixed :: SInt32 -> SInt32 -> SInt32
midPointFixed SInt32
low SInt32
high = SInt32
low SInt32 -> SInt32 -> SInt32
forall a.
(CheckedArithmetic a, ?loc::CallStack) =>
SBV a -> SBV a -> SBV a
+! ((SInt32
high SInt32 -> SInt32 -> SInt32
forall a.
(CheckedArithmetic a, ?loc::CallStack) =>
SBV a -> SBV a -> SBV a
-! SInt32
low) SInt32 -> SInt32 -> SInt32
forall a.
(CheckedArithmetic a, ?loc::CallStack) =>
SBV a -> SBV a -> SBV a
/! SInt32
2)
midPointAlternative :: SInt32 -> SInt32 -> SInt32
midPointAlternative :: SInt32 -> SInt32 -> SInt32
midPointAlternative SInt32
low SInt32
high = SBV Word32 -> SInt32
forall a b.
(Integral a, HasKind a, Num a, SymVal a, HasKind b, Num b,
SymVal b) =>
SBV a -> SBV b
sFromIntegral ((SBV Word32
low' SBV Word32 -> SBV Word32 -> SBV Word32
forall a.
(CheckedArithmetic a, ?loc::CallStack) =>
SBV a -> SBV a -> SBV a
+! SBV Word32
high') SBV Word32 -> Int -> SBV Word32
forall a. Bits a => a -> Int -> a
`shiftR` Int
1)
where low', high' :: SWord32
low' :: SBV Word32
low' = SInt32 -> SBV Word32
forall a b.
(?loc::CallStack, Integral a, HasKind a, HasKind b, Num a,
SymVal a, HasKind b, Num b, SymVal b) =>
SBV a -> SBV b
sFromIntegralChecked SInt32
low
high' :: SBV Word32
high' = SInt32 -> SBV Word32
forall a b.
(?loc::CallStack, Integral a, HasKind a, HasKind b, Num a,
SymVal a, HasKind b, Num b, SymVal b) =>
SBV a -> SBV b
sFromIntegralChecked SInt32
high
checkArithOverflow :: (SInt32 -> SInt32 -> SInt32) -> IO ()
checkArithOverflow :: (SInt32 -> SInt32 -> SInt32) -> IO ()
checkArithOverflow SInt32 -> SInt32 -> SInt32
f = do sr <- SymbolicT IO SInt32 -> IO [SafeResult]
forall a. SExecutable IO a => a -> IO [SafeResult]
safe (SymbolicT IO SInt32 -> IO [SafeResult])
-> SymbolicT IO SInt32 -> IO [SafeResult]
forall a b. (a -> b) -> a -> b
$ do low <- String -> SymbolicT IO SInt32
sInt32 String
"low"
high <- sInt32 "high"
constrain $ low .>= 0
constrain $ low .<= high
output $ f low high
case filter (not . isSafe) sr of
[] -> String -> IO ()
putStrLn String
"No violations detected."
[SafeResult]
xs -> (SafeResult -> IO ()) -> [SafeResult] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ SafeResult -> IO ()
forall a. Show a => a -> IO ()
print [SafeResult]
xs
checkCorrectMidValue :: (SInt32 -> SInt32 -> SInt32) -> IO ThmResult
checkCorrectMidValue :: (SInt32 -> SInt32 -> SInt32) -> IO ThmResult
checkCorrectMidValue SInt32 -> SInt32 -> SInt32
f = SymbolicT IO SBool -> IO ThmResult
forall a. Provable a => a -> IO ThmResult
prove (SymbolicT IO SBool -> IO ThmResult)
-> SymbolicT IO SBool -> IO ThmResult
forall a b. (a -> b) -> a -> b
$ do low <- String -> SymbolicT IO SInt32
sInt32 String
"low"
high <- sInt32 "high"
constrain $ low .>= 0
constrain $ low .<= high
let low', high' :: SInt64
low' = SInt32 -> SBV Int64
forall a b.
(Integral a, HasKind a, Num a, SymVal a, HasKind b, Num b,
SymVal b) =>
SBV a -> SBV b
sFromIntegral SInt32
low
high' = SInt32 -> SBV Int64
forall a b.
(Integral a, HasKind a, Num a, SymVal a, HasKind b, Num b,
SymVal b) =>
SBV a -> SBV b
sFromIntegral SInt32
high
mid' = (SBV Int64
low' SBV Int64 -> SBV Int64 -> SBV Int64
forall a. Num a => a -> a -> a
+ SBV Int64
high') SBV Int64 -> SBV Int64 -> SBV Int64
forall a. SDivisible a => a -> a -> a
`sDiv` SBV Int64
2
mid = SInt32 -> SInt32 -> SInt32
f SInt32
low SInt32
high
return $ sFromIntegral mid .== mid'