What is the logical 'not' in Prolog?
prolog, prolog-dif
Solution
In place of `not(X = Y)` you need to write `\+ X = Y` or `X \= Y`. But consider to use `dif(X,Y)` instead. `dif/2` is present in B, SWI, YAP, SICStus. To see the difference:
?- X = b, dif(a, X).
X = b.
?- X = b, \+ a = X.
X = b.
So up to now everything seems to be fine. But what, if we simply exchange the order of the two goals?
?- \+ a = X, X = b.
false.
?- dif(a, X), X = b.
X = b.
`(\+)/1` now gives us a different result, because there is an answer for `a = X`, the goal `\+ a = X` will fail.
`(\+)/1` is thus not negation, but means not provable at this point in time.
A safe approximation of `dif/2` is possible in ISO Prolog, too.
Problem
The problem that I face, is a bit trivial. I want to use logical not in Prolog, but it seems that `not/1` is not the thing that I want: ``` course(ai). course(pl). course(os). have(X,Y) :- course(X),course(Y),not(X = Y). ``` I query: ``` have(X,Y), write(X-Y), nl , fail. ``` And I do not get the result I want :(