:-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). |
|