packages feed

liquidhaskell-0.4.0.0: tests/pos/GCD.hs

module GCD () where

import Prelude hiding (gcd, mod)
import Language.Haskell.Liquid.Prelude
{-@ mod :: a:Nat -> b:{v:Nat| ((v < a) && (v > 0))} -> {v:Nat | v < b} @-}
mod :: Int -> Int -> Int
mod a b | a - b >  b = mod (a - b) b
        | a - b <  b = a - b
        | a - b == b = 0

{-@ gcd :: a:Nat -> b:{v:Nat | v < a} -> Int @-}
gcd :: Int -> Int -> Int
gcd a 0 = a
gcd a b = gcd b (a `mod` b)

{-@ gcd' :: a:Nat -> b:Nat -> Nat / [a, b] @-}
gcd' :: Int -> Int -> Int
gcd' a b | a == 0 = b
         | b == 0 = a
         | a == b = a
         | a >  b = gcd' (a - b) b 
         | a <  b = gcd' a (b - a)