如何计算prolog代码知识库中现有列表的平均值?

如何计算prolog代码知识库中现有列表的平均值?,prolog,Prolog,例如,我一直在尝试创建一个列表[1,3],并在不输入最小值的情况下计算代码内部的平均值。我不确定它的语法是否正确,只有第一行有问题,因为如果我在运行prolog时调用average并输入数字,它工作得非常好 average([1,3],X). average(List, Result) :- sum1(List, Len), sum(List, Sum), Result is Sum / Len. sum([], 0). sum([H|T], Sum) :- sum(T, Temp),

例如,我一直在尝试创建一个列表
[1,3]
,并在不输入最小值的情况下计算代码内部的平均值。我不确定它的语法是否正确,只有第一行有问题,因为如果我在运行prolog时调用average并输入数字,它工作得非常好

average([1,3],X).


average(List, Result) :- sum1(List, Len), sum(List, Sum), Result is Sum / Len.

sum([], 0).

sum([H|T], Sum) :- sum(T, Temp), Sum is Temp + H.


sum1([],0).

sum1([_|B],L):-sum1(B,Ln), L is Ln+1.

您必须遍历列表,使用2个累加器,一个用于求和,一个用于长度,当遍历完成时,计算平均值

  % here the list is not finished
 walk([H|T], AccTT, AccL, Average) :-
     % here you write the code 
     ..................... 
     % next step
     walk(T, NewAccTT, NewAccL, Average).

  % here the list is finished
 walk([], AccTT, AccL, Average) :-
     % here you compute the average         .
     Average is ....

嗯,您不想一直输入列表。这意味着,您应该使用类似于
my_list/1
的谓词,并在程序中使用它

my_list( [1,3] ).

average_easy( List, Avg ) :-
    sum_( List, Sum ),
    length_( List, Length ),
    Avg is Sum / Length.

sum_( [], 0 ).
sum_( [H|T], Sum ) :-
    sum_( T, Temp ),
    Sum is Temp + H.

length_( [], 0 ).
length_( [_|B], L ):-
    length_( B, Ln ),
    L is Ln+1.

main :-
    my_list( X ),
    average_easy( X, Ans ),
    writeln((X, Ans)).
那么,我们现在得到的是

?- [your_program_name].
% your_program_name compiled 0.00 sec, 64 bytes
true.

?- main.
[1,3],2
true.
顺便说一句,swi prolog中已经内置了谓词

avglist(L1,Avg):-sum(L1,0,S),length(L1,0,L),Avg is S/L.

sum([H|T],A,S):-A1 is A+H,sum(T,A1,S).
sum([],A,A).

length([H|T],A,L):-A1 is A+1,length(T,A1,L).
length([],A,A).

这是一种在swi prolog中计算列表平均值的简单方法

您是否可以添加有关解决方案的更多详细信息?初始值为0,然后逐渐将列表中的值相加,当列表中没有更多值时,S取a。类似地,length/3计算列表中的元素数A1递增其值并在每次递归时传递给A的列表。最后,当没有更多元素时,L取L的值。平均值仅为sum/lemgth。