在 Prolog - 人工智能编程中,Bratko 在第 58 页说了以下内容。
“Prolog 中的匹配对应于逻辑中所谓的统一。但是,我们避免使用“统一”这个词,因为出于效率原因,在大多数 Prolog 系统中,匹配的实现方式并不完全对应于统一。正确的统一需要如此- 称为发生检查:给定变量是否出现在给定术语中?发生检查会使匹配效率低下。
我的问题是 miniKanren 的统一是否会遭受这种效率损失,或者这个问题如何解决?
这里有几个误解。首先,在 Prolog 中也可以使用 ISO 谓词进行声音统一unify_with_occurs_check/2
.
其次,这种声音统一可以在某些 Prolog 系统中默认启用all统一。例如,参见occurs_check
SWI-Prolog 中的 Prolog 标志。
第三,很容易构造示例,其中启用发生检查会使您的程序顺序放大faster而不是禁用检查。
四、使用术语matching描述省略发生检查的统一是一个非常糟糕的主意:Matching表示函数式语言中的单向统一。在 Prolog 中,统一始终在所有方向上起作用,即使发生检查被禁用也是如此。
因此,对于问题的 Prolog 部分,如果您的 Prolog 系统支持,我强烈建议启用发生检查来测试您的程序。通常,发生检查的统一是required指示 Prolog 程序中的编程错误。因此,您可以设置该标志,以便系统抛出一个例外否则它会创建一个循环项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)