You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 20:02:23