import QuickCheck ------------------------------------------------------------------------ -- Step -- pulse returns 1 for arguments between 0 and 1, inclusive, and 0 -- otherwise. pulse :: (Ord a, Num a, Num b) => a -> b pulse x | 0 <= x && x <= 1 = 1 | otherwise = 0 pulse' :: Double -> Double pulse' x | 0 <= x && x <= 1 = 1 | x < 0 = 0 | x > 1 = 0 prop_pulse_1 :: Double -> Property prop_pulse_1 x = 0 <= x && x <= 1 ==> pulse x == 1 prop_pulse_0 :: Double -> Property prop_pulse_0 x = x < 0 || x > 1 ==> pulse x == 0 ------------------------------------------------------------------------ -- Square -- Given two arguments, an x coordinate and a y coordinate, returns -- True if the corresponding point lies in or on the unit square -- centred around the origin. unitSquare :: Double -> Double -> Bool unitSquare x y | abs x <= 0.5 && abs y <= 0.5 = True | otherwise = False unitSquare' :: Double -> Double -> Bool unitSquare' x y = if abs x <= 0.5 && abs y <= 0.5 then True else False unitSquare'' :: Double -> Double -> Bool unitSquare'' x y = abs x <= 0.5 && abs y <= 0.5 prop_unitSquare :: Bool prop_unitSquare = unitSquare 0.5 (-0.5) == True && unitSquare 0.5 0.5 == True && unitSquare 1.0 0.0 == False && unitSquare 0.0 0.0 == True prop_unitSquareX :: Double -> Double -> Bool prop_unitSquareX x y = unitSquare x y == unitSquare (-x) y prop_unitSquareY :: Double -> Double -> Bool prop_unitSquareY x y = unitSquare x y == unitSquare x (-y) ------------------------------------------------------------------------ -- Iff -- Returns True iff both arguments are True. iff :: Bool -> Bool -> Bool iff True True = True iff _ _ = False prop_iffLeft :: Bool -> Bool -> Property prop_iffLeft x y = x `iff` y ==> x == True prop_iffRight :: Bool -> Bool -> Property prop_iffRight x y = x `iff` y ==> y == True -- Returns True iff both arguments are True. iff' :: Bool -> Bool -> Bool iff' True True = True iff' x y = False