packages feed

monadiccp-0.7.7: examples/GolombRuler.hs

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

import Control.CP.FD.Example

model :: ExampleMinModel ModelInt
model n =
  exists $ \m -> do
    size m @= n
    m `allin` (cte 0,n*n)
    let dn = (n*n-n) `div` 2
    exists $ \d -> do
      size d @= dn
      d `allin` (cte 0,n*n)
      let diag i j = d ! (((i*(2*n-i-1)) `div` 2) + j - i - 1)
      m!(cte 0) @= cte 0
      loopall (cte 1,n-1) $ \j -> do
        diag 0 j @= m!j
      loopall (cte 1,n-2) $ \i ->
        loopall (i+1,n-1) $ \j -> do
          diag i j @= (m!j) - (m!i)
      loopall (cte 0,n-1) $ \i ->
        loopall (i+1,n-1) $ \j -> do
          diag i j @>= (j-i)*(j-i+1) `div` 2
      diag 0 1 @<= diag (n-2) (n-1)
      allDiff d
    sSorted m
    return (m!(n-1),m)

main = example_min_main_single_expr model