Prolog:f(X)= X是否可以统一?

时间:2015-11-17 00:52:53

标签: prolog unification

我对统一的理解有点不完整。我理解基本的统一,但是我遇到了一些问题,但这些条款并不是一致的。

我正在观看关于统一的youtube教程,该教程说明变量是否试图与包含该变量的术语进行统一,然后它不是统一的。

然而,当我在prolog中输入?- f(X) = X时,它会返回...... f(f(f(f(f(f(...)))))) ?

的内容。

我理解为什么会这样......但是我不明白这是否意味着它是统一的,正如我所预料的那样,如果它不是可以统一的话,它就会返回'不'。我是否正确地认为尝试统一f(X)= X会失败发生检查,从而使它们不能统一?

1 个答案:

答案 0 :(得分:5)

是的,你是对的:在逻辑上,变量 x 当然在语法上与 f(x)一致变量本身作为 f(x)的严格子项出现的理由。

出于这个原因,所谓的occurs check导致统一失败。

正如在该文章中正确指出的那样,Prolog实现通常忽略出现效率的原因,这可能导致不正确的推论。

但是,您始终可以使用ISO谓词unify_with_occurs_check/2执行统一进行Prolog检查。正如预期的那样,在这种情况下,你要求的统一失败

?- unify_with_occurs_check(X, f(X)).
false.

请注意,在某些Prolog系统中,您可以设置一个标志以启用所有统一的发生检查。

例如,在SWI-Prolog中:

?- set_prolog_flag(occurs_check, true).
true.

?- X = f(X).
false.

我建议您启用此标记以获得合理的结果。

要求发生检查的联系通常表示编程错误。因此,您可以将标志设置为抛出错误而不是静默失败。

另请参阅上述评论中与@false相关联的related question以及引用的参考文献。