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 :(

Original source

Related problems