{- | module: Main description: Fibonacci numbers - testing license: MIT maintainer: Joe Leslie-Hurd stability: provisional portability: portable -} module Main ( main ) where import qualified OpenTheory.Natural.Fibonacci as Fibonacci import qualified OpenTheory.Primitive.Natural as Natural import qualified OpenTheory.Stream as Stream import OpenTheory.Primitive.Test proposition0 :: Natural.Natural -> Bool proposition0 n = Fibonacci.zeckendorf (Fibonacci.encode n) proposition1 :: Natural.Natural -> Bool proposition1 n = Fibonacci.decode (Fibonacci.encode n) == n proposition2 :: Natural.Natural -> Natural.Natural -> Bool proposition2 j k = Stream.nth Fibonacci.fibonaccis (j + (k + 1)) == Stream.nth Fibonacci.fibonaccis j * Stream.nth Fibonacci.fibonaccis k + Stream.nth Fibonacci.fibonaccis (j + 1) * Stream.nth Fibonacci.fibonaccis (k + 1) main :: IO () main = do check "Proposition 0:\n !n. zeckendorf (encode n)\n " proposition0 check "Proposition 1:\n !n. decode (encode n) = n\n " proposition1 check "Proposition 2:\n !j k.\n nth all (j + (k + 1)) =\n nth all j * nth all k + nth all (j + 1) * nth all (k + 1)\n " proposition2 return ()