1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
valid_queen((Row,Col)) :-
Range = [1,2,3,4,5,6,7,8],
member(Row, Range),
member(Col, Range).
valid_board([]).
valid_board([H|T]) :-
valid_queen(Head).
valid_board(T).
rows([],[]).
rows([(Row,_)|QueensTail, [Row|RowsTail]) :-
rows(QueensTail, RowsTail).
cols([],[]).
cols([(_,Col)|QueensTail, [Col|ColsTail]) :-
rows(QueensTail, ColsTail).
diags1([],[]).
diags1([(Row,Col)|QueensTail], [Diagonal|DiagonalsTail]) :-
Diagonal is Col - Row,
diags1(QueensTail, DiagonalsTail).
diags2([],[]).
diags2([(Row,Col)|QueensTail], [Diagonal|DiagonalsTail]) :-
Diagonal is Col + Row,
diags2(QueensTail, DiagonalsTail).
eight_queens(Board) :-
length(Board, 8),
valid_board(Board),
rows(Board, Rows),
cols(Board, Cols),
diags1(Board, Diags1),
diags2(Board, Diags2),
fd_all_different(Rows),
fd_all_different(Cols),
fd_all_different(Diags1),
fd_all_different(Diags2).
|