如何找出父母平均年龄最小的人员列表?Prolog代码求助
解决父母平均年龄最小的人员列表问题
你的代码当前是在计算父母自身的平均年龄(实际就是父母的年龄,因为每个父母的年龄被重复计算了他们孩子的次数),而不是计算每个孩子的父母的平均年龄。这是核心问题所在。
以下是修正后的代码,分为两种场景:包含所有有至少一位已知年龄父母的孩子,以及仅包含有双亲(父母均存在且年龄已知)的孩子。
通用辅助谓词
% 定义父亲和母亲关系(你的代码这部分是正确的) father(X, Y) :- parent_child(X, Y), male(X). mother(X, Y) :- parent_child(X, Y), female(X). % 获取某孩子Y的所有已知年龄的父母的年龄列表 parent_ages(Y, Ages) :- findall(Age, (parent_child(P, Y), age(P, Age)), Ages). % 计算列表的平均值 average(Ages, Avg) :- sum_list(Ages, Sum), length(Ages, Count), Count > 0, Avg is Sum / Count.
场景1:包含所有有至少一位已知年龄父母的孩子
此场景会统计所有有父母(无论一位或两位)且父母年龄已知的孩子:
% 计算每个孩子的父母平均年龄 child_parent_average(Y, Avg) :- parent_ages(Y, Ages), average(Ages, Avg). % 找出父母平均年龄最小的人员列表 min_average_age(Persons) :- % 收集所有孩子及其父母平均年龄的配对 findall(Y-Avg, child_parent_average(Y, Avg), Pairs), % 处理无符合条件人员的边界情况 (Pairs = [] -> Persons = [] ; % 找到最小的平均年龄 aggregate_all(min(Avg), member(_-Avg, Pairs), Min), % 收集所有拥有该最小平均年龄的孩子 findall(Y, member(Y-Min, Pairs), Persons) ).
查询结果:min_average_age(Persons). → Persons = [ann, pat, peter](这三个孩子的父母平均年龄均为20,仅父亲bob的年龄已知)。
场景2:仅包含有双亲(父母均存在且年龄已知)的孩子
此场景严格筛选出有双亲且父母年龄均已知的孩子:
% 检查孩子是否有双亲(父亲和母亲都存在) has_two_parents(Y) :- father(_, Y), mother(_, Y). % 计算有双亲且父母年龄均已知的孩子的父母平均年龄 child_two_parents_average(Y, Avg) :- has_two_parents(Y), parent_ages(Y, Ages), length(Ages, 2), % 确保父母双方年龄都已知 average(Ages, Avg). % 找出有双亲的孩子中父母平均年龄最小的人员列表 min_average_age_two_parents(Persons) :- findall(Y-Avg, child_two_parents_average(Y, Avg), Pairs), (Pairs = [] -> Persons = [] ; aggregate_all(min(Avg), member(_-Avg, Pairs), Min), findall(Y, member(Y-Min, Pairs), Persons) ).
查询结果:min_average_age_two_parents(Persons). → Persons = [bob](仅bob有双亲pam和tom,年龄分别为40和50,平均45)。
关键调整说明
- 切换计算视角:从遍历父母改为遍历孩子,收集每个孩子的父母年龄并计算平均。
- 加入双亲检查逻辑,满足你提到的需求。
- 处理了无符合条件人员的边界情况。
内容的提问来源于stack exchange,提问作者Domen1k
相关产品推荐
相关产品推荐

