monadiccp-0.7.7: examples/Sudoku.hs
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
import Control.CP.FD.Example
model :: ExampleModel ()
model () = exists $ \mat -> do
size mat @= 81
allin mat (cte 1,cte 9)
let row i = slice mat $ xmap (\p -> i*9+p) (cte 0 @.. cte 8)
let col i = slice mat $ xmap (\p -> i+9*p) (cte 0 @.. cte 8)
let block r c = slice mat $ xmap (\p -> 3*c+27*r+p) $ list [0,1,2,9,10,11,18,19,20]
let pos r c = mat!(r*9+c)
loopall (cte 0,cte 2) $ \i ->
loopall (cte 0,cte 2) $ \j -> do
allDiffD $ row $ i*3+j
allDiffD $ col $ i*3+j
allDiffD $ block i j
pos 0 8 @= cte 2
pos 1 0 @= cte 4
pos 1 4 @= cte 3
pos 1 8 @= cte 1
pos 2 4 @= cte 1
pos 2 6 @= cte 9
pos 2 7 @= cte 5
pos 3 0 @= cte 5
pos 3 2 @= cte 2
pos 3 3 @= cte 8
pos 3 6 @= cte 1
pos 4 3 @= cte 7
pos 4 5 @= cte 2
pos 5 2 @= cte 7
pos 5 5 @= cte 9
pos 5 6 @= cte 2
pos 5 8 @= cte 4
pos 6 1 @= cte 4
pos 6 4 @= cte 2
pos 7 0 @= cte 1
pos 7 2 @= cte 9
pos 7 4 @= cte 7
pos 7 8 @= cte 6
pos 8 0 @= cte 3
pos 8 3 @= cte 5
return mat
main = example_sat_main_void model