Download
$ 
$ Set partition problem in Essence'
$
$
$ Problem formulation from
$   http://www.koalog.com/resources/samples/PartitionProblem.java.html
$ """
$  This is a partition problem.
$  Given the set S = {1, 2, ..., n}, 
$  it consists in finding two sets A and B such that:
$  <ul>
$  <li>A U B = S,</li>
$  <li>|A| = |B|,</li>
$  <li>sum(A) = sum(B),</li>
$  <li>sum_squares(A) = sum_squares(B).</li>
$  </ul>
$"""
$
$ This Essence' model was created by Hakan Kjellerstrand, hakank@gmail.com .
$ See also my Tailor/Essence' page: http://www.hakank.org/savile_row/ .
$

$ Licenced under CC-BY-4.0 : http://creativecommons.org/licenses/by/4.0/

language ESSENCE' 1.0

$ For num_sets n must be a multiple of 4 for this to work.
$ And - of course - num_sets must be a multiple of n.

letting n be 16
letting num_sets be 2

$ one solution
$ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16
$ 1, 1, 2, 2, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2;
$ ->
$ 1: {1,2,7,8,11,12,13,14},
$ 2: {3,4,5,9,10,15,16}


$ Essence' don't support sets so we represent the sets 
$ simply as a value in the a array.
find a: matrix indexed by [int(1..n)] of int(1..num_sets)

find sums: matrix indexed by [int(1..num_sets)] of int(0..n*n)
find sums_squared: matrix indexed by [int(1..num_sets)] of int(0..n*n*n*n)

such that
   forall i: int(1..num_sets) .
       sums[i] = (sum j: int(1..n) . j*(a[j]=i)) /\
       sums_squared[i] = sum j: int(1..n) . j**2*(a[j]=i)
   ,
   $ same cardinality and sums
   forall i: int(2..num_sets) .
      (sum j: int(1..n) . a[j]=i-1) = (sum j: int(1..n) . a[j]=i) /\
      sums[i-1] = sums[i] /\
      sums_squared[i-1] = sums_squared[i]
   ,
   $ summetry breaking
   a[1] = 1