/* Magic square primes in Picat. Magic square with only prime numbers, with the additional objective of minimizing total (or minimizing the largest used value). This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import sat. main => go. go ?=> N = 4, magic_square_primes(N,X), print_square(X), nl. go => true. print_square(X) => N = X.len, foreach(I in 1..N) foreach(J in 1..N) printf("% 5d ", X[I,J]) end, nl end, nl. magic_square_primes(N, X) => Primes = primes(1000), Total :: 2..max(Primes)*N*N, X = new_array(N,N), X :: Primes, all_different(X.vars), foreach(K in 1..N) sum([X[K,I] : I in 1..N]) #= Total, sum([X[I,K] : I in 1..N]) #= Total end, % diagonal1 sum([X[I,I] : I in 1..N]) #= Total, % diagonal2 sum([X[I,N-I+1] : I in 1..N]) #= Total, % MaxX #= max(X.vars), % Symmetry breaking: Frénicle standard form % For n=4 this yields the 48 squares that's shown at % http://en.wikipedia.org/wiki/Associative_magic_square#4_x_4_associative_magic_square_-_complete_listing X[1,1] #= min([X[1,1], X[1,N], X[N,1], X[N,N]]), X[1,2] #< X[2,1], % solve([ff,split],X.vars). solve($[constr,rand_val],X.vars).