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

Prolog新手求助:如何找出参与多个圈子的人员列表

找出参与多个圈子的Prolog实现

已知事实

我们有以下描述圈子成员和人员信息的Prolog事实:

circle(сhess, abbot).
circle(сhess, hannigan).
circle(сhess, abrams).
circle(crystal_voice, blake).
circle(crystal_voice, weller).
circle(crystal_voice, huxley).
circle(local_studies, barnes).
circle(local_studies, haskins).
circle(local_studies, abrams).
circle(local_studies, aberdeen).
circle(art, barnes).
circle(art, abbot).
circle(art, blake).

person(abbot, male, 20).
person(aberdeen, female, 18).
person(weller, male, 22).
person(abrams, female, 25).
person(adams, male, 21).
person(bond, female, 12).
person(haskins, male, 15).
person(blake, female, 20).
person(barnes, male, 20).
person(hannigan, female, 15).
person(huxley, male, 18).

现有统计代码

你已经实现了统计单个人员参与圈子数量的谓词:

count(Name, Count):- 
   findall(1, circle(_, Name), List),
   length(List, Count). 

实现筛选逻辑

要找出参与多个圈子的人员,只需在现有统计逻辑基础上添加数量大于1的判断即可,以下是两种实现方式:

方式1:复用现有count/2谓词

% 匹配参与圈子数量大于1的人员
multiple_circles_member(Name) :-
    count(Name, Count),
    Count > 1.

方式2:直接整合逻辑(无需依赖count/2)

如果不想单独维护统计谓词,也可以把逻辑合并到一个谓词里:

multiple_circles_member(Name) :-
    % 收集该人员参与的所有圈子
    findall(Circle, circle(Circle, Name), Circles),
    % 计算圈子数量并判断是否大于1
    length(Circles, Count),
    Count > 1.

使用示例

在Prolog解释器中执行查询:

?- multiple_circles_member(X).

会得到以下结果(顺序可能因解释器不同略有差异):

X = abbot ;
X = abrams ;
X = blake ;
X = barnes.

内容的提问来源于stack exchange,提问作者Vlad_3ay4ik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:05:43