smallcheck-0.2.1: examples/numeric/NumProps.hs
------------------------------------------
-- Illustrating numerics in SmallCheck 0.2
-- Colin Runciman, November 2006.
------------------------------------------
module NumProps where
import Test.SmallCheck
primes :: [Int]
primes = sieve [2..]
where
sieve (p:xs) =
p : filter (noFactorIn primes) xs
noFactorIn (p:ps) x =
p*p > x || x `mod` p > 0 && noFactorIn ps x
-- using natural numbers
prop_primes1 :: Nat -> Property
prop_primes1 (N n) =
n > 1 ==> forAll (`take` primes) $ \p ->
p `mod` n > 0 || n == p
prop_primes2 :: Nat -> Property
prop_primes2 (N n) =
n > 0 ==> exists $ \exponents ->
n == product (zipWith power primes exponents)
where
power p (N e) = product (replicate e p)
-- using floating point numbers
prop_logExp :: Float -> Bool
prop_logExp x = exp (log x) == x
prop_recipRecip :: Float -> Bool
prop_recipRecip x = 1.0 / (1.0 / x) == x
main :: IO ()
main = do
test1 "\\(N n) -> n > 1 ==> forAll (`take` primes) $ \\p ->\n\
\ p `mod` n > 0 || n == p"
prop_primes1
test1 "\\(N n) -> n > 0 ==> exists $ \\exponents ->\n\
\ n == product (zipWith power primes exponents)"
prop_primes2
test1 "\\x -> exp (log x) == x"
prop_logExp
test1 "\\x -> 1.0 / (1.0 / x) == x"
prop_recipRecip
test1 :: Testable a => String -> a -> IO ()
test1 s t = do
rule
putStrLn s
rule
smallCheck 8 t
where
rule = putStrLn "----------------------------------------------------"