packages feed

liquidhaskell-0.8.2.0: tests/pos/Termination.lhs

\begin{code}
module Termination where
import Prelude hiding (sum)
type Value = Int

type Vec = Int -> Value

{-@ sum :: Vec -> Nat -> Value @-}
sum :: Vec -> Int -> Value
sum a 0 = a 0
sum a i = a i + sum a (i-1)

{-@ sum' :: Vec -> Value -> n:Nat -> Value / [n] @-}
sum' :: Vec -> Value -> Int -> Value
sum' a acc 0 = acc + a 0
sum' a acc i = sum' a (acc + a i) (i-1)

type Vec2D = Int -> Int -> Value

{-@ sum2D :: Vec2D -> Nat -> Nat -> Value @-}
sum2D :: Vec2D -> Int -> Int -> Value
sum2D a n m = go n m
  where
    {-@ go :: ink:Nat -> joe:Nat -> Value / [ink, joe] @-}
    go 0 0        = a 0 0
    go i j
      | j == 0    =  a i 0 + go (i-1) m
      | otherwise =  a i j + go i (j-1)

{-@ sumFromTo :: Vec -> lo:Nat -> hi:{v:Nat|v>=lo} -> Value @-}
sumFromTo :: Vec -> Int -> Int ->  Value
sumFromTo a lo hi = go lo hi
  where
       {-@ go :: lo:Nat -> hi:{v:Nat|v>=lo} -> Value / [hi-lo] @-}
        go lo hi | lo == hi  =  a lo
                 | otherwise =  a lo + go (lo+1) hi
\end{code}