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

