Turbo Prolog
Turbo Prolog
Turbo Prolog
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Correspondingly, we must find and remove a vacant column C. From Rand C, the<br />
numbers of the diagonals can be calculated on which a queen in row R and column C is<br />
placed. Then we can determine if D I and 02 are among the vacant diagonals.<br />
The clause is shown below:<br />
place_a_queen(N,board(Queens,Rows,Columns,Diag1,Diag2),<br />
board([q(R,C)IQueens],NewR,NewS,NewD1,NewD2)):-<br />
findandremove(R,Rows,NewR),<br />
findandrernove(C,Colurnns,NewC),<br />
D1=N+S-R,findandremove(D1,Diag1,NewD1),<br />
D2=R+S-1,findandremove(D2,Diag2,NewD2).<br />
Program 57 is the complete program. It contains a number of smaller additions to<br />
define nqueens, so we need only give a goal like<br />
nqueens(5)<br />
to obtain a possible solution (in this case, for placing five queens on a 5*5 board).<br />
1* Program 57 *1<br />
domains<br />
queen=q(integer,integer)<br />
queens=queen*<br />
freelist = integer*<br />
board=board(queens,freelist,freelist,freelist,freelist)<br />
predicates<br />
placeN(integer,board,board)<br />
place_a_queen(integer,board,board)<br />
nqueens(integer)<br />
rnakelist(integer,freelist)<br />
findandremove(integer,freelist,freelist)<br />
clauses<br />
nqueens(N):rnakelist(N,L),Diagonal=N*2-1,makelist(Diagonal,LL),<br />
placeN(N,board([],L,L,LL,LL),Final),write(Final).<br />
placeN(_,board(D,[],[],D1,D2),board(D,[],[],D1,D2)):-! .<br />
placeN(N,Board1,Result):place_a_queen(N,Board1,Board2),<br />
placeN(N,Board2,Result).<br />
place_a_queen(N,board(Queens,Rows,Columns,Diag1,Diag2),<br />
board([q(R,C)IQueens],NewR,NewC,NewD1,NewD2)):findandremove(R,Rows,NewR),<br />
findandrernove(C,Colurnns,NewC),<br />
D1=N+C-R,findandrernove(D1,Diag1,NewD1),<br />
D2=R+C-1,findandrernove(D2,Diag2,NewD2).<br />
findandremove(X,[XIRest],Rest).<br />
findandrernove(X,[YIRest],[YITail]):findandrernove(X,Rest,Tail).<br />
rnakelist(1,[1]).<br />
rnakelist(N,[N:Rest]):<br />
N>O,N1=N-1,rnakelist(N1,Rest).<br />
Tutorial VIII: Spreading Your Wings 123