查询返回true / false

时间:2016-03-19 12:50:00

标签: prolog prolog-toplevel

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

以下内容已加载到Prolog

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

我正在编写一个谓词all_like(What, List),如果True中的所有人都喜欢List中的水果,则应返回What

例如:

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 .

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

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

最后,.是否出现在重要空间之后?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

Prolog已经指出谓词是成功(true还是yes)还是失败(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
| ?-