Предикат распечатывает неожиданное значение false

Я пытаюсь написать предикат likes/2 таким образом, чтобы он работал следующим образом:

?- likes(A,alan).
A = lindsay ;
A = chloe ;
A = cheyanne ;
A = britney ;

Вот как я решаю проблему:

% Define your facts:
combo(lindsay,alan).
combo(chloe,alan).
combo(cheyanne,alan).
combo(britney,alan).

% Define your predicate:
likes(A,B) :- combo(A,B); combo(B,A).

Теперь проблема, с которой я сталкиваюсь, заключается в том, что, хотя моя программа работает так, как предполагается, по большей части она выводит false в конце, и я не понимаю, почему. Вот полный вывод:

?- likes(A,alan).
A = lindsay ;
A = chloe ;
A = cheyanne ;
A = britney ;
false.

person The Hound    schedule 28.01.2015    source источник
comment
См. эти ответы   -  person false    schedule 28.01.2015


Ответы (1)


Короткий ответ. Интерпретатор верхнего уровня Пролога не всегда может обнаружить, что для запроса больше нет доказательств. Итак, в вашем случае, после предоставления решения A = britney он спрашивает вас, хотите ли вы еще одно решение.

В конкретном случае запроса likes(A,alan) ваше единственное предложение для предиката означает, что механизм вывода пытается доказать combo(A,alan); combo(alan,A). Левая цель в этой дизъюнкции дает вам четыре решения, которые вы получаете. Но правильное решение может также предоставить одно или несколько решений, но движок может разобраться в этом, только попробовав цель, что не удается, поскольку ни одно из предложений для combo/2 не имеет атома alan в качестве первого аргумента. Эта неспособность доказать правильную цель дает вам печать false.

person Paulo Moura    schedule 28.01.2015
comment
Я в замешательстве, что делать, чтобы ложное не появлялось. Я не могу избавиться от правой части уравнения, потому что имена можно давать в любом порядке. Что я должен делать? Или это то, что должно произойти? - person The Hound; 28.01.2015
comment
@TheHound, почему тебя беспокоит ответ false? Это совершенно нормально и ожидаемо от Пролога. Он говорит, что не смог найти больше решений после уже показанных. - person lurker; 28.01.2015
comment
@lurker А, я этого не знал. Я новичок в Прологе, поэтому ко всему еще не привык. - person The Hound; 28.01.2015
comment
@TheHound Это распространенное недоразумение для тех, кто только начинает работать с Прологом. Бывают случаи, когда Пролог знает, что решений больше нет, поэтому не выполняет возврат и не показывает false. Ответ Пауло подробно описывает ваш конкретный случай, почему существует точка выбора, к которой Prolog должен вернуться. Не все предикаты покинут такую ​​точку выбора. Но если они это сделают, это не обязательно проблема. - person lurker; 28.01.2015