5

是否有发生检查的差异?这在这里有效:

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.
4

2 回答 2

2

现在,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.
于 2021-03-01T09:51:01.457 回答
1

在我的系统中,我做了一个新的谓词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 = Xdif_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

于 2020-10-01T16:09:32.720 回答