事实证明,SICStus Prolog 没有occurrence_check Prolog 标志。至少我们找不到,这里给出了一条错误消息:
/* SICStus 4.6.0 (x86_64-win32-nt-4) */
?- set_prolog_flag(occurs_check, true).
Domain error in argument 1 of set_prolog_flag/2
看起来“true”的值不是问题,关键的统一可以通过现有的内置unify_with_occurs_check/2
. 一个发生检查 Prolog 标志的一个有趣的值是值“错误”。
如何实现谓词unify_with_occurs_check_and_error/2
?请注意,unify_with_occurs_check_and_error/2 的解决方案应该表现得像 unify_with_occurs_check/2,即不触发属性变量。
以下是 Prolog 标志的示例用法:
?- set_prolog_flag(occurs_check, error).
true.
?- X = f(X).
ERROR: ...
这就是在 SICStus Prolog 中要做的事情:
?- unify_with_occurs_check_and_error(X, f(X)).
ERROR: ...