A magic square is a 3 × 3 grid containing the digits 1 through 9 exactly once, such that each row, each column and the two diagonals sum to the same number (15). Write a program to find such magic squares. (You may wish to use the “Send More Money” example in section 8.3 as a starting point.)

Bonus points if you can add constraints to break the symmetry, so that only the one unique solution is returned.

Fill the circles in the following diagram with the numbers 1 through 19 such that the numbers in each of the 12 lines of 3 circles (6 around the outside, 6 radiating from the centre) sum to 23.

If the value of the sum is allowed to vary, which values of the sum have solutions, and which do not?

(Adapted from Puzzle 35 in Dudeney’s “The Canterbury Puzzles”.)

Consider the following code:

foo(Xs, Ys) :- ( foreach(X, Xs), foreach(Y, Ys), fromto(1, In, Out, 1) do In #= (X #< Y + Out) ).

Which constraint does this code implement? (Hint: declaratively, it is the same as one of the constraints from ic_global, but is implemented somewhat differently.) How does it work?