packages feed

satchmo-1.0: test/Schur.hs

import Prelude hiding ( not, or, and )

import Satchmo.Relation
import Satchmo.Code
import Satchmo.Boolean
import Satchmo.Counting
import Satchmo.Solve

import Data.List ( inits, tails )
import qualified Data.Array as A
import System.Environment
import Control.Monad ( guard, forM_ )

-- | command line arguments: c n
-- program looks for sum-free c-colouring of [1 .. n]

main :: IO ()
main = do
    argv <- getArgs
    let [ c, n ] = map read argv
    Just a <- solve $ schur c n
    putStrLn $ table a
    print $ do
        o <- [ 1 .. c ]
        return ( o, length $ do i <- [ 1 .. n ]; guard $ a A.! (i,o) )

schur c n = do
    col <- relation ((1,1),(n,c))
    each_number_coloured col
    sum_free_colouring col
    return $ decode col

periodic p col = sequence_ $ do
    let ((1,1),(n,c)) = bounds col
    x <- [ 1 .. n ]
    let y = x + p
    guard $ y <= n
    o <- [ 1 .. c ]
    let p = 1 + o `mod` c
    return $ assert [ not $ col!(x,o), col!(y,p) ]

each_number_coloured col = sequence_ $ do
    let ((1,1),(n,c)) = bounds col
    x <- [ 1 .. n ]
    return $ assert $ do o <- [1 .. c]; return $ col!(x,o)

sum_free_colouring col = sequence_ $ do
    let ((1,1),(n,c)) = bounds col
    x <- [ 1 .. n ]
    y <- [ x .. n ]
    let z = (x + y) `mod` (n+1)
    guard $ z <= n
    guard $ 1 <= z
    o <- [1 .. c]
    return $ assert $ do 
        p <- [ x, y, z ]
        return $ not $ col!(p,o)

evenly_distributed col = do
    let ((1,1),(n,c)) = bounds col
        d = n `div` c
    forM_ [ 1 .. c ] $ \ o -> do
        a <- atleast d $ do i <- [ 1 .. n ] ; return $ col!(i,o)
        assert [a]