%% bq.pl (SWI-Prolog) % swipl -g "main,halt" bq.pl ins.pl :- use_module(library(clpfd)). :- use_module(library(lists)). main :- board(N), length(List,N), List ins 1..N, findall(block(R,C),block(R,C),BlockedCells), constraint_blocked(BlockedCells,List), gen_lists(List,1,N,List2,List3), all_distinct(List), all_distinct(List2), all_distinct(List3), label(List), output(List,1). constraint_blocked([],_List). constraint_blocked([block(R,C)|BCells],List) :- nth1(R,List,V), V #\= C, constraint_blocked(BCells,List). gen_lists(_List,I,N,List2,List3) :- I>N,!, List2=[], List3=[]. gen_lists(List,I,N,List2,List3) :- nth1(I,List,V), V1 #= V+I, V2 #= V-I, List2 = [V1|List2R], List3 = [V2|List3R], I1 is I+1, gen_lists(List,I1,N,List2R,List3R). output([],_). output([Q|L],I) :- write(queen(I,Q)), writeln('.'), I1 is I+1, output(L,I1).