packages feed

opentheory-prime-1.80: src/Test.hs

{- |
module: Main
description: Prime natural numbers - testing
license: MIT

maintainer: Joe Leslie-Hurd <joe@gilith.com>
stability: provisional
portability: portable
-}
module Main
  ( main )
where

import qualified OpenTheory.Natural.Divides as Divides
import qualified OpenTheory.Natural.Prime as Prime
import qualified OpenTheory.Primitive.Natural as Natural
import qualified OpenTheory.Stream as Stream
import OpenTheory.Primitive.Test

assertion0 :: Bool
assertion0 = not (Stream.nth Prime.primes 0 == 0)

proposition0 :: Natural.Natural -> Natural.Natural -> Bool
proposition0 i j =
  (Stream.nth Prime.primes i <= Stream.nth Prime.primes j) == (i <= j)

proposition1 :: Natural.Natural -> Natural.Natural -> Bool
proposition1 i j =
  not
    (Divides.divides (Stream.nth Prime.primes i)
       (Stream.nth Prime.primes (i + (j + 1))))

proposition2 :: Natural.Natural -> Natural.Natural -> Bool
proposition2 n i =
  any (\p -> Divides.divides p (n + 2))
    (Stream.naturalTake Prime.primes i) ||
  Stream.nth Prime.primes i <= n + 2

main :: IO ()
main =
    do assert "Assertion 0:\n  ~(nth Prime.all 0 = 0)\n  " assertion0
       check "Proposition 0:\n  !i j. nth Prime.all i <= nth Prime.all j <=> i <= j\n  " proposition0
       check "Proposition 1:\n  !i j. ~divides (nth Prime.all i) (nth Prime.all (i + (j + 1)))\n  " proposition1
       check "Proposition 2:\n  !n i.\n    any (\\p. divides p (n + 2)) (take Prime.all i) \\/\n    nth Prime.all i <= n + 2\n  " proposition2
       return ()