我想在 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-queens 问题
找到 L 的组件和可视化组件。
例如,如果你发现 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).
部分。