Slide 12
Slide 12 text
Example: n queens in SWI-Prolog and Haskell
n_queens(N, Qs) :-
length(Qs, N),
Qs ins 1..N,
safe_queens(Qs).
safe_queens([]).
safe_queens([Q|Qs]) :-
safe_queen(Qs, Q, 1),
safe_queens(Qs).
safe_queen([], _, _).
safe_queen([Q|Qs], Q0, D0) :-
Q0 #\= Q,
abs(Q0 - Q) #\= D0,
D1 #= D0 + 1,
safe_queen(Qs, Q0, D1).
nQueens :: Int -> FD [FDExpr]
nQueens n = do
qs <- news n (1, n)
safeQueens qs
return qs
safeQueens :: [FDExpr] -> FDConstraint
safeQueens [] = return ()
safeQueens (q : qs) = do
safeQueen qs q 1
safeQueens qs
safeQueen :: [FDExpr] -> FDExpr -> FDExpr -> FDConstraint
safeQueen [] _ _ = return ()
safeQueen (q : qs) q0 d0 = do
q0 #\= q
abs (q0 - q) #\= d0
safeQueen qs q0 (d0 + 1)