Запрос возвращает true/false

Недавно я начал изучать Prolog и столкнулся с проблемой.

В Prolog загружено следующее:

likes(john, apple).
likes(john, pear).
likes(john, grapes).
likes(bill, mango).
likes(bill, apple).

Я пишу предикат all_like(What, List), который должен возвращать True, если всем людям в List нравятся фрукты в What.

Eg:

all_like(apple,[john, bill]).

должен вернуться:

true ;
false.

all_like(grapes,[john, bill]).

должен вернуться:

false.

У меня такой код:

all_like(What,List) :- check_list(What,List).

check_list(What,[]) :- write('true').
check_list(What, [X|Rest]) :- likes(X,What), check_list(What,Rest).
check_list(What, [X|Rest]) :- \+ likes(X,What), write('false').

Мои результаты:

1-й запрос

true
true .

2-й запрос

false
true .

Кто-нибудь знает, почему я получаю такие результаты?

Каково значение выводимого второго логического значения?

Наконец, появляется ли . после значимого пробела?

Спасибо за помощь.


person Community    schedule 19.03.2016    source источник


Ответы (1)


Пролог уже указывает, успешно ли выполняется предикат (true или yes) или нет (false или no), поэтому вы делаете слишком много работы в своем предикате, когда (а) явно записываете «истина» в случае успеха и (б) вы попытайтесь добиться успеха в случае неудачи и запишите неудачу. Лучше просто оставить неудачный случай неудачным, тогда Пролог покажет ошибку.

Кроме того, ваш предикат check_list лишний, и вы можете просто использовать all_likes. Итак, это действительно все, что вам нужно:

all_likes(_, []).             % An empty list likes anything
all_likes(What, [X|Rest]) :-  % All of [X|Rest] likes What if... 
    likes(X, What),           % X likes What and...
    all_likes(What, Rest).    % All of Rest likes What

В SWI Prolog вы увидите следующие результаты:

?- all_likes(apple,[john, bill]).
true ;
false.

?- all_likes(grapes,[john, bill]).
false.

В GNU Prolog вывод выглядит так:

| ?- all_likes(apple,[john, bill]).

true ? ;

no
| ?- all_likes(grapes,[john, bill]).

no
| ?-
person lurker    schedule 19.03.2016
comment
Спасибо, люкер, это имеет гораздо больше смысла. Могу я спросить, почему false отображается после true ; в первом примере? - person ; 19.03.2016
comment
@Giri false отображается после true, потому что у Prolog была точка выбора, к которой можно было вернуться и проверить наличие дополнительных решений, но не нашел дополнительных ответов. Таким образом, SWI Prolog выдает false. Вы можете видеть, что в случае с GNU Prolog вы получаете не, а не ложь, и это означает то же самое: больше никаких решений. - person lurker; 19.03.2016