查询返回 true/false

Query returning true/false

我最近开始学习 Prolog 并且遇到了一个问题。

以下已加载到 Prolog:

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

我正在写一个谓词 all_like(What, List) 如果 List 中的所有人都喜欢 What 中的水果,那么应该 return True。[=26] =]

例如:

all_like(apple,[john, bill]).

应该return:

true ;
false.

all_like(grapes,[john, bill]).

应该return:

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

我的结果是:

第一次查询

true
true .

第二次查询

false
true .

有人知道我为什么会得到这些结果吗?

输出第二个布尔值有什么意义?

最后,出现在space之后的.是否有意义?

感谢您的帮助。

Prolog 已经指出谓词是成功(trueyes)还是失败(falseno),因此您在当您 (a) 在成功时显式写出 "true",并且 (b) 您尝试在失败情况下成功并写出失败时,您的谓词。最好让失败的案例直接失败,然后 Prolog 会显示失败。

顺便说一句,您的 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
| ?-