我正在尝试运行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)
问题出在哪里?如何解决?谢谢你的帮助。
答案 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代码的指南。