summaryrefslogtreecommitdiff
path: root/prolog/queens.pl
blob: 505ad5b71a9c3e7e684179b5a7dd251749acafe7 (plain) (blame)
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).