在Prolog的本地堆栈中

时间:2014-03-09 04:48:07

标签: prolog stack

我现在有以下谓词继续给我:ERROR: Out of local stack

equality(First,Second,Third,Range):-
    mash(First,Second,Third,Range,X),
    mash(First,Second,Third,4,Y),
    equal(X,Y).

equal(X,Y) :- X == Y.

我知道所有功能都能正常工作。它应该输出true或false,这对我来说是相同的。当我这样做虽然我得到一个本地堆栈错误。

出了什么问题?

一个例子是:

equality([-1.0,-1.0],[[0,-1],[-1,0]],0,5)

1 个答案:

答案 0 :(得分:0)

顺便说一句,如果你改为:

equality(First,Second,Third,Range):-
mash(First,Second,Third,Range,X),
mash(First,Second,Third,4,X).

谓词只有在prolog可以统一第4个参数以具有相同值时才会成功..输出参数,这意味着您不需要调用等于/。

关于要点:

如果您对mash的第二次调用因任何原因而失败,那么第一次使用mash的调用将从回溯中重新进入,而prolog可能会在mash / 5中尝试各种组合时丢失,你还没有提供。

您还没有提供调用equality / 4的代码,因为除非您正确处理错误结果,否则可能会在第一次失败后重新输入equality / 4(来自回溯),然后prolog在如上所述的一个mash调用中迷失。

您可以在调用相等之前通过调用 trace 谓词来检查这一点,以逐步执行代码并查看其失败的位置。

编辑:它可能不仅仅是你从等于/ 4处交错。如果任何谓词在调用equality / 4的下游失败,那么将从回溯中重新进入等/ 4。如果你想避免重新进入,你将不得不使用剪切'!'操作员以防止这种情况。