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

Prolog实现嵌套列表元素计数并输出计数列表的技术求助

嵌套列表子列表元素数量统计实现方案

你已经写好的count_list/2可以直接用来统计单个列表的元素数,只需要在外层新增一个递归谓词,遍历嵌套列表的每个子列表,逐个调用count_list/2并收集结果即可。

完整代码实现

% 你已实现的单列表元素计数谓词
count_list([], 0).
count_list([_|T], C) :- count_list(T, CNT), C is CNT + 1.

% 嵌套列表的子列表长度统计谓词
clistoflists([], []).
clistoflists([Sublist|Rest], [Count|CountsRest]) :-
    count_list(Sublist, Count),
    clistoflists(Rest, CountsRest).

代码逻辑说明

  • clistoflists([], []):基础终止条件,当输入的嵌套列表为空时,输出的长度结果列表也为空。
  • clistoflists([Sublist|Rest], [Count|CountsRest]):递归处理逻辑:
    1. 取出嵌套列表的第一个子列表Sublist,调用count_list/2统计其元素数量,结果存入Count。
    2. 递归处理嵌套列表的剩余部分Rest,得到剩余子列表的长度列表CountsRest。
    3. 将当前子列表的长度Count与剩余结果CountsRest拼接,组成最终的输出列表。

测试验证

调用你给出的示例查询:

?- clistoflists([[a,b,c,d],[e,f,g],[h,i],[j,k,l]], N).
N = [4, 3, 2, 3].

结果完全符合预期。

扩展提示

如果需要处理更深层次的嵌套(比如子列表内部还有嵌套列表,需统计所有叶子节点总数),可以修改count_list/2为深度遍历版本:

count_deep([], 0).
count_deep([H|T], C) :-
    is_list(H),
    count_deep(H, HCount),
    count_deep(T, TCount),
    C is HCount + TCount.
count_deep([_|T], C) :-
    \+ is_list(H),
    count_deep(T, TCount),
    C is TCount + 1.

但针对你当前的需求,原有的count_list/2已经足够满足场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:20:34