Prolog:相应索引处两个列表中项目的平均值

Prolog: averages of items in two lists at corresponding indices

我正在开发一个 Prolog 程序,该程序将采用两个列表,计算相应索引处元素的平均值,并 returns 将平均值作为列表。

这是我的代码。我收到 is/2: Arguments are not sufficiently instantiated 错误。

sum(H,T,S) :-
   S is H + T.

avelists([],[],_).
avelists([Head|Tail],[Head2|Tail2],[X|Tail3) :-
   X is sum(Head,Head2,A)/2,
   avelists(Tail,Tail2,Tail3).

例如:

?-  avelists([1,4,3],[3,6,5],Xs]).
Xs = [2,5,4].                          % expected result

为什么它不起作用并给我这个错误?在我看来它应该有效。

你的基本子句有问题:当你说

avelists([],[],_).

表示"when two lists are empty, the result is anything"。你想说 "when two lists are empty, the result is empty",即

avelists([],[], []).

你也应该修复

X is sum(Head,Head2,A)/2

因为需要先用sum/3计算A,然后用A计算X

如果您使用单独的谓词来计算总和,则需要在使用其答案之前对其进行评估:

sum(A, B, Sum), Mean is Sum / 2

还有另一个问题

你真正想要的:

list1_list2_means([], [], []).
list1_list2_means([X|Xs], [Y|Ys], [M|Ms]) :-
    M is (X + Y) / 2,
    list1_list2_means(Xs, Ys, Ms).

您还可以通过编写一个求两个数字的平均值的辅助谓词来节省自己的输入时间:

x_y_mean(X, Y, M) :- M is (X + Y) / 2.

然后,您可以简单地使用 maplist:

?- maplist(x_y_mean, L1, L2, Means).

当您可以编写 (A + B) / 2 时,定义 sum/3 谓词没有任何实际好处。如果你不知道你要有多少元素,你可能有这样的东西:

numbers_mean(Ns, M) :-
    length(Ns, Len),
    sum_list(Ns, Sum),
    M is Sum / Len.