{- | module: Main description: The divides relation on natural numbers - testing license: MIT maintainer: Joe Leslie-Hurd stability: provisional portability: portable -} module Main ( main ) where import qualified OpenTheory.Natural as Natural import qualified OpenTheory.Natural.Divides as Divides import qualified OpenTheory.Primitive.Natural as Primitive.Natural import OpenTheory.Primitive.Test proposition0 :: Primitive.Natural.Natural -> Bool proposition0 a = Divides.divides a 0 proposition1 :: Primitive.Natural.Natural -> Bool proposition1 a = Divides.divides a a proposition2 :: Primitive.Natural.Natural -> Bool proposition2 a = Divides.divides 1 a proposition3 :: Primitive.Natural.Natural -> Primitive.Natural.Natural -> Bool proposition3 a b = Divides.divides (fst (Divides.egcd a b)) a proposition4 :: Primitive.Natural.Natural -> Primitive.Natural.Natural -> Bool proposition4 a b = Divides.divides (fst (Divides.egcd a b)) b proposition5 :: Primitive.Natural.Natural -> Bool proposition5 a = Divides.divides 2 a == Natural.naturalEven a proposition6 :: Primitive.Natural.Natural -> Primitive.Natural.Natural -> Bool proposition6 a b = let (g, (s, t)) = Divides.egcd (a + 1) b in t * b + g == s * (a + 1) main :: IO () main = do check "Proposition 0:\n !a. divides a 0\n " proposition0 check "Proposition 1:\n !a. divides a a\n " proposition1 check "Proposition 2:\n !a. divides 1 a\n " proposition2 check "Proposition 3:\n !a b. divides (fst (egcd a b)) a\n " proposition3 check "Proposition 4:\n !a b. divides (fst (egcd a b)) b\n " proposition4 check "Proposition 5:\n !a. divides 2 a <=> even a\n " proposition5 check "Proposition 6:\n !a b. let (g, s, t) <- egcd (a + 1) b in t * b + g = s * (a + 1)\n " proposition6 return ()