Шахматная задача на Prolog
Добавлено: 02 июн 2009, 18:34
Добрый день!
Подскажите пожалуйста, как мне переделать алгоритм программы о восьми ферзях...
Передо мной стоит похожая задача про ладей и слонов, по отдельности я научился их решать, а вот склеить никак не получается
Текст задачи:
Получить все расстановки фигур на шахматной доске размером n x n, для n/2 ладей и n/2 слонов.
Код программы, от которой я отталкивался (VisualProlog 5.2):
Буду очень признателен, я не очень соображаю в прологе и крайне редко с ним сталкиваюсь, уже 3 дня ломаю голову, но ничего не получается 
Подскажите пожалуйста, как мне переделать алгоритм программы о восьми ферзях...
Передо мной стоит похожая задача про ладей и слонов, по отдельности я научился их решать, а вот склеить никак не получается

Текст задачи:
Получить все расстановки фигур на шахматной доске размером n x n, для n/2 ладей и n/2 слонов.
Код программы, от которой я отталкивался (VisualProlog 5.2):
Код: Выделить всё
domains
queen = q(integer, integer)
queens = queen*
freelist = integer*
board = board(queens, freelist, freelist, freelist, freelist)
database - counter
single counter(integer)
predicates
nondeterm placeN(integer,board,board)
nondeterm place_a_queen(integer,board,board)
nondeterm nqueens(integer)
nondeterm makelist(integer, freelist)
nondeterm findandremove(integer, freelist, freelist)
nextrow(integer, freelist, freelist)
clauses
nqueens(N):- makelist(N,L),
Diagonal=N*2-1,
makelist(Diagonal,LL),
placeN(N,board([],L,L,LL,LL),Final),Final=board(Queens,_,_,_,_),
write(Queens),nl,counter(I),I1=I+1,assert(counter(I1)),
fail;true.
placeN(_,board(D,[],[],D1,D2),board(D,[],[],D1,D2)):- !.
placeN(N,Board1,Result):- place_a_queen(N,Board1,Board2),
placeN(N,Board2,Result).
place_a_queen(N,board(Queens,Rows,Columns,Diag1,Diag2),
board([q(R,C)|Queens],NewR,NewC,NewD1,NewD2)):-
nextrow(R,Rows,NewR),
findandremove(C,Columns,NewC),D1=N+C-R,
findandremove(D1,Diag1,NewD1),D2=R+C-1,
findandremove(D2,Diag2,NewD2).
findandremove(X,[X|Rest],Rest).
findandremove(X,[Y|Rest],[Y|Tail]):- findandremove(X,Rest,Tail).
makelist(1,[1]).
makelist(N,[N|Rest]):- N>1,N1=N-1, makelist(N1,Rest).
nextrow(Row,[Row|Rest],Rest).
counter(0).
goal
nqueens(8),counter(N).
