Download
$
$ Killer Sudoku in Essence'.
$
$   http://en.wikipedia.org/wiki/Killer_Sudoku
$   """
$   Killer sudoku (also killer su doku, sumdoku, sum doku, addoku, or 
$   samunamupure) is a puzzle that combines elements of sudoku and kakuro. 
$   Despite the name, the simpler killer sudokus can be easier to solve 
$   than regular sudokus, depending on the solver's skill at mental arithmetic; 
$   the hardest ones, however, can take hours to crack.
$
$   ...
$
$   The objective is to fill the grid with numbers from 1 to 9 in a way that 
$   the following conditions are met:
$
$     * Each row, column, and nonet contains each number exactly once.
$     * The sum of all numbers in a cage must match the small number printed 
$       in its corner.
$     * No number appears more than once in a cage. (This is the standard rule 
$       for killer sudokus, and implies that no cage can include more 
$       than 9 cells.)
$
$   In 'Killer X', an additional rule is that each of the long diagonals 
$   contains each number once.
$   """
$
$   Here we solve the problem from the Wikipedia page, also shown here
$   http://en.wikipedia.org/wiki/File:Killersudoku_color.svg
$
$   The output is:
$     2 1 5 6 4 7 3 9 8
$     3 6 8 9 5 2 1 7 4
$     7 9 4 3 8 1 6 5 2
$     5 8 6 2 7 4 9 3 1
$     1 4 2 5 9 3 8 6 7
$     9 7 3 8 1 6 4 2 5
$     8 2 1 7 3 9 5 4 6
$     6 5 9 4 2 8 7 1 3
$     4 3 7 1 6 5 2 8 9
$
$
$ Model created by Hakan Kjellerstrand, hakank@gmail.com
$ See also my Essence'/Savile Row page: http://www.hakank.org/savile_row/
$
$ Licenced under CC-BY-4.0 : http://creativecommons.org/licenses/by/4.0/

language ESSENCE' 1.0

letting n be 9
letting range be domain int(1..9)

$ For a better view of the problem, see
$  http://en.wikipedia.org/wiki/File:Killersudoku_color.svg
letting num_p be 29     $ number of segments
letting num_hints be 4  $ number of hints per segments (that's max number of hints)
letting P =
[
    [1,1,  1,2, 0,0, 0,0,   3],
    [1,3,  1,4, 1,5, 0,0,  15],
    [1,6,  2,5, 2,6, 3,5,  22],
    [1,7,  2,7, 0,0, 0,0,   4],
    [1,8,  2,8, 0,0, 0,0,  16],
    [1,9,  2,9, 3,9, 4,9,  15],
    [2,1,  2,2, 3,1, 3,2,  25],
    [2,3,  2,4, 0,0, 0,0,  17],
    [3,3,  3,4, 4,4, 0,0,   9],
    [3,6,  4,6, 5,6, 0,0,   8],
    [3,7,  3,8, 4,7, 0,0,  20],
    [4,1,  5,1, 0,0, 0,0,   6],
    [4,2,  4,3, 0,0, 0,0,  14],
    [4,5,  5,5, 6,5, 0,0,  17],
    [4,8,  5,7, 5,8, 0,0,  17],
    [5,2,  5,3, 6,2, 0,0,  13],
    [5,4,  6,4, 7,4, 0,0,  20],
    [5,9,  6,9, 0,0, 0,0,  12],
    [6,1,  7,1, 8,1, 9,1,  27],
    [6,3,  7,2, 7,3, 0,0,   6],
    [6,6,  7,6, 7,7, 0,0,  20],
    [6,7,  6,8, 0,0, 0,0,   6],
    [7,5,  8,4, 8,5, 9,4,  10],
    [7,8,  7,9, 8,8, 8,9,  14],
    [8,2,  9,2, 0,0, 0,0,   8],
    [8,3,  9,3, 0,0, 0,0,  16],
    [8,6,  8,7, 0,0, 0,0,  15],
    [9,5,  9,6, 9,7, 0,0,  13],
    [9,8,  9,9, 0,0, 0,0,  17]
]


$ decision variables
find x: matrix indexed by [range, range] of range

such that
  $ forAll i: range .
  $       allDiff([x[i,j] | j: range]) /\
  $       allDiff([x[j,i] | j: range])
  $ ,
  $ this is neater:
  forAll i: range .  allDiff(x[..,i]) /\ allDiff(x[i,..]),
  forAll i,j: int(0..2) .  allDiff([x[r,c] | r: int(i*3+1..i*3+3), c: int(j*3+1..j*3+3)] ),

  $ calculate the hints
  forAll p: int(1..num_p) .
   (sum([x[  P[p, 2*(i-1)+1], P[p,2*(i-1)+2] ] | i: int(1..num_hints), P[p,2*(i-1)+1] > 0]))  = P[p, 2*num_hints+1]