Prolog列出元素的邻居

时间:2016-03-20 12:01:17

标签: list prolog elements

我在prolog列表中遇到问题。我想这样做:

    [1,2,3,4,5]
    [5,6,9,12,10]

你取一个例如3的数字,你对邻居做一个加号操作,所以操作是2 + 3 + 4 = 9.对于第一个和最后一个元素你假装有一个虚构的那里。

我现在有这个:

sum_list([A,X,B|T], [Xs|Ts]):-
    add(A,X,B,Xs),
    sum_list([X,B|T], Ts).

我没有考虑第一个和最后一个元素。我的问题是,我不知道如何在之前和之后获取元素,然后如何继续前进。

注意:我不允许使用元谓词。

感谢。

1 个答案:

答案 0 :(得分:1)

我不确定你是如何计算前5的。最后10个是4 + 5 +隐式1.但是在计算之后,结果的第一个元素应该是4而不是5?

无论如何,在编写此代码方面,这并不重要。你实际上接近你想要的结果。当然有多种方法可以解决这个问题,但我认为最简单的方法是编写一个小的“初始”案例,在这种情况下,你已经计算了第一个总和,然后递归计算所有其他总和。然后我们可以编写一个案例,其中只剩下2个元素来计算最后一个'特殊'和:

% Initial case for easily distinguishing the first sum
initial([X,Y|T],[Sum|R]) :-
    Sum is X+Y+1,
    others([X,Y|T],R).

% Match on 2 last elements left
others([X,Y],[Sum|[]]) :-
    Sum is X+Y+1.

% Recursively keep adding neighbours
others([X,Y,Z|T],[Sum|R]) :-
    Sum is X+Y+Z,
    others([Y,Z|T],R).

执行:

?- initial([1,2],Result)
   Result = [4,4]

?- initial([1,2,3,4,5],Result)
   Result = [4, 6, 9, 12, 10]

请注意,我们现在还没有任何空列表或仅包含一个元素的列表。如有必要,仍需要对此进行讨论。