home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l217 / 2.ddi / EXAMPLES / CH20EX07.PRO < prev    next >
Encoding:
Prolog Source  |  1990-03-26  |  1.3 KB  |  43 lines

  1. /*
  2.    Copyright (c) 1986, 90 by Prolog Development Center
  3. */
  4.    
  5. domains
  6.    queen    = q(integer, integer)
  7.    queens   = queen*
  8.    freelist = integer*
  9.    board    = board(queens, freelist, freelist, freelist,
  10.             freelist)
  11.  
  12. predicates
  13.    placeN(integer, board, board)
  14.    place_a_queen(integer, board, board)
  15.    nqueens(integer)
  16.    makelist(integer, freelist)
  17.    findandremove(integer, freelist, freelist)
  18.    nextrow(integer, freelist, freelist)
  19.  
  20. clauses
  21.    nqueens(N) :-
  22.       makelist(N, L), Diagonal=N*2-1, makelist(Diagonal, LL),
  23.       placeN(N, board([], L, L, LL, LL), Final), write(Final).
  24.  
  25.    placeN(_, board(D, [], [], D1, D2), board(D, [], [], D1, D2)):- !.
  26.    placeN(N, Board1, Result) :-
  27.       place_a_queen(N, Board1, Board2),
  28.       placeN(N, Board2, Result).
  29.  
  30.    place_a_queen(N, board(Queens, Rows, Columns, Diag1, Diag2),
  31.       board([q(R, C)|Queens], NewR, NewC, NewD1, NewD2)) :-
  32.       nextrow(R, Rows, NewR),
  33.       findandremove(C, Columns, NewC),
  34.       D1 = N+C-R, findandremove(D1, Diag1, NewD1),
  35.       D2 = R+C-1, findandremove(D2, Diag2, NewD2).
  36.  
  37.    findandremove(X, [X|Rest], Rest).
  38.    findandremove(X, [Y|Rest], [Y|Tail]) :- findandremove(X, Rest,Tail).
  39.  
  40.    makelist(1, [1]).
  41.    makelist(N, [N|Rest]) :- N1 = N-1, makelist(N1, Rest).
  42.    nextrow(Row, [Row|Rest], Rest).
  43.