liquidhaskell-0.7.0.0: tests/pos/range.hs
module Range (prop_rng5, myfoldl) where
import Language.Haskell.Liquid.Prelude
{-@ invariant {v:Int| v >= 0} @-}
range :: Int -> Int -> [Int]
range i j = range' (j - i) i j
range' :: Int -> Int -> Int -> [Int]
range' d i j
| i < j = i : (range' (d-1) (i + 1) j)
| otherwise = []
sumTo = foldl (+) 0 . range 0
{-@ decrease lgo 2 @-}
--myfoldl :: (Int -> Int -> Int) -> Int -> [Int] -> Int
myfoldl f z0 xs0 = lgo z0 xs0
where
lgo z [] = z
lgo z (x:xs) = lgo (f z x) xs
n = choose 0
m = choose 1
-- prop_rng1 = map (liquidAssertB . (0 <=)) $ range 0 n
-- prop_rng2 = map (liquidAssertB . (n <=)) $ range n 100
-- prop_rng3 = map (liquidAssertB . (n <=)) $ range n m
-- prop_rng4 = map (liquidAssertB . (<= m)) $ range n m
prop_rng5 = liquidAssertB (0 <= sumTo n)