我对统一的理解有点不完整。我理解基本的统一,但是我遇到了一些问题,但这些条款并不是一致的。
我正在观看关于统一的youtube教程,该教程说明变量是否试图与包含该变量的术语进行统一,然后它不是统一的。
然而,当我在prolog中输入?- f(X) = X
时,它会返回...... f(f(f(f(f(f(...)))))) ?
我理解为什么会这样......但是我不明白这是否意味着它是统一的,正如我所预料的那样,如果它不是可以统一的话,它就会返回'不'。我是否正确地认为尝试统一f(X)= X会失败发生检查,从而使它们不能统一?
答案 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以及引用的参考文献。