Solving PuzzlOR "Coins" puzzle with constraint logic programming

PuzzlOR's problem for February 2015–April 2015 was "Coins": http://puzzlor.com/2015-02_Coins.html

The puzzle asks to find an arrangement of 9 coins (3 of each type – 1, 5, and 10 cents) in the 3 × 3 grid in which sums for each row and column correspond to the numbers given in the picture.

The answer submission deadline has passed, and I want to share my solution to the puzzle, for which I used Prolog-based constraint logic programming system ECLiPSe.

Here is my complete program to solve the puzzle (https://github.com/kit1980/sdymchenko-com/blob/master/coins-eclipse/coins.ecl):

:- lib ( ic ). :- lib ( ic_global ). main :- dim ( Coins , [3, 3]), Coins :: [1, 5, 10], occurrences(1, Coins , 3), occurrences(5, Coins , 3), occurrences(10, Coins , 3), sum ( Coins [1, 1..3]) #= 11, sum ( Coins [2, 1..3]) #= 12, sum ( Coins [3, 1..3]) #= 25, sum ( Coins [1..3, 1]) #= 21, sum ( Coins [1..3, 2]) #= 16, sum ( Coins [1..3, 3]) #= 11, labeling( Coins ), ( foreacharg ( Row , Coins ) do array_list( Row , List ), join_string ( List , "\t" , Line ), writeln ( Line ) ).

First two lines import 2 constraint programming libraries: ic for arithmetic constraints and ic_global for occurrences . Then 3 by 3 Coins array is declared; the array can only have 1, 5, or 10 as its elements, and each of the numbers must occur 3 times. After that sums of the rows and columns are constrained according to the problem specification, and labeling finds concrete values for Coins array that satisfy all constraints. In the end, foreacharg loop is used to output the answer:

1 5 5 10 1 1 10 10 5

This puzzle is much easier than the previous PuzzlOR's problem, Electrifying, for which I also have a solution in ECLiPSe. For "Coins", any bruteforce solution should work, because there are only about 9! / (3 * 3!) = 1680 variants to check. Still, ECLiPSe allows to formulate the problem declaratively and compactly.

To learn more about ECLiPSe see the official site, Hakan Kjellerstrand's ECLiPSe page, and eclipse-clp tag on this blog.