在这一次的 post 中, 我们将要介绍 Prolog 中的递归定义, 也就是说, 一个 predicate 如果它定义了一个或多个引用自己的规则, 那么这个 predicate 就是递归的.
递归的定义非常地简单:
is_digesting
就是一个递归地 predicate, 在这个 knowledge base 上, 我们就可以询问 Prolog.
虽然我们并没有直接定义这个事实, 不过 Prolog 根绝递归定义地 is_digesting
推出了这个结果.
递归是一种非常强大的定义方式, 但是, 我们也能遇到一切错误, 如果, 你是用下面的这种定义方式, 就会出现无限递归.
这个无限递归是非常明显的.
上面的定义初看是正确的, 不过 Prolog 会不断地调用 is_digesting
导致无限递归, 所以这也是错误的.
我们需要正确是使用递归, 使用递归定义式, 要在定义最后添加自己的引用而不是在定义的前面.
关于图片和转载
本作品采用知识共享署名 4.0 国际许可协议进行许可。
本文转载自 Draveness 技术博客。
原文链接:https://draveness.me/prolog-di-gui-3
评论