packages feed

monadiccp-0.6: examples/Ring.hs

import Control.CP.FD.Example.Example
import Control.CP.FD.FD
import Control.CP.FD.Expr
import Control.CP.SearchTree

import List (tails)
import Data.Map (toList)

main = example_main_single model

-- generate a disjunction producing a list of variables, consisting of alr
-- prefixed by up to maxlen new variables
varexist :: FDSolver solver => Int -> [FDExpr solver] -> Tree (FDWrapper solver) [FDExpr solver]
varexist maxlen alr = 
  if maxlen==0
  then return alr
  else return alr \/ (exists $ \x -> varexist (maxlen-1) (x:alr))

-- constr list i = (if (i < (length list)-2) then v2 @= v0 * v1 - i else true) /\ v0 @: (-10,10)
constr list i = 2*v1 @= 2*v2 - v0 /\ 
                v0 @: (-10,10)
   where v0 = list !! i
         v1 = list !! ((i+1) `mod` (length list))
         v2 = list !! ((i+2) `mod` (length list))

model :: FDSolver solver => Int -> Tree (FDWrapper solver) [FDExpr solver]
model n = exists $ \x -> 
          do list <- varexist n [x]
             conj $ [ constr list i | i <- [0..(length list)-1] ]
             return list