我在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).
我没有考虑第一个和最后一个元素。我的问题是,我不知道如何在之前和之后获取元素,然后如何继续前进。
注意:我不允许使用元谓词。
感谢。
答案 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]
请注意,我们现在还没有任何空列表或仅包含一个元素的列表。如有必要,仍需要对此进行讨论。