我写了这个简单的 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 使用不完全推理算法来提高效率。它旨在成为一种编程语言,其中程序除了程序意义之外还具有逻辑意义,而不是成熟的定理证明者。您必须小心编写子句的顺序,防止循环定义等。
至于你的谓词的逻辑含义immortal
, it's
immortal(X) -> immortal(X)
这是一个同义反复,可以从您的程序/理论中删除而不改变其逻辑含义。这意味着如果它有助于改善程序意义(摆脱无限循环),您应该将其删除。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)