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

Prolog新手求助:如何实现嵌套列表所有元素的求和?

Prolog嵌套列表所有元素求和实现方案

针对你的需求,这里提供两种可行的实现方式,解决嵌套列表中所有数字的累加求和问题:

方法1:先展平嵌套列表再求和

先通过findall生成目标嵌套列表,再将其展平为一维列表,最后计算一维列表的总和。SWI-Prolog等主流实现内置了sum_list/2用于一维列表求和,若你的Prolog环境没有该内置谓词,也可以自定义实现。

完整代码:

% 现有事实
a(1,2,3).
a(2,3,4).
a(4,5,6).
a(7,8,9).

% 生成嵌套列表并求和的谓词
rule1(SUM) :-
    findall([X,Y,Z], a(X,Y,Z), NestedList),
    flatten(NestedList, FlatList),
    sum_list(FlatList, SUM).

% 若环境无内置sum_list,可自定义该谓词
% sum_list([], 0).
% sum_list([H|T], Total) :-
%     sum_list(T, Rest),
%     Total is H + Rest.

调用示例:

?- rule1(SUM).
SUM = 54.

方法2:直接递归处理嵌套列表求和

无需展平列表,通过递归遍历嵌套结构,遇到子列表则递归计算其和,遇到数字则直接累加,一步完成求和。

完整代码:

% 现有事实
a(1,2,3).
a(2,3,4).
a(4,5,6).
a(7,8,9).

% 生成嵌套列表并求和
rule1(SUM) :-
    findall([X,Y,Z], a(X,Y,Z), NestedList),
    nested_sum(NestedList, SUM).

% 嵌套列表求和的递归谓词
nested_sum([], 0).
nested_sum([SubList|Rest], Total) :-
    nested_sum(SubList, SubSum),
    nested_sum(Rest, RestSum),
    Total is SubSum + RestSum.
nested_sum(Num, Num) :-
    number(Num).

调用示例:

?- rule1(SUM).
SUM = 54.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:44:59