如何在 SWI-Prolog 中的所有统一中启用发生检查?

How to enable the occurs check in all unifications in SWI-Prolog?

根据Wikipedia

Implementations offering sound unification for all unifications are Qu-Prolog and Strawberry Prolog and (optionally, via a runtime flag): XSB, SWI-Prolog and Tau Prolog.

但是,当我执行 apropos(occur) 时,它只会找到 unify_with_occurs_check/2man 页面也没有提到“发生”。如何为 SWI-Prolog 中的所有统一启用发生检查?

Environment Control部分,它列出了系统的标志。 occurs_check 标志是控制发生统一检查的标志。

您可以设置标志:

:- set_prolog_flag(<b>occurs_check</b>, true).

例如:

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

?- set_prolog_flag(occurs_check, true).
true.

?- X = f(X).
false.

所以首先它统一了 Xf(X)。如果我们稍后将 occurs_check 设置为 true,那么如果我们再次尝试将 Xf(X) 统一,则会失败。