我最近开始学习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 .
有谁知道为什么我会得到这些结果?
输出第二个布尔值的意义是什么?
最后,.
是否出现在重要空间之后?
感谢您的帮助。
答案 0 :(得分:2)
Prolog已经指出谓词是成功(true
还是yes
)还是失败(false
或no
),所以你在谓词中做了太多工作当你(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
| ?-