Prolog匹配vs miniKanren统一

时间:2015-11-17 07:17:50

标签: prolog clojure-core.logic minikanren

在Prolog - 人工智能编程中,Bratko在第58页上说了以下内容。

" Prolog中的匹配对应于逻辑中所谓的统一。但是,我们避免使用统一这个词,因为在大多数Prolog系统中,出于效率原因,匹配的实现方式并不完全符合统一。适当的统一需要所谓的发生检查:给定的变量是否在给定的项中出现?发生的检查会使匹配效率低下。"

我的问题是,如果miniKanren中的统一遭受此效率惩罚或这个问题是如何解决的?

2 个答案:

答案 0 :(得分:5)

这里有几个误解。首先,使用ISO谓词unify_with_occurs_check/2在Prolog中也可以进行声音统一。

其次,默认情况下,某些Prolog系统可以启用此声音统一,用于所有统一。例如,参见SWI-Prolog中的occurs_check Prolog标志。

第三,很容易构建一些示例,其中启用发生检查使您的程序订单的放大更快而不是禁用检查。

第四,使用术语匹配来描述省略发生检查的统一是一个非常糟糕的主意:匹配意味着功能语言中的单向统一。在Prolog中,如果禁用发生检查,则统一始终在所有方向上工作。

因此,对于问题的Prolog部分,我强烈建议启用检查以测试您的程序,如果您的Prolog系统支持它。通常,发生检查 required 的统一表示Prolog程序中的编程错误。因此,您可以设置标志,使系统抛出异常,否则会创建一个循环术语。

答案 1 :(得分:0)

在Prolog中,发生检查是可选的。在SWI Prolog中,您可以全局打开,关闭它,或将Prolog配置为在发生检查成功(对于调试旨在关闭发生检查而运行的程序时非常有用)时引发error。 / p>

另一方面,在miniKanren中,发生检查是非可选