packages feed

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