【发布时间】:2011-12-27 20:40:31
【问题描述】:
我编写了这个简单的 Prolog 程序。
man(socrates).
mortal(X) :- man(X).
immortal(X) :- immortal(X).
我问了一些常见的问题,比如苏格拉底是人还是苏格拉底是凡人。
?- man(socrates).
true. //we know for a fact that Socrates is a man
?- mortal(socrates).
true. //and it can logically be inferred that Socrates is mortal
?- immortal(socrates).
//but we can't seem to figure out if he's immortal
由于immortal 的递归定义,它崩溃了。循环引用也会使其崩溃或出现 Out of stack space. 错误
在我看来,至少在这种情况下,Prolog 先生从程序中的规则得出结论,不能推断苏格拉底是不朽的,这将是相当微不足道的。如何?我想它可以检查堆栈,看看它是否正在遍历一个已经被遍历过的规则。
这是否尚未实施的原因?这样做会不会有一些我忽略的问题,或者是否存在已经执行此类分析的 Prolog 实现?
【问题讨论】:
-
你是说神仙的定义就是神仙?
-
您正在寻找“表格”,尽管只有少数 prolog 实现支持它(例如 XSB 或 YAP)。
标签: recursion prolog infinite-loop circular-reference