Research Article

Top- Based Adaptive Enumeration in Constraint Programming

Algorithm 4

:-lib(ic).
magic(N):-
NN is N*N,
Sum is N*(NN+1)//2,
dim(Square, N,N),
Square:: 1..NN,
alldifferent(Square),
(for(I,1,N),
  foreach(U,UpDiag),
  foreach(D,DownDiag),
  param(N,Square,Sum)
do
  Sum #= sum(SquareI,1..N),
  Sum #= sum(Square1..N,I),
  U is SquareI,I,
  D is SquareI,N+1-I
),
Sum #= sum(UpDiag),
Sum #= sum(DownDiag),
Square1,1  #< Square1,N,
Square1,1  #< SquareN,N,
Square1,1  #< SquareN,1,
Square1,N  #< SquareN,1,
% call to search predicate
write(Square).