2016-04-11 33 views
1

加载使用SWI-Prolog的下面的程序和进入这类查询作为如何避免查找多个答案时出现全局堆栈错误?

cells([o,x,o,x,o], A). 

cells(A, [o,x,o,x,o]). 

的第一个结果似乎永远是正确的,而后提交分号后,寻找更多的结果(并且我不知道在这两种情况下是否应该有额外的结果),我得到了PROLOG SYSTEM ERROR分别提到了垃圾收集和全局堆栈错误。

regla(o,o,o,o). 
regla(x,o,o,x). 
regla(o,x,o,o). 
regla(o,o,x,x). 
regla(x,o,x,x). 
regla(x,x,o,x). 
regla(o,x,x,x). 
regla(x,x,x,o). 

cells([X | XS], [Y | YS]) :- 
    X = o, 
    Y = o, 
    length([X | XS], LX), 
    LX >= 3, 
    length([Y | YS], LY), 
    LY is LX + 2, 
    append([o, o], [X | XS], W), 
    append(W, [o, o], Z), 
    cellsR(Z, [Y | YS]). 

cellsR(_, []). 
cellsR([A, B, C | R], [H | T]) :- 
    regla(A, B, C, H), 
    cellsR([B, C | R], T). 

我假设的错误与我处理递归的方式做的,所以也许有人可以看看代码,并告诉我,我要去哪里错了。

+0

你应该做一个“跟踪”,你会看到发生了什么。 – lurker

回答

3

我的第一个建议:不要使用示踪剂。它不会帮你很多。终止比一步一步的追踪者可以显示的要复杂得多。让我给你的原因,你的程序不会终止,第一:

 
cells([X | XS], [Y | YS]) :- 
    X = o, 
    Y = o, 
    length([X | XS], LX), 
    LX >= 3, 
    length([Y | YS], LY), false, 
    LY is LX + 2, 
    append([o, o], [X | XS], W), 
    append(W, [o, o], Z), 
    cellsR(Z, [Y | YS]). 

这凸显了你的程序的一部分,你将修改删除你的问题。换句话说,只要你保持这个部分不变,你的问题就不会消失。

的最小变化是添加第一建立这两个列表的长度之间的关系的进一步的目标,则使用length/2之前:

cells([X | XS], [Y | YS]) :- 
    X = o, 
    Y = o, 
    list_samelength([_,_|XS], YS), 
    length([X | XS], LX), 
    LX >= 3, 
    length([Y | YS], LY), 
    LY is LX + 2, 
    append([o, o], [X | XS], W), 
    append(W, [o, o], Z), 
    cellsR(Z, [Y | YS]). 

list_samelength([], []). 
list_samelength([_|Xs], [_|Ys]) :- 
    list_samelength(Xs, Ys). 

以获得更多关于该技术见

+0

谢谢你的回复!你建议的解决方案似乎可以解决这个问题,我想这意味着这部分代码现在不需要了'([Y | YS],LY),LY是LX + 2,因为list_samelength已经检查过了。我不明白的是为什么会发生。 – luckysori

+0

@luckysori:为什么**会发生什么? – false

+0

在我原来的程序中没有终止。我可以看到我出错的地方,但不是为什么。 – luckysori