Prolog匹配vs miniKanren统一

use*_*545 5 prolog minikanren clojure-core.logic

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

"匹配Prolog中对应于所谓统一的逻辑,但我们避免使用文字的统一,因为匹配,对于大多数Prolog的系统效率的原因,在某种程度上,它不完全对应的统一实施.正确的统一要求,以便 - 调用发生检查:给定的变量是否在给定的术语中出现?发生的检查会使匹配效率低下."

我的问题是,如果miniKanren的统一遭受这种效率损失或者这个问题是如何解决的?

mat*_*mat 5

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

其次,默认情况下,所有统一都可以在某些Prolog系统中启用这种声音统一。例如,参见occurs_checkSWI-Prolog中的Prolog标志。

第三,构造示例很容易,其中启用发生检查使您的程序顺序变得比禁用检查更快

第四,使用匹配一词来描述省略发生检查的统一是一个非常糟糕的主意:匹配是功能语言中的单向统一。在Prolog中,即使禁用了发生检查,统一也始终在所有方向上起作用。

因此,对于问题的Prolog部分,如果您的Prolog系统支持,我强烈建议启用发生检查以测试您的程序。通常,需要进行检查的统一表示Prolog程序中的编程错误。因此,您可以例如以一种方式设置标志,使系统抛出异常,否则它将创建循环项。

  • @鲍里斯:无限树的“实用”示例是SWI中CHR的当前实现。 (3认同)
  • 我曾经看到过 Stefan Kral 对循环项的巧妙应用,他用循环项来表示图灵机的无限带(最初填充为“0”),以“Tape = [0|Tape]”开头,并且从那里出发。有关运行速度提高数百倍的实际示例 *with* 发生检查,请参阅 Ulrich Neumerkel 等人。“[Prolog 课程的声明性语言扩展](http://www.complang.tuwien.ac.at/ulrich/papers/PDF/2008-fdpe.pdf)”。 (2认同)