n-queens Prolog通过特殊字母可视化

时间:2014-06-16 19:04:10

标签: prolog n-queens

我想在Prolog中可视化n-queens问题。

像这样,

1? -queen(1,2,5).
===================
# Q # # #
# # # Q #
Q # # # #
# # Q # #
# # # # Q
===================
===================
# Q # # #
# # # # Q
# # Q # #
Q # # # #
# # # Q #
===================

Total Output is 2
true.

所以,我想在Prolog中使用这个N-queens。

solution(_, []).
solution(N, [X/Y|Others]) :-
    solution(N, Others),
    between(1, N, Y),
    noattack(X/Y, Others).

noattack(_,[]).
noattack(X/Y, [X1/Y1 | Others]) :-
    Y =\= Y1,
    Y1-Y =\= X1-X,
    Y1-Y =\= X-X1,
    noattack( X/Y, Others).

template(N, L) :-
    findall(I/_, between(1,N,I), L).

这就像输出一样。

?- N=6, template(N, L), solution(N, L).
N = 6,
L = [1/5, 2/3, 3/1, 4/6, 5/4, 6/2] ;
N = 6,
L = [1/4, 2/1, 3/5, 4/2, 5/6, 6/3] ;
N = 6,
L = [1/3, 2/6, 3/2, 4/5, 5/1, 6/4] ;
N = 6,
L = [1/2, 2/4, 3/6, 4/1, 5/3, 6/5] ;

女王(X,Y,N)

(X,Y)是女王的位置。

(N)是女王的学位。

我希望通过

可视化这个N皇后问题

找到L&#39的组件和可视化组件。

例如,如果你发现L = [...,3/4,...]

打印出这个#是N-1次,Q是第四次。

这是Prolog中易出错的代码。

queen(X,Y,N):-
    position(X,Y), %consummate this L list and bring to Ls
    print_queen( Ls , N).

我不知道如何代表这个

position(X,Y).    

print_queen(Ls, N).

queen(X,Y,N).    

一部分。

1 个答案:

答案 0 :(得分:0)

我会尝试为您请求的格式化输出提供 SWI-Prolog 解决方案。

要使用“#”和“Q”打印一个大小为N且女王位于Col的行,您可以使用:

Col1 is Col - 1, format('~|~`#t~*+Q~`#t~*|~n',[Col1, N]).

有关format/2的详细信息,请参阅documentation。 E.g:

?- Col = 3, N = 8, Col1 is Col-1, format('~|~`#t~*+Q~`#t~*|~n',[Col1,N]).
##Q#####

现在,假设您的解决方案采用此格式[1/Q1, 2/Q2, 3/Q3, ..., N/QN],您可以使用forall/2来满足每个女王format/2(列表中的元素):

print_queens(Queens, N):-
    forall(member(_/Col, Queens),
           ( Col1 is Col-1, format('~|~`#t~*+Q~`#t~*|~n',[Col1,N]) )
          ).

使用上述谓词:

?- print_queens([1/3,2/1,3/4,4/5,5/3,6/6], 6).
##Q###
Q#####
###Q##
####Q#
##Q###
#####Q
true.

稍后编辑(在评论澄清后): 为了打印N - 皇后的所有解决方案,给出其中一个固定位置:

queen(X, Y, N):-
    template(N, L),    % Build the template of the solution
    member(X/Y, L),    % Unify given value for Y with its corresponding variable in L
    !,                 % Green cut

    % Count solutions while printing them
    findall(s, (solution(N, L), print_queens(L, N)), All),

    % Print total number of solutions
    length(All, Len),
    format('Total Output is ~w.~n', [Len]).