Почему этот пролог запрос является истинным и ложным? - PullRequest
29 голосов
/ 24 июля 2010

Моя база знаний 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 отвечал (только) верно на эти запросы?

Ответы [ 2 ]

27 голосов
/ 24 июля 2010

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

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

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

13 голосов
/ 24 июля 2010

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

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

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