我一直致力于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]
我该怎么办?
答案 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].