Prolog 用特殊字母形象化n皇后序言

Prolog 用特殊字母形象化n皇后序言,prolog,n-queens,Prolog,N Queens,我想在Prolog中可视化n皇后问题 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, noa

我想在Prolog中可视化n皇后问题

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).
queen(X,Y,N):-
    position(X,Y), %consummate this L list and bring to Ls
    print_queen( Ls , N).
像这样,

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

Total Output is 2
true.
所以,我想在Prolog中使用这个N皇后

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).
queen(X,Y,N):-
    position(X,Y), %consummate this L list and bring to Ls
    print_queen( Ls , N).
这使得像这样的输出

?- 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的组件和可视化组件

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

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

下面是Prolog中容易出错的代码

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).
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).    

部分。

我将尝试为您请求的格式化输出提供一个SWI Prolog解决方案

要使用“#”和“Q”打印一行大小为
N
且皇后位于
Col
位置,您可以使用:

Col1 is Col - 1, format('~|~`#t~*+Q~`#t~*|~n',[Col1, N]).
有关
格式/2
的详细信息,请参阅。例如:

?- Col = 3, N = 8, Col1 is Col-1, format('~|~`#t~*+Q~`#t~*|~n',[Col1,N]).
##Q#####
现在,假设您的解决方案是这种形式的
[1/Q1,2/Q2,3/Q3,…,N/QN]
,您可以使用
for all/2
来满足每个皇后(列表中的元素)的
格式/2

使用上述谓词:

?- 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]).

非常感谢你。所以,我想通过位置(X,Y)来定位这个女王。并读取此位置和输入以打印_queen()。我对这种粗鲁的态度感到抱歉。:(这就是你想要的:用固定皇后解决
N
-皇后问题吗?
queen(X,Y,N):-template(N,L),member(X/Y,L),solution(N,L),print_queens(L,N)。
你问题中的这部分根本不清楚:
位置(X,Y),%完善这个L列表并带到Ls
”。如果
Ls
不在其参数中,则
position/2
的目的是什么?如果
print_queen(Ls,N)
应打印列表
Ls
中的
N
第个queen,您希望它如何影响
Ls
print_queen(Ls,N):-nth1(N,Ls,Row/Col),格式(…)
我想得到这个输出。我的输入只是
女王(1、2、5)的1、2、5。
我的代码>以及我的输出只是
///代码>我的代码>我想得到我想得到这个输出。我想得到这个输出。我的输入是我想得到这个输出。我的输入是我的输入是我的输入是
//代码>我的代码>以及我的我的输出是我的输出是我的我的输出是我的输出是我的只是<代码>代码>我的<<<代码>>///////\35现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场,35\\\35周五周五周五周五周五周五周五周五周五周五周五周五周五周五\\\\35周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五周五##Q######################Q#//总输出为2真。