如何在不使用递归的情况下访问列表的前两个元素?

时间:2014-04-09 14:08:45

标签: prolog

如何在不使用递归的情况下访问列表的前两个元素?

例如:如果我有一个列表(X1,X2,X3,X4,X5)

我想做X1 * X2 + X2 * X3 + X3 * X4 + X4 * X5 + X5 * X1

是正确的吗?

List([X|Y,List],Sum):-  ListAcc([Y,List],0,Sum).
ListAcc([X|Y,List],Acc,Sum):-NewAcc is Acc+ X*Y, ListAcc([Y,List],NewAcc,Sum).
ListAcc[[],Acc,Sum).
那是合法的吗? (而且我不确定如何添加(X5 * X1)的总和

2 个答案:

答案 0 :(得分:2)

要像这样访问列表的前两个元素

?- L = [a,b,c,d], [X,Y|Rest] = L.
L = [a, b, c, d],
X = a,
Y = b,
Rest = [c, d].

关于你的第二个问题:

  • Prolog谓词必须以非大写字母开头:List应为list
  • 在最后一条规则中,解决方案必须与累加器统一:listAcc([],Sum, Sum),但我认为在这种情况下,对于包含单个元素的列表,您应该有一个特殊规则。
  • 您需要传递列表的第一个元素,直到到达最后一个元素。也许,您的谓词应该如下所示:listAcc(+NumbersLeft, +First, +Acc, -Sum)
  • 请注意特定情况:包含单个元素的列表。列表[X1]的总和应为0或X1*X1

答案 1 :(得分:0)

使这一点与众不同的是,你必须记住第一项,将它与最后一项相乘。

ListAcc([H1, H2|T], Sum) :-
    # We need to remember the first element.
    ListAcc([H1,H2|T], Sum, H1).

ListAcc([Hz|[]], Sum, H1) :-
    # We reached the last element, 
    # so we multiply with the first element which we rememebered.
    Sum is H1 * Hz.

ListAcc([H1, H2|T], Sum, H) :-
    # We calculate the listacc of the rest...
    ListAcc([H2|T], Sum1, H),
    # ...then we add the product of the first and the second element.
    Sum is Sum1 + H1 * H2.