{- | module: Main description: Prime natural numbers - testing license: MIT maintainer: Joe Leslie-Hurd 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 ()