查询返回 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 已经指出谓词是成功(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
| ?-
我最近开始学习 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 已经指出谓词是成功(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
| ?-