monadiccp-0.7.7: examples/PerfectSquare.hs
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
import Control.CP.FD.Example
model :: ExampleModel ModelCol
model c = do
let numSquares = c!0
totalSize = c!1
s = slice c ((cte 2) @.. (1+numSquares))
exists $ \pos -> do
size pos @= 2*numSquares
let x i = pos!i
y i = pos!(i+numSquares)
pos `allin` (cte 0,totalSize-1)
loopall (0,numSquares-1) $ \i -> do
x i @<= totalSize - (s!i)
y i @<= totalSize - (s!i)
loopall (0,numSquares-1) $ \i ->
loopall (i+1,numSquares-1) $ \j -> ((x i)+(s!i) @<= (x j)) @|| ((x j)+(s!j) @<= (x i)) @|| ((y i)+(s!i) @<= (y j)) @|| ((y j)+(s!j) @<= (y i))
-- loopall (0,totalSize-1) $ \c -> do
-- totalSize @= xsum (xmap (\i -> (s!i)*channel((x i) @: (c-(s!i)+1,c))) ((cte 0) @.. (numSquares-1)))
-- totalSize @= xsum (xmap (\i -> (s!i)*channel((y i) @: (c-(s!i)+1,c))) ((cte 0) @.. (numSquares-1)))
return pos
main = example_sat_main_coll_expr model