In my system, I made a new predicate dif_with_occurs_check/2
. As the name says, it is dif/2
with occurs check, so no need to set a flag. But there is an additional benefit, dif/2
is optimized to listen to fewer variables:
/* listens only to changes in X */
?- dif(X, f(Y)).
/* listens to changes in X and Y */
?- dif_with_occurs_check(X, f(Y)).
This is necessary, so that we can wake up dif_with_occurs_check/2
when change the variable Y
for example to Y = X
. dif_with_occurs_check/2
will then remove its own constraint X = f(Y)
which has become X = f(X)
and therefore obsolete.
?- dif(X,f(Y)), X = Y.
X = Y,
dif(Y, f(Y))
?- dif_with_occurs_check(X,f(Y)), X = Y.
X = Y
Open Source: Module "herbrand"
https://github.com/jburse/jekejeke-devel/blob/master/jekmin/headless/jekmin/reference/term/herbrand.p