ISO/IEC JTC1 SC22 WG17
Comparison of implementations of dif/2

ISO Prolog works.

# Query Answer dif_si/2 IV SICStus ECLiPSe IF YAP B SWI Scryer Trealla Eye
# Query, quads answer description
dif_si/2 IV SICStus ECLiPSe IF YAP B SWI Scryer Trealla Eye
introduced Œdipe 0.6 Sepia <2.10 V5.0 <6.4 5.5.3 1.3.80
date 1972-05 1987 <1989-04 <1996-05 <2000 <2003 2004-03 2019-02 2021-04 2026-08
conforming extension via 5.5.9 and 5.5.11 yes yes yes yes yes yes yes yes yes yes yes
strictly conforming extension5.1 e built-in built-in library
prolog_extras
library
const_delay
neither built-in default
dif
library
dif
library
dif new
impl.spec.
built-in
e1 ?- asserta(dif(1,1)), dif(1,2).% in 5.1 efalse. p._e.(m.,st.,_) p._e.(m.,st.,_) OK OK true p._e.(m.,st.,_) OK OK OK OK
e2 ?- dif(1,2).% in 5.1 eexistence_error(procedure,dif/2). true true OK OK true true true OK OK new OK
consistency n/a full full full weak full full full full full full
term-termination n/a yes yes yes yes yes yes yes new yes yes yes
tree-termination n/a yes yes no no yes no yes new yes yes yes
display of constraints i._e no 2 yes yes no 3 yes no 1 yes yes yes yes
call_residue_vars/2 no yes call_residue/2 no yes no yes yes yes yes
redundant constraints ? no yes ? no ?no no no new no new no
1 ?- dif(1,2). true. OK OK OK OK OK OK OK OK OK OK OK
2 ?- dif(1,Y), Y=1. false. OKR OK OK OK OK OK OK OK OK OK OK
3 ?- dif(1,Y), Y=2. Y=2. OKR OK OK OK OK OK OK OK OK OK OK
4 ?- dif(X,-Y), X= -Y. false. OKR OK OK OK OK OK OK OK OK OK OK
5 ?- dif(X,Y), X=Y. false. OKR OK OK OK true OK OK OK OK OK OK
6 ?- dif(X,Y), X=Y, X=1. false. OKR OK OK OK OK OK OK OK OK OK OK
7 ?- dif(-X,-Y), X=Y. false. OKR OK OK OK true OK OK OK OK OK OK
8 ?- dif(-X,-Y), X=Y, X=1. false. OKR OK OK OK OK OK OK OK OK OK OK
9 ?- dif(-X,X). trueo2 | maybet7. sto OK2 OK OK true OK true OK OK OK true
10 ?- dif(-X,Y), X=Y. trueo2 | maybet7. stoR OK2 OK OK true OK true OK OK OK true
11 ?- X=Y, dif(X-Y,1-2). X=Y. OK OK OK OK OK X=X OK OK OK OK OK
12 ?- dif(X-Y,1-2), X=Y. X=Y. OKR OK OK ,X-X~=1-2 3 X=X OK OK OK new OK new OK
13 ?- X=Y, Y=1, dif(X-Y,1-2). X=1, Y=1. OK OK OK OK OK OK OK OK OK OK OK
14 ?- dif(X-Y,1-2), X=Y, Y=1. X=1, Y=1. OKR OK OK OK OK OK OK OK OK OK OK
15 ?- dif(X-Y,1-2), X=Y, X=2. X=2, Y=2. OKR OK OK OK OK OK OK OK OK OK OK
16 ?- dif(A-C,B-D), C-D=z-z, A-B=1-2. A=1, C=z, B=2, D=z. OKR OK OK OK OK OK OK OK OK OK OK
17 ?- A-B=1-2, C-D=z-z, dif(A-C,B-D). A=1, B=2, C=z, D=z. OK OK OK OK OK OK OK OK OK OK OK
18 ?- dif(A,[C|B]), A=[[]|_], A=[B]. A=[[]], B=[], dif([[]],[C]). i._e ..., dif(C,[]).2 OK OK A=[[]], B=[] OK A=[[]], B=[] OK OK OK OK
19 ?- dif([E],[/]), E=1. E=1. OKR OK OK OK OK OK OK OK OK OK OK
20 ?- dif([a],B), B=[_|_], B=[b]. B=[b]. OKR OK OK OK OK OK OK OK OK OK OK
21 ?- dif([],A), A = [_]. A = [_A]. OKR OK OK OK OK OK OK OK OK new OK new OK
22 ?- A = [_], dif([],A). A = [_A]. OK OK OK OK OK OK OK OK OK OK OK
23 ?- dif(X,a), copy_term(X,a). maybe | false. i._e maybe maybe maybe maybe aborts maybe false false false maybe
24 ?- findall(X,dif(X,a),[a]). true | false. i._e true true false true true true false true new true new true
25 ?- setof(t,dif(X,a),_), X = a. X = a | false. i._e X=a X=a false X=a X=a X=a false X=a new X=a X=a
26 ?- setof(t,(dif(X,a);dif(X,b)),_), X = a. X = a. i._e X=a X=a false X=a X=a X=a false X=a new X=a new X=a
Rational tree unification
t1 ?- \+ \+ -X=X. sto, true. OK OK OK OK OK OK OK OK OK false
t2 ?- -X=X, -Y=Y, X\=Y. sto, false. OK OK loops OK OK loops OK OK OK n/a
t3 ?- -X=X, dif(X,1). sto, X = -X. OK OK OK OK OK OK OK OK OK OK n/a
t4 ?- -X=X, -Y=Y, dif(X,Y). sto, false. OK OK OK loops OK OK loops OK OK OK n/a
t5 ?- dif(X,Y), -X=X, -Y=Y. sto, false. OKR OK OK loops loops OK loops OK OK OK n/a
t6 ?- A=[[]|A],dif(A,B),B=[[]|A]. sto, false. OKR OK OK OK loops OK loops OK OK OK n/a
t7 ?- dif(-X,X),-Y=Y,X=Y. sto, false. OKR OK OK OK OK OK loops OK OK OK n/a
t8 ?- -X=X, dif(X,Y),X=Y. sto, false. OKR OK OK OK loops OK loops OK OK OK n/a
Occurs-check unification
o1 ?- -X=X. sto, false. OK OK OK OK
o2 ?- dif(-X,X). true. OK OK OK OK OK
o3 ?- dif(-X,Y), X=Y. Y = X. OKR OK OK new OK new OK

Notes

– The following reference implementation is used. Either directly (OK) or after reordering goals (OKR). An instantiation error is an indication for pending constraints.
dif_si(X, Y) :-
   X \== Y,
   (  X \= Y -> true
   ;  throw(error(instantiation_error,_Imp_def))
   ).
1 B Prolog worked in 7.1b5.1, no display in 7.3 up to 8.1
2 Prolog IV has an internal mechanism to obtain the constraints attached to specific variables, but no way to obtain such variables.
?- dif(X-Y,1-2),X=Y,symbolic_cstrbis([X,Y], V1,V2,V3,V4,V5,V6).
   A ex
      V6 = true, V5 = true, V4 = true, V3 = true, V2 = true, V1 = [A,A], X = Y, Y ~ tree, A ~ tree.
?- dif(X-Y,1-2), symbolic_cstrbis([X,Y], V1,V2,V3,V4,V5,V6).
   A ex B ex 
      V6 = true, V5 = true, V4 = true, V3 = true,
      V2 = difrat([B,A],[1,2]),
      V1 = [B,A], Y ~ tree, X ~ tree, A ~ tree, B ~ tree.
?- symbolic_cstrbis([X,Y], V1,V2,V3,V4,V5,V6).
   V6 = true, V5 = true, V4 = true, V3 = true, V2 = true, V1 ~ [tree,tree], Y ~ tree, X ~ tree.
3 IF/Prolog has is_constraint/1 to test for the presence of constraints.
Relevant clauses: 7.3 Unification,

Excluded: means to enable dif/2 similar to Prolog prologue.

Open: Interaction with subsumes_term/2


Version Control, Validated HTML