{- | module: Main description: Prime numbers - testing license: MIT maintainer: Joe Leslie-Hurd stability: provisional portability: portable -} module Main ( main ) where import qualified OpenTheory.Data.Stream as Data.Stream import qualified OpenTheory.Number.Natural as Number.Natural import qualified OpenTheory.Number.Natural.Geometric as Number.Natural.Geometric import qualified OpenTheory.Number.Natural.Prime as Number.Natural.Prime import qualified OpenTheory.Primitive.Random as Primitive.Random import qualified OpenTheory.Primitive.Test as Primitive.Test assertion0 :: Bool assertion0 = not (Data.Stream.nth Number.Natural.Prime.all 0 == 0) proposition0 :: Primitive.Random.Random -> Bool proposition0 r = let (i, r') = Number.Natural.Geometric.fromRandom r in let (j, _) = Number.Natural.Geometric.fromRandom r' in (Data.Stream.nth Number.Natural.Prime.all i <= Data.Stream.nth Number.Natural.Prime.all j) == (i <= j) proposition1 :: Primitive.Random.Random -> Bool proposition1 r = let (i, r') = Number.Natural.Geometric.fromRandom r in let (j, _) = Number.Natural.Geometric.fromRandom r' in not (Number.Natural.divides (Data.Stream.nth Number.Natural.Prime.all i) (Data.Stream.nth Number.Natural.Prime.all (i + j + 1))) proposition2 :: Primitive.Random.Random -> Bool proposition2 r = let (n, r') = Number.Natural.fromRandom r in let (i, _) = Number.Natural.Geometric.fromRandom r' in any (\p -> Number.Natural.divides p (n + 2)) (Data.Stream.take' Number.Natural.Prime.all i) || Data.Stream.nth Number.Natural.Prime.all i <= n + 2 main :: IO () main = do Primitive.Test.assert "Assertion 0:\n ~(H.nth H.Prime.all 0 = 0)\n " assertion0 Primitive.Test.check "Proposition 0:\n !r.\n let (i, r') <- H.Geometric.fromRandom r in\n let (j, r'') <- H.Geometric.fromRandom r' in\n H.nth H.Prime.all i <= H.nth H.Prime.all j <=> i <= j\n " proposition0 Primitive.Test.check "Proposition 1:\n !r.\n let (i, r') <- H.Geometric.fromRandom r in\n let (j, r'') <- H.Geometric.fromRandom r' in\n ~H.divides (H.nth H.Prime.all i) (H.nth H.Prime.all (i + j + 1))\n " proposition1 Primitive.Test.check "Proposition 2:\n !r.\n let (n, r') <- H.fromRandom r in\n let (i, r'') <- H.Geometric.fromRandom r' in\n any (\\p. H.divides p (n + 2)) (H.take' H.Prime.all i) \\/\n H.nth H.Prime.all i <= n + 2\n " proposition2 return ()