packages feed

monadiccp-0.7.7: examples/Partition.hs

{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}

import Control.CP.FD.Example

model :: ExampleModel ModelInt
model n =
  exists $ \x -> do
  exists $ \y -> do
    let xy = x @++ y
    size x @= n
    size y @= n
    x `allin` (cte 1,2*n)
    y `allin` (cte 1,2*n)
    sSorted x
    sSorted y
    (x!cte 0) @< (y!cte 0)
    allDiff xy
    let sx = xmap (\v -> v*v) x
    let sy = xmap (\v -> v*v) y
    xsum x @=  xsum y
    xsum sx @= xsum sy
    let t1 = 2*n*(2*n+1) `div` 4
    let t2 = 2*n*(2*n+1)*(4*n+1) `div` 12
    xsum x @= t1
    xsum y @= t1
    xsum sx @= t2
    xsum sy @= t2
    return xy

main = example_sat_main_single_expr model