monadiccp-0.7.5: examples/StressDomain.hs
import List (transpose)
import Control.CP.FD.Example.Example
import Control.CP.FD.FD
import Control.CP.FD.Expr
import Control.CP.SearchTree
main = example_main_single model
cutAt p l = case (splitAt p l) of
(l,[]) -> [l]
(b,r) -> b:(cutAt p r)
mexist r c = exist (r*c) $ \list -> return $ cutAt c list
lsum v l = (foldl1 (+) l) @= v
diag bc ic m = map (\x -> (m!!x)!!(bc+ic*x)) [0..(length m)-1]
model :: FDSolver solver => Int -> Tree (FDWrapper solver) [FDExpr solver]
model n = exist 5 $ \l -> do
allin l (0,5*n)
let forvar v = conj $ map (\p -> conj $ map (\j -> v @/= 5*j+p) [0..(cte (5*n))]) [0,2,4]
conj $ map forvar $ reverse l
conj $ map (\j -> conj $ map (\v -> v @>= cte (5*j) /\ v @<= cte (5*(j+5*(n `div` 2)))) $ reverse l) [0..5*(n `div` 2)]
return l