Friday, July 6, 2007

n-queen Problem

domains
queen = q(integer,integer)
queens = queen*
freelist = integer*
board = board(queens,freelist,freelist,freelist,freelist)
predicates
placeN(integer,board,board)
place_a_queen(integer,board,board)
nqueens(integer)
makelist(integer,freelist)
del(integer,freelist,freelist)
clauses
nqueens(N):-
makelist(N,L),
Diagonal=N*2-1,
makelist(Diagonal,LL),
placeN(N,board([],L,L,LL,LL),Final),
write(Final).
placeN(_,board(D,[],[],D1,D2),board(D,[],[],D1,D2)):-!.
placeN(N,B1,R):-
place_a_queen(N,B1,B2),
placeN(N,B2,R).
place_a_queen(N,board(Queens,Rows,Cols,Diag1,Diag2),
board([q(Row,Col)Queens],NewR,NewC,ND1,ND2)):-
del(Row,Rows,NewR),
del(Col,Cols,NewC),
D1 = N+Col-Row,
del(D1,Diag1,ND1),
D2 = Row+Col-1,
del(D2,Diag2,ND2).
del(X,[XRest],Rest).
del(X,[YRest],[YTail]):-
del(X,Rest,Tail),X<>Y.
makelist(1,[1]).
makelist(N,[NRest]):-
N>0,
N1=N-1,
makelist(N1,Rest).

No comments: