Подтвердить что ты не робот

Почему этот прологовый запрос является истинным и ложным?

Моя база знаний SWI-Prolog содержит следующие два факта:

f(a,b).
f(a,c).

Теперь, если я поставил запрос

?- f(a,c).
true.

Но

?- f(a,b).
true ;
false.

Почему f (a, b) истинно и ложно? Это также происходит, когда в КБ есть три факта. Если я добавлю f (a, d). к КБ, то f (a, d) истинно (только), но f (a, b) и f (a, c) являются истинными и ложными. Что происходит, и что я могу сделать, чтобы Prolog отвечал (только) на эти запросы?

4b9b3361

Ответ 1

(Примечание: этот ответ несколько догадывается)

Рассмотрим, как Prolog определяет, является ли f(a,c) истинным или нет. Он проверяет первое правило, f(a,b) и не находит совпадения, но второе правило, f(a,c) соответствует. Следовательно, f(a,c) истинно. Кроме того, поскольку правил для f больше нет, нет смысла разрешать обратный путь - нет других возможных решений.

Теперь рассмотрим f(a,b). Prolog проверит первое правило и найдет совпадение. Следовательно, f(a,b) истинно. Однако не все правила были исчерпаны. Поэтому Prolog позволит продолжить поиск (если вы нажмете ;). Когда вы продолжите поиск и возвращение, он обнаружит, что остальные правила, в частности f(a,c), не соответствуют f(a,b). Следовательно, результат будет ложным.

Ответ 2

Просто в дополнение к Майклу Уильямсону ответ. Если вы хотите сообщить Prolog прекратить поиск ответов после первого успешного удара, используйте разрез (!):

?- f(a, b), !.
true.

?- f(a, c), !.
true.