以下代码给出了一个致命的本地堆栈溢出错误(找到所有解决方案后,而不是" no"),我不明白为什么。我很确定它与range
谓词有关,因为如果我用列表替换它,我就不会有问题,但我不明白它导致溢出。
nqueens(N,X) :-
pattern(N,X),range(N,Yrange),legal(Yrange,X).
nocheck(_, []).
nocheck(X/Y, [X1/Y1 | Rest]) :-
Y =\= Y1,
abs(Y1-Y) =\= abs(X1-X),
nocheck(X/Y, Rest).
legal(_,[]).
legal(Yrange,[X/Y | Rest]) :-
legal(Yrange,Rest),
member(Y,Yrange),
nocheck(X/Y, Rest).
pattern(1,[1/_]).
pattern(N,[N/_|T]) :- N1 is N-1,pattern(N1,T).
range(1,[1]).
range(N,[N|T]) :- N1 is N-1,range(N1,T).
答案 0 :(得分:0)
当范围/ 2中的N变为1时,以下条款应不留待最终进一步处理(这将在回溯时发生),因为它将变为负数并且递归将不再停止。 您可以在第二个子句中测试积极性
super.performSomeAction()
或者 - 我认为 - 只是在第一个之后削减
Parent parent = new Parent();
Parent child = new Child();
parent.performSomeAction();
child.performSomeAction();
另一种可能性是在调用点使谓词确定性:
range(N,[N|T]) :- N>0,N1 is N-1,range(N1,T).