是否有发生检查的差异?这在这里有效:
Welcome to SWI-Prolog (threaded, 64 bits, version 8.3.7)
?- set_prolog_flag(occurs_check, true).
true.
?- dif(X,f(Y)), X = Y.
X = Y.
但上面是不可行的,因为发生检查是一个全局标志,我得到以下信息:
SWI-Prolog console for thread 3
?- X=f(X).
false.
是否有发生检查的差异?这在这里有效:
Welcome to SWI-Prolog (threaded, 64 bits, version 8.3.7)
?- set_prolog_flag(occurs_check, true).
true.
?- dif(X,f(Y)), X = Y.
X = Y.
但上面是不可行的,因为发生检查是一个全局标志,我得到以下信息:
SWI-Prolog console for thread 3
?- X=f(X).
false.
现在,Scryer支持dif/2
在设置相应标志时使用发生检查:
?- use_module(library(dif)).
true.
?- set_prolog_flag(occurs_check, true).
true.
?- dif(-X,X).
true.
?- dif(-X,Y).
dif:dif(- X,Y).
?- dif(-X,X), X = a.
X = a.
在我的系统中,我做了一个新的谓词dif_with_occurs_check/2
。顾名思义,它dif/2
带有发生检查,因此无需设置标志。但是还有一个额外的好处,dif/2
就是优化了监听更少的变量:
/* listens only to changes in X */
?- dif(X, f(Y)).
/* listens to changes in X and Y */
?- dif_with_occurs_check(X, f(Y)).
dif_with_occurs_check/2
这是必要的,以便我们可以在将变量更改Y
为时唤醒Y = X
。dif_with_occurs_check/2
然后将删除它自己的约束,该约束X = f(Y)
已变得X = f(X)
过时。
?- dif(X,f(Y)), X = Y.
X = Y,
dif(Y, f(Y))
?- dif_with_occurs_check(X,f(Y)), X = Y.
X = Y
开源:模块“herbrand”
https://github.com/jburse/jekejeke-devel/blob/master/jekmin/headless/jekmin/reference/term/herbrand.p