PROLOG本地堆栈溢出

时间:2018-03-15 04:36:31

标签: prolog

以下代码给出了一个致命的本地堆栈溢出错误(找到所有解决方案后,而不是" 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).

1 个答案:

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