我现在有以下谓词继续给我: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)
答案 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。如果你想避免重新进入,你将不得不使用剪切'!'操作员以防止这种情况。