My SWI-Prolog knowledge base contains the following two facts:
f(a,b).
f(a,c).
Now if I pose the query
?- f(a,c).
true.
But
?- f(a,b).
true ;
false.
Why is f(a,b) both true and false? This also happens when there are three facts in the KB. If I append f(a,d). to the KB, then f(a,d) is true (only), but f(a,b) and f(a,c) are both true and false. What's going on, and what can I do so that Prolog answers (only) true to these queries?
(Note: this answer is somewhat of a guess)
Consider how Prolog determines whether f(a,c)
is true or not. It checks the first rule, f(a,b)
, and doesn't find a match, but the second rule, f(a,c)
matches. Therefore, f(a,c)
is true. Furthermore, since there are no more rules for f
, there is no point in allowing a backtrack to occur -- there are no other possible solutions.
Now consider f(a,b)
. Prolog will check the first rule, and find a match. Therefore, f(a,b)
is true. However, not all rules have been exhausted. Therefore, Prolog will allow the search to continue (if you hit ;
). When you do continue the search and backtrack, it will discover that the remaining rules, specifically f(a,c)
, do not match f(a,b)
. Therefore, the result is false.