03.06.2013 Views

Turbo Prolog

Turbo Prolog

Turbo Prolog

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!