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