% http://www.cs.kuleuven.be/~dtai/events/ASP-competition/Benchmarks/BlockedQueens.shtml % from B-Prolog's example suite :-include(base). solve(As) :- get_largest_atom(As,num(N)), length(List, N), List :: 1..N, Vector=..[v|List], constrain_blocks(As, Vector), make_list12(List,0,List1,List2), all_distinct(List), all_distinct(List1), all_distinct(List2), labeling([ff_inout],List),!, output(1,List). solve(_):- format("UNSATISFIABLE~n"). constrain_blocks([], _). constrain_blocks([block(Row, Col)|Blocks], Vect):-!, arg(Row,Vect,Var), Var #\= Col, constrain_blocks(Blocks, Vect). constrain_blocks([_|Blocks], Vect):-constrain_blocks(Blocks, Vect). make_list12([],_,List1,List2):-List1=[],List2=[]. make_list12([Q|Qs],I,List1,List2):- List1=[Q1|Rest1], List2=[Q2|Rest2], Q1 #= Q+I, Q2 #= Q-I, I1 is I+1, make_list12(Qs,I1,Rest1,Rest2). output(_,[]):-nl. output(Row,[Col|Cols]):- format("queen(~w,~w). ",[Row,Col]), Row1 is Row+1, output(Row1,Cols). test :- solve([num(1), num(2), num(3), num(4), block(1, 1), block(2, 2), block(4, 3)]).