summaryrefslogtreecommitdiff
path: root/prolog/queens.pl
diff options
context:
space:
mode:
Diffstat (limited to 'prolog/queens.pl')
-rw-r--r--prolog/queens.pl41
1 files changed, 41 insertions, 0 deletions
diff --git a/prolog/queens.pl b/prolog/queens.pl
new file mode 100644
index 0000000..505ad5b
--- /dev/null
+++ b/prolog/queens.pl
@@ -0,0 +1,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).