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