Challenge 1: A 5-Queens Solution, Verified by Hand — Possible Solution ==================================================================== queens_demo.pl: :- use_module(library(clpfd)). queens(N, Queens) :- length(Queens, N), Queens ins 1..N, safe_queens(Queens), label(Queens). safe_queens([]). safe_queens([Q|Qs]) :- safe_queens(Qs, Q, 1), safe_queens(Qs). safe_queens([], _, _). safe_queens([Q|Qs], Q0, D0) :- Q0 #\= Q, abs(Q0 - Q) #\= D0, D1 #= D0 + 1, safe_queens(Qs, Q0, D1). Query: ?- queens(5, Qs), !. Qs = [1, 3, 5, 2, 4]. % one valid solution; exact result depends on the solver's search order Verifying [1, 3, 5, 2, 4] by hand (column, row) pairs: (1,1) (2,3) (3,5) (4,2) (5,4) Rows distinct: 1, 3, 5, 2, 4 -- all five different. OK. Diagonal check (|row difference| must not equal |column difference| for every pair): (1,1)-(2,3): |1-3|=2, cols differ by 1 -- 2 =/= 1, OK. (1,1)-(3,5): |1-5|=4, cols differ by 2 -- 4 =/= 2, OK. (1,1)-(4,2): |1-2|=1, cols differ by 3 -- 1 =/= 3, OK. (1,1)-(5,4): |1-4|=3, cols differ by 4 -- 3 =/= 4, OK. (2,3)-(3,5): |3-5|=2, cols differ by 1 -- 2 =/= 1, OK. (2,3)-(4,2): |3-2|=1, cols differ by 2 -- 1 =/= 2, OK. (2,3)-(5,4): |3-4|=1, cols differ by 3 -- 1 =/= 3, OK. (3,5)-(4,2): |5-2|=3, cols differ by 1 -- 3 =/= 1, OK. (3,5)-(5,4): |5-4|=1, cols differ by 2 -- 1 =/= 2, OK. (4,2)-(5,4): |2-4|=2, cols differ by 1 -- 2 =/= 1, OK. Every pair passes both checks -- no shared row, no shared diagonal, and no shared column by construction (one row value per column index). [1, 3, 5, 2, 4] is a genuinely valid 5-queens placement. WHY THIS WORKS AS AN ANSWER ------------------------------ This runs the chapter's own queens/2 predicate unmodified for N=5, then manually re-verifies every one of the 10 row/diagonal pairs by hand rather than just trusting the solver's output, directly confirming the CLP(FD) constraints actually encode the real N-Queens rules correctly.