After many years of abstinence of the PROLOG programming language, I'm trying to get into it again. And promptly there, something confused me.
(I am using SWI prolog 6.4.1. on windows)
Consider the following defined:
father(jack, clara).
father(jack, sophie).
mother(angela,clara).
mother(angela,sophie).
parent(A, B) :- father(A, B).
parent(A, B) :- mother(A, B).
sibling( A, B ) :-
A \= B,
parent(P, A),
parent(P, B).
Now, if I "ask" the interpreter: sibling(clara, sophie).
true is the answer.
But if I try to get the siblings of e.g. clara: sibling(clara, X).
The answer is just false. Just as findall( X, sibling(clara, X ), L ).
returns an empty list.
Why?
To prove
sibling(clara, X)
, you first need to proveclara \= x
. But that doesn't work because it reduces to\+ clara = X
, were\+
is the infamous negation as failure: Prolog tries to proveclara = X
, which succeeds, and concludes thatclara \= X
must therefore be false.You should either reorder your program to do the
\=
check last instead of first, or usedif(clara, X)
.