Pet*_*son 3 recursion prolog infinite-loop circular-reference
我写了这个简单的Prolog程序.
man(socrates).
mortal(X) :- man(X).
immortal(X) :- immortal(X).
Run Code Online (Sandbox Code Playgroud)
我问过常见的问题,比如苏格拉底是男人还是苏格拉底是凡人.
?- 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
Run Code Online (Sandbox Code Playgroud)
由于递归定义,它崩溃了immortal.循环引用也会使其崩溃或出错Out of stack space.
在我看来,至少在这种情况下,Prolog先生得出的结论是,根据该计划的规则,不能推断苏格拉底是不朽的,这是相当微不足道的.怎么样?我想它可以检查堆栈并查看它是否遍历已经遍历的规则.
有没有原因尚未实施?这样做是否有问题我可以忽略,或者是否已经执行此类分析的Prolog实现?
在我看来,至少在这种情况下,Prolog先生得出的结论是,根据该计划的规则,不能推断苏格拉底是不朽的,这是相当微不足道的.
Prolog使用不完整的推理算法来提高效率.它本来是一种编程语言,除了程序性的程序之外,程序还具有逻辑意义,而不是一个完整的定理证明者.您必须小心编写子句的顺序,防止循环定义等.
至于你的谓词的逻辑意义immortal,它是
immortal(X) -> immortal(X)
Run Code Online (Sandbox Code Playgroud)
这是一个重言式,可以从你的程序/理论中删除而不改变其逻辑意义.这意味着你应该删除它,如果这有助于提高程序意义(摆脱无限循环).