n-queens解决方案在Prolog

时间:2017-09-11 08:26:25

标签: prolog clpfd n-queens

我正在尝试运行N-Queens Problem‍​..How far can we go?中的以下代码来查找n-queens problem的解决方案:

generate([],_).
generate([H|T],N) :- H in 1..N , generate(T,N).
lenlist(L,N) :- lenlist(L,0,N).
lenlist([],N,N).
lenlist([_|T],P,N) :- P1 is P+1 , lenlist(T,P1,N).

queens(N,L) :-
        generate(L,N),lenlist(L,N),
        safe(L),!,
        labeling([ffc],L).

notattack(X,Xs) :- notattack(X,Xs,1).
notattack(X,[],N).
notattack(X,[Y|Ys],N) :- X #\= Y,
                         X #\= Y - N,
                         X #\= Y + N,
                         N1 is N + 1,
                         notattack(X,Ys,N1).

safe([]).
safe([F|T]) :- notattack(F,T), safe(T).

我在Debian-9(稳定版)Linux上安装了swi-prolog,我使用命令" swipl -f nqueens.pl"在上面运行。加载时,我收到错误:

Syntax error: operator expected (probably on 2nd code line)

问题出在哪里?如何解决?谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

这个问题实际上提到它正在写入 CLPFD (A C onstraint L ogic P 编程工具 F inite D 域名。您必须导入此库

:- use_module(library(clpfd)).

generate([],_).
generate([H|T],N) :- H in 1..N , generate(T,N).
lenlist(L,N) :- lenlist(L,0,N).
lenlist([],N,N).
lenlist([_|T],P,N) :- P1 is P+1 , lenlist(T,P1,N).

queens(N,L) :-
        generate(L,N),lenlist(L,N),
        safe(L),!,
        labeling([ffc],L).

notattack(X,Xs) :- notattack(X,Xs,1).
notattack(X,[],N).
notattack(X,[Y|Ys],N) :- X #\= Y,
                         X #\= Y - N,
                         X #\= Y + N,
                         N1 is N + 1,
                         notattack(X,Ys,N1).

safe([]).
safe([F|T]) :- notattack(F,T), safe(T).

然后它起作用,并产生例如:

?- queens(5,L).
L = [1, 3, 5, 2, 4] ;
L = [1, 4, 2, 5, 3] ;
L = [2, 4, 1, 3, 5] ;
L = [2, 5, 3, 1, 4] ;
L = [3, 1, 4, 2, 5] ;
L = [3, 5, 2, 4, 1] ;
L = [4, 1, 3, 5, 2] ;
L = [4, 2, 5, 3, 1] ;
L = [5, 2, 4, 1, 3] ;
L = [5, 3, 1, 4, 2].

答案 1 :(得分:0)

当我查看第2行时,正如错误消息所示,最可能的原因是H in 1..N。我会把它写成between(1, H, N)。不过,我最近没有在Prolog做过任何事情。

Prolog有几种不同的实现方式,它们在这些细节上有所不同。尝试搜索编写便携式Prolog代码的指南。