sbv-5.1: SBVUnitTest/Examples/Basics/ProofTests.hs
-----------------------------------------------------------------------------
-- |
-- Module : Examples.Basics.ProofTests
-- Copyright : (c) Levent Erkok
-- License : BSD3
-- Maintainer : erkokl@gmail.com
-- Stability : experimental
--
-- Basic proofs
-----------------------------------------------------------------------------
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Examples.Basics.ProofTests where
import Data.SBV
f1, f2, f3, f4 :: Num a => a -> a -> a
f1 x y = (x+y)*(x-y)
f2 x y = (x*x)-(y*y)
f3 x y = (x+y)*(x+y)
f4 x y = x*x + 2*x*y + y*y
f1eqf2 :: Predicate
f1eqf2 = forAll_ $ \x y -> f1 x y .== f2 x (y :: SWord8)
f1eqf3 :: Predicate
f1eqf3 = forAll ["x", "y"] $ \x y -> f1 x y .== f3 x (y :: SWord8)
f3eqf4 :: Predicate
f3eqf4 = forAll_ $ \x y -> f3 x y .== f4 x (y :: SWord8)
f1Single :: Predicate
f1Single = forAll_ $ \x -> f1 x x .== (0 :: SWord16)
queries :: IO ()
queries = do print =<< prove f1eqf2 -- QED
print =<< prove f1eqf3 -- No
print =<< prove f3eqf4 -- QED
print =<< prove f1Single -- QED
print =<< sat (do x <- exists "x"
y <- exists "y"
return $ f1 x y .== f2 x (y :: SWord8)) -- yes, any output OK
print =<< sat (do x <- exists "x"
y <- exists "y"
return $ f1 x y .== f3 x (y:: SWord8)) -- yes, 0;0
{-# ANN f1 "NoHerbie" #-}
{-# ANN f2 "NoHerbie" #-}
{-# ANN f3 "NoHerbie" #-}
{-# ANN f4 "NoHerbie" #-}