【问题标题】:Prolog: Out of local stack errorProlog:超出本地堆栈错误
【发布时间】:2016-11-19 15:52:18
【问题描述】:

考虑以下代码(取自 RP Suri 的 Prolog 简介):

/* A set of father-child pairs declared */
father("Motilal", "Jawaharlal").
father("Motilal", "Vijayalakshmi").
father("Motilal", "Krishna").
father("Jawaharlal", "Indira").
father("Ranjit", "Tara").
father("Ranjit", "Lekha").
father("Ranjit", "Rita").
father("Feroz", "Sanjay").
father("Feroz", "Rajiv").
father("Sanjay", "Varun").
father("Rajiv", "Rahul").
father("Rajiv", "Priyanka").

/* Mothers declared */
wife_of("Swaruprani", "Motilal").
wife_of("Kamla", "Jawaharlal").
wife_of("Vijayalakshmi", "Ranjit").
wife_of("Indira", "Feroz").
wife_of("Maneka", "Sanjay").
wife_of("Sonia", "Rajiv").
wife_of("Priyanka", "Robert").

/* Predicates declared */
mother(M, C) :- wife_of(M, Hus) , father(Hus, C).

parent(P, C) :- mother(P, C) ; father(P, C).

ancestor(X, Y) :- parent(X, Y).
ancestor(X, Y) :- ancestor(X, Z) , parent(Z, Y).

现在如果我查询

ancestor("Motilal", X)

我得到的输出为:

?- ancestor("Motilal", X).
X = "Jawaharlal" ;
X = "Vijayalakshmi" ;
.
.
.
X = "Priyanka" ;

(这是正确的输出),之后程序停止,几秒钟后我收到消息:

ERROR: Out of local stack

当我查询时会发生类似的事情

ancestor(X, "Motilal").

这应该不会返回任何内容,但提示会再次消失几秒钟,然后出现相同的错误消息。代码有什么问题?

【问题讨论】:

  • 最好使用' 代替"

标签: prolog failure-slice


【解决方案1】:

要了解代码中的问题,无需查看整个程序。相反,只需查看一小部分导致不终止的部分就足够了:

?- 祖先(X,'Motilal'),false祖先(X,Y):- false,父(X,Y)。 祖先(X,Y):- 祖先(X,Z),falseparent(Z,Y)

这个片段已经没有终止,因此整个程序也没有终止。不管你在其他部分写了什么!所以你需要在剩下的部分改变一些东西。否则,错误将持续存在。

更多信息请见

你知道你需要改变什么吗?

把目标parent(Z, Y)放在前面!

顺便说一句,在 Prolog 中在这种情况下使用单引号原子是很常见的,因为这样效率更高!

【讨论】:

  • 我学到了很多东西,谢谢!另外,如果我是对的,单引号和双引号的区别在于单引号被视为原子,而双引号被视为字符串?
  • 单引号总是原子。双引号的含义来自 Prolog 标志 double_quotes。它们可能是字符列表、字符代码和原子列表。 SWI 默认具有“字符串”——但这仅适用于 SWI。 SWI 处理它们的效率远低于原子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多