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
相关产品推荐
相关产品推荐

