2015-01-28 2 views
2

Я пытаюсь написать предикат, likes/2, в манере, где он работает, как следующее:Predicate распечатывает «Неожиданный» ложь

?- 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). 

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

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

См. [Эти ответы] (http://stackoverflow.com/search?q=%5Bprolog-toplevel%5D+false) – false

ответ

1

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

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

+0

Я смущен относительно того, что делать, чтобы остановить ложное появление. Я не могу избавиться от правой части уравнения, потому что имена могут быть заданы в любом порядке. Что мне делать? Или это то, что должно произойти? –

+1

@ TheHound, почему вы беспокоитесь о «ложном» ответе? Это совершенно нормально, и ожидается от Prolog. Он говорит, что не удалось найти больше решений после уже показанных. – lurker

+0

@ lurker А, я этого не знал. Я новичок в Prolog, поэтому я все еще привык ко всему. –