【问题标题】:Out of local stack in PrologProlog中的本地堆栈外
【发布时间】:2014-03-09 04:48:07
【问题描述】:

我现在有以下谓词不断给我: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.

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

做错了什么?

一个例子是:

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

【问题讨论】:

  • 它只是输出一个列表。它工作正常。
  • 了解mash/5 的作用对于理解该谓词的行为至关重要。
  • @mbratch Mash 创建一个列表,例如 [1,1]。然后 equal 应该比较它们的输出。
  • 但是细节(源代码)对于理解问题很重要。 equality/4equal/2 不是递归谓词。他们不会占用你的堆栈空间。那么,我怀疑mash/5 正在这样做。我知道您说mash/5 有效,但在这种情况下可能存在问题。如果您显示您的mash/5 代码,并显示您输入的导致堆栈溢出的查询,则可以弄清楚。

标签: prolog stack


【解决方案1】:

顺便说一句,如果你这样做:

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

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

关于重点:

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

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

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

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

【讨论】:

  • 我刚刚运行它,它似乎永远在进行。我希望它只运行一次并检查两者是否相同。那么也许你提出的第一点是正确的?
  • 所以尝试'trace.',然后是你的主要谓词,然后逐行查看它在幕后所做的事情。更好的是(至少在 swi prolog 中),尝试 trace(mash/5, fail) 以查看 mash 是否在任何时候都失败。
  • 似乎 Range 被无限次递减直到溢出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多