/*
  N-Queen
  Programed by M.Tanaka
  Date-Written 1989.4.23

  input:  generate(N).
  output: main :- queen(1,Board),...,write(Board).
          queen(Q,[x,Q,x,x,
                   x,x,x,_,
                   _,x,_,x,
                   _,x,_,_]).
          queen(...).
          ...
*/

generate(N) :-
        gen_main(N),
        gen_queen(N).

gen_main(N) :-
        write('main :- '),
        nl,
        for(1,N,X),
                write('    queen('),
                write(X),
                write(',Board),'),
                nl,
        fail.
gen_main(_) :-
        write('    write(Board).'),
        nl.

gen_queen(N) :-
        for(1,N,X),
            for(1,N,Y),
                gen_list(X,Y,N,1,1,List),
                write('queen(Q,'),
                write(List),
                write(').'),
                nl,
        fail.
gen_queen(_).

gen_list(_,_,N,N1,1,[]) :- N1 is N+1, !.
gen_list(X,Y,N,I,N1,List) :- N1 is N+1, !,
        I1 is I+1,
        gen_list(X,Y,N,I1,1,List).
gen_list(X,Y,N,X,Y,['Q'|List]) :- !,
        Y1 is Y+1,
        gen_list(X,Y,N,X,Y1,List).
gen_list(X,Y,N,X,J,['x'|List]) :- !,
        J1 is J+1,
        gen_list(X,Y,N,X,J1,List).
gen_list(X,Y,N,I,Y,['x'|List]) :- !,
        Y1 is Y+1,
        gen_list(X,Y,N,I,Y1,List).
gen_list(X,Y,N,I,J,['x'|List]) :- X is I+J-Y, !,
        J1 is J+1,
        gen_list(X,Y,N,I,J1,List).
gen_list(X,Y,N,I,J,['x'|List]) :- X is I-J+Y, !,
        J1 is J+1,
        gen_list(X,Y,N,I,J1,List).
gen_list(X,Y,N,I,J,['_'|List]) :- !,
        J1 is J+1,
        gen_list(X,Y,N,I,J1,List).

for(I,I,I) :- !.
for(I,J,I).
for(I,J,K) :- I1 is I+1, for(I1,J,K).
