为什么这种替换在Prolog中持有?

时间:2016-09-05 16:01:19

标签: prolog substitution

为什么在此查询X = Y, Y = [Y]的情况下替换[f(X)|Y] = [f(Y),X]成立? X如何同时Y[Y]

1 个答案:

答案 0 :(得分:1)

你完全正确,通常情况并非如此。

但是,出于效率原因,Prolog实现通常会忽略发生检查,因此在这种情况下可能会产生一些意外结果,允许循环术语通过所谓的理性树统一。

查看一个更简单的案例:

?- X = f(X).
X = f(X).

您可以使用ISO谓词unify_with_occurs_check/2来执行语法统一,因为您可能知道它:

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

值得注意的是,在SWI-Prolog中,有一个标记occurs_check可以设置为true以启用所有统一的发生检查。这是一个非常强大且有价值的功能:

?- set_prolog_flag(occurs_check, true).
true.

?- X = f(X).
false.

您甚至可以将标记设置为error以捕获您的程序 STO 的情况,但会发生检查:

?- set_prolog_flag(occurs_check, error).
true.

?- X = f(X).
ERROR: =/2: Cannot unify _G937 with f(_G937): would create an infinite tree