diff options
Diffstat (limited to 'prolog/queens.pl')
-rw-r--r-- | prolog/queens.pl | 41 |
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). |