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

如何在Prolog中获取年龄和为100的唯一人员集合(去重排列)

解决Prolog生成唯一人员组合(避免排列重复)的问题

问题分析

当前代码使用select/3会生成所有可能的人员排列,导致同一个人员集合(比如[joe,tod]和[tod,joe])被当作不同结果输出。我们需要让程序只输出唯一的人员集合,忽略顺序差异。

解决方案

核心思路是在生成组合的过程中强制保持有序(比如按人员名字的字典序),从根源避免重复排列。修改后的代码如下:

hundred(L) :- 
    findall(X, age(X,_), L1),
    sort(L1, SortedL),  % 将人员列表按字典序排序
    sum(SortedL, 100, [], L),
    length(L, Len),
    Len > 1.

sum(_, 0, _, []).
sum(L, S, Last, [H|T]) :-
    select(H, L, L1),
    (Last = [] ; H @> Last),  % 确保新选人员的字典序大于上一个,避免逆序组合
    age(H, A),
    S1 is S - A,
    S1 >= 0,
    sum(L1, S1, H, T).

代码说明

  • sort(L1, SortedL):先把所有人员按原子字典序排序,为有序选择打下基础。
  • Last参数:记录上一个选中的人员,通过H @> Last保证每次新选的人员字典序更大,这样同一个集合只会以升序形式出现一次,不会生成逆序排列。
  • 递归逻辑保持原有的年龄求和逻辑,只是增加了有序约束,不影响总和计算的正确性。

运行修改后的hundred(L),就能得到你需要的唯一人员集合,输出顺序无关且无重复排列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:45:51