/* Boolean N-Queens problem in Picat. Inspired by the B-Prolog model examples/clpb/bqueens.pl. This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ % Licenced under CC-BY-4.0 : http://creativecommons.org/licenses/by/4.0/ import util. import cp. main => go. go => bool_queens(16), nl. go2 => _ = findall(_, bool_queens(8)), nl. go3 => bool_queens(100), nl. bool_queens(N) => Qs = new_array(N,N), Qs :: 0..1, foreach(I in 1..N) sum([$Qs[I,J] : J in 1..N]) #= 1 end, foreach(J in 1..N) sum([$Qs[I,J] : I in 1..N]) #= 1 end, foreach(K in 1-N..N-1) sum([$Qs[I,J] : I in 1..N, J in 1..N, I-J=K]) #=< 1 end, foreach(K in 2..2*N) sum([$Qs[I,J] : I in 1..N, J in 1..N, I+J=K]) #=< 1 end, solve([inout],Qs), foreach(I in 1..N) println([Qs[I,J].to_string() : J in 1..N].join('')) end, println(queens=[J : I in 1..N, J in 1..N, Qs[I,J] = 1 ]), nl.