Prolog - 计算列表中每2个元素的平均值

时间:2015-08-05 03:41:04

标签: list prolog

我一直致力于Prolog任务,其中一个问题让我感到困惑。

问题:定义谓词adjAve(L,Ave),当Ave包含列表L中每个连续两个数的平均值列表时为真。如果列表L包含奇数个元素,则忽略最后一个。

例如,以下查询应该给出以下结果:

?-adjAve([4,6,7,20,9],A).
A=[5.0,13.5].  

目前我有:

 adjAve([X,Y|Tail], Ave) :-
   X \= [], Y \= [],
   Ave is ((X+Y)/2).

目前,当我输入此查询时:

?- adjAve([1,2,3,4,5], X).
X = 1.5.

我得到列表中前两个值的平均值。现在,我如何得到接下来的2个值(3和4)的平均值并显示出来?

我需要为上述查询显示的答案应为:

X = [1.5,3.5]

我该怎么办?

2 个答案:

答案 0 :(得分:3)

这个问题很容易被视为DCG(Definite Clause Grammar)。与@ repeat的答案相同的DCG将是:

avgs([]) --> [] | [_].
avgs([A|As]) --> [X, Y], { A is (X + Y)/2 }, avgs(As).

adjAve(L, A) :-
   phrase(avgs(A), L).

答案 1 :(得分:2)

你走在正确的轨道上!

adjAve([] ,[]).
adjAve([_],[]).              % ignore last singleton item, if present
adjAve([X,Y|XYs],[A|As]) :-
   A is (X+Y)/2,
   adjAve(XYs,As).

示例查询,由OP给出:

?- adjAve([4,6,7,20,9],A).
A = [5, 13.5].               % note: the first average is integer

?- adjAve([1,2,3,4,5], X).
X = [1.5, 3.5].