The actual reason for your problem is (\==)/2
within different/2
. It succeeds simply too often. Replace it with dif/2
and you will get the expected behavior. dif/2
is available in many Prolog systems like SICStus, YAP, B, SWI. You can also define a safe approximation in ISO-Prolog like so:
iso_dif(X, Y) :-
X \== Y,
( X \= Y -> true
; throw(error(instantiation_error,iso_dif/2))
).
Now, should the arguments be not sufficiently instantiated, you will get an Instantiation Error. Prolog aborts the computation and says: I have no idea! Which is far better than pretending it does have an idea while it has none.
Using iso_dif/2
you will still have to place it at the end of the rule. But this time, Prolog will keep an eye on its correct usage.
| ?- iso_dif(a,b).
yes
| ?- iso_dif([a,_],[b,_]).
(8 ms) yes
| ?- iso_dif([a,X],[X,b]).
yes
| ?- iso_dif([a,X],[a,X]).
no
| ?- iso_dif([a,X],[X,X]).
uncaught exception: error(instantiation_error,iso_dif/2)