packages feed

opentheory-fibonacci-1.69: src/Test.hs

{- |
module: Main
description: Fibonacci numbers - testing
license: MIT

maintainer: Joe Leslie-Hurd <joe@gilith.com>
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 ()