List 如何对嵌套列表中的每个列表求和?

List 如何对嵌套列表中的每个列表求和?,list,prolog,List,Prolog,如果有意义的话,我想做的是基本上得到一些列表 我试图实现的是sum([[1,2],[3,4],[5,6]])。应返回: 列表数量:3 清单1 3. 清单2 7. 清单3 11…等等 我可以得到列表的数量,这相当简单,但我不太确定如何循环遍历列表,然后为每个列表添加数字。我是否让它比实际情况更复杂?只要这是一个初学者的问题,我就用Visual Prolog编写了以下代码,尽管它是通用的,应该适用于Prolog的所有主要实现: domains ilist=integer* ilistlis

如果有意义的话,我想做的是基本上得到一些列表

我试图实现的是
sum([[1,2],[3,4],[5,6]])
。应返回:

列表数量:3
清单1
3.
清单2
7.
清单3
11…等等

我可以得到列表的数量,这相当简单,但我不太确定如何循环遍历列表,然后为每个列表添加数字。我是否让它比实际情况更复杂?

只要这是一个初学者的问题,我就用Visual Prolog编写了以下代码,尽管它是通用的,应该适用于Prolog的所有主要实现:

domains
  ilist=integer*
  ilistlist=ilist*

predicates
  mapsum(ilistlist, ilist, ilist)
  reverse(ilist,ilist,ilist)
  sum(ilist,integer,integer)

clauses
  reverse([],L,L).
  reverse([X|Xs], A, R):-
    A1 = [X|A],
    reverse(Xs, A1, R).

  sum([], A, A).  
  sum([X|Xs], A, R):-
    Y = X + A,
    sum(XS, Y, R).

  mapsum([], A, R):-
    reverse(A, [], R).
  mapsum([X|Xs], A, R):-
    sum(X, 0, Sum),
    A1 = [Sum|A],
    mapsum(Xs, A1, R).

goal
  mapsum([[9,5,3,6],[8,4],[2,7],[]], [], R).
结果是:

R=[23,12,9,0]
1 Solution
此代码适用于内部列表中任意数量的元素,并正确处理空列表

我认为在一个列表中包含列表没有多大意义,只需要一个总和列表就可以了。 Visual Prolog中
integer*
中的星号表示您需要
integer
s的列表

在目标中,调用主谓词
mapsum
,在一个列表中为其提供3个列表、一个空列表(累加器)和一个未绑定变量
R
;后者将得到结果

mapsum
在每次迭代中检索您在目标中提供的列表的头
X
,并计算其(列表)元素的总和,然后创建一个新的列表
A1
,它是累加器
a
和您刚刚计算的头的总和的组合,然后,它用其余的列表元素(tail)、一个新的累加器
A1
和尚未绑定的变量
R
调用自己

mapsum
接近绑定条件时,当列表(第一个参数)为空时,它将反转列表,并将反转结果绑定到未绑定变量
R


我想你会自己整理出
sum
reverse
的工作方式。

在SWI Prolog中,你可以使用
maplist
sumlist

?- maplist(sumlist, [[1,2], [3,4], [5,6]], Lengths).
Lengths = [3, 7, 11].
现在,您可以按自己喜欢的方式打印
长度


要了解
maplist
sumlist
是如何实现的,只需调用
listing(maplist)
listing(sumlist)

如果要将使用的内置谓词的数量限制为“is”:


在SWI Prolog中测试。

当然,还有其他方法来解决这个问题,例如。G您可以使用函数式的方式,但我还没有摆弄过其他的Prolog实现。它只能在Visual Prolog(Prolog=动态类型,有时是[动态]编译语言,Visual Prolog=静态类型,静态编译,语法上类似于Prolog的语言。“Proskell++”;-)上工作。通常,“子句”中的内容会进入源文件(或得到断言),并且目标会以交互方式被询问或被某些人调用。Rest是标准Prolog无法识别的类型声明。SWI PROLO已经将[4]类型作为目标,继续调整(除非您想要C++类的性能和Windows(仅面向)的实现= Visual Prolog)。SWI Prolog似乎有功能编程(高阶函数)的元素,对吗?@亚西尔:是的,它有call/N,它可以让你实现像maplist/NCan这样的东西。你能告诉我为什么要限制内置的使用吗?可移植性?出于实际原因,可移植性。对于不太实际的学生来说,这是一个很好的学习练习。
sum_list([], []).
sum_list([[A,B]|Rest], [Current|RestResult]) :-
      Current is A + B,
      sum_list(Rest, RestResult).

?- sum_list( [[1,2],[3,4],[5,6]], X ).
X = [3, 7, 11].