1

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

以下内容已加载到Prolog

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

我正在写一个谓词,如果所有的人都喜欢 in 的水果,all_like(What, List)它应该返回。TrueListWhat

例如:

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

我的结果是:

第一个查询

true
true .

第二次查询

false
true .

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

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

最后,.出现在一个空间之后有意义吗?

感谢您的帮助。

4

1 回答 1

3

Prolog 已经表明一个谓词是成功(trueyes)还是失败(falseno),所以当你(a)明确写出“真”表示成功,并且(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
| ?-
于 2016-03-19T13:09:48.500 回答