如何用SWI-Prolog查询最受欢迎的菜品(仅需首位结果)
查询最受欢迎菜品的SWI-Prolog实现
需求说明
基于给定的likes/2事实,找出被最多用户喜欢的菜品,仅返回排名第一的结果(若有并列第一,会返回所有并列菜品)。
实现方案
可以通过三个步骤实现:统计每个菜品的喜欢人数、找出最大的喜欢人数、筛选出对应最大人数的菜品。以下是具体的谓词定义和查询方式:
1. 统计单菜品的喜欢人数
定义count_likes/2谓词,计算某个菜品被多少用户喜欢:
count_likes(Dish, Count) :- findall(User, likes(User, Dish), Users), length(Users, Count).
2. 找出最大的喜欢人数
定义max_like_count/1谓词,获取所有菜品中最高的喜欢人数:
max_like_count(MaxCount) :- findall(C, count_likes(_, C), Counts), max_list(Counts, MaxCount).
3. 查询最受欢迎菜品
定义most_popular/1谓词,返回对应最高喜欢人数的菜品:
most_popular(Dish) :- max_like_count(MaxCount), count_likes(Dish, MaxCount).
测试查询
在SWI-Prolog中运行以下查询:
?- most_popular(Dish).
针对你提供的事实,会返回结果:
Dish = burger.
简化版查询(无需单独定义谓词)
如果不想单独定义谓词,也可以用一条整合的查询语句:
?- findall(Count-Dish, (findall(User, likes(User, Dish), Users), length(Users, Count)), Pairs), sort(Pairs, Sorted), reverse(Sorted, [_-Dish|_]), writeln(Dish).
这条语句会直接输出最受欢迎的菜品burger。
内容的提问来源于stack exchange,提问作者gphilip
相关产品推荐
相关产品推荐

