/*-------------------------------------------------------------------------*/ /* Benchmark (Boolean) */ /* */ /* Name : bqueens.pl */ /* Title : N-queens problem */ /* Original Source: Daniel Diaz - INRIA France */ /* Adapted by : Daniel Diaz for GNU Prolog */ /* Date : January 1993 */ /* */ /* Put N queens on an NxN chessboard so that there is no couple of queens */ /* threatening each other. */ /* The solution is a list [ [Que11,...,Que1N], ... ,[QueN1,...,QueNN] ] */ /* where Queij is 1 if the the is a queen on the ith line an jth row. */ /* */ /* Solution: */ /* N=4 [[0,0,1,0], [[0,1,0,0], */ /* [1,0,0,0], [0,0,0,1], */ /* [0,0,0,1], and [1,0,0,0], */ /* [0,1,0,0]] [0,0,1,0]] */ /* */ /* N=8 [[0,0,0,0,0,0,0,1], (first solution) */ /* [0,0,0,1,0,0,0,0], */ /* [1,0,0,0,0,0,0,0], */ /* [0,0,1,0,0,0,0,0], */ /* [0,0,0,0,0,1,0,0], */ /* [0,1,0,0,0,0,0,0], */ /* [0,0,0,0,0,0,1,0], */ /* [0,0,0,0,1,0,0,0]] */ /*-------------------------------------------------------------------------*/ go:- statistics(runtime,_), top, statistics(runtime,[_,Y]), write('time : '), write(Y), nl. top:- N=8, (bqueens(N,A), write(A), nl, fail ; write('No more solutions'), nl). bqueens(N,A):- create_array(N,N,A), for_each_line(A,fd_only_one), for_each_column(A,fd_only_one), for_each_diagonal(A,fd_at_most_one), !, array_labeling(A). :-load(array).