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].