%%%%%%%%%%%%%%%%
%              %
% N Queens CSP %
%              %
%%%%%%%%%%%%%%%%

:- set_prolog_flag(toplevel_print_options,
                   [quoted(true), portray(true), max_depth(0)]).

:- use_module(constraints).


generateConstraints(N) :-
    retractall(vars(_)),
    enum(1, N, Ls),
    generateVars(Ls, 1, N, V),
    asserta(vars(V)).

enum(N, N, [N]) :- !.
enum(K, N, [K|L]) :-
    K1 is K+1,
    enum(K1, N, L).

generateVars(Ls, N, N, [x(N):Ls]) :- !.
generateVars(Ls, I, N, [x(I):Ls | Vars]) :-
    I1 is I + 1,
    generateVars(Ls, I1, N, Vars).


consistent((x(I),VI), (x(J),VJ)) :-
    VI =\= VJ,
    I+VI =\= J+VJ,
    I-VI =\= J-VJ.



queens(N, Sol) :-
    generateConstraints(N),
    solve(Sol).

solve(Sol) :-
    nodeConsistFF(Sol).

