packages feed

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