帮助Prolog列表

时间:2010-12-27 23:23:10

标签: list prolog

我是Prolog的新手,正在寻求一些帮助。我想要做的是基本上获得列表的一些列表,如果这是有道理的?洛尔

我想要实现的是......总和([[1,2],[3,4],[5,6]])。应该返回: 列表数量:3 清单1 3 清单2 7 清单3 11 ....等

我可以获得相当简单的列表数,但我不太确定如何循环列表然后为每个列表添加数字。我觉得这比实际上复杂吗?大声笑!

如果有人可以帮助我,或指出我的方向很棒。

提前致谢

3 个答案:

答案 0 :(得分:1)

在SWI-Prolog中,您可以使用maplistsumlist;

?- maplist(sumlist, [[1,2], [3,4], [5,6]], Lengths).
Lengths = [3, 7, 11].

现在你可以按自己喜欢的方式打印Lengths

要了解maplistsumlist的实施方式,请致电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

我想你会理解sumreverse自己的工作方式。

答案 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中测试。