我是Prolog的新手,正在寻求一些帮助。我想要做的是基本上获得列表的一些列表,如果这是有道理的?洛尔
我想要实现的是......总和([[1,2],[3,4],[5,6]])。应该返回: 列表数量:3 清单1 3 清单2 7 清单3 11 ....等
我可以获得相当简单的列表数,但我不太确定如何循环列表然后为每个列表添加数字。我觉得这比实际上复杂吗?大声笑!
如果有人可以帮助我,或指出我的方向很棒。
提前致谢
答案 0 :(得分:1)
在SWI-Prolog中,您可以使用maplist
和sumlist
;
?- maplist(sumlist, [[1,2], [3,4], [5,6]], Lengths).
Lengths = [3, 7, 11].
现在你可以按自己喜欢的方式打印Lengths
。
要了解maplist
和sumlist
的实施方式,请致电listing(maplist)
和listing(sumlist)
。
答案 1 :(得分:0)
只要它是一个初学者问题,我在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
的列表。
在目标中,您调用主谓词mapsum
,为其提供列表中的3个列表,空列表(累加器)和未绑定变量R
;后者将得到结果。
mapsum
检索您在目标中提供的列表的头X
,并评估其(列表)元素的总和,然后创建一个新列表A1
,这是累加器A
和刚刚评估的头的总和的组合,然后它用其余的列表元素(尾部),新的累加器A1
和尚未绑定的变量尾调用自身R
。
当mapsum
接近绑定条件时,当列表(第一个参数)为空时,它会反转列表,并将反向结果绑定到未绑定变量R
。
我想你会理解sum
和reverse
自己的工作方式。
答案 2 :(得分:0)
如果你想限制你使用的内置谓词的数量只是“是”:
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].
在SWI-Prolog中测试。