为什么在此查询X = Y, Y = [Y]
的情况下替换[f(X)|Y] = [f(Y),X]
成立? X
如何同时Y
和[Y]
?
答案 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