我一直试图让列表[1,3]
并在代码中计算其平均值而不输入最少的值。我不确定正确的语法使其工作,只有第一行有问题,因为如果我调用平均值并在运行prolog时输入数字,它的工作完全正常。
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.
答案 0 :(得分:1)
好吧,你不想一直输入列表。这意味着,您应该具有类似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.
顺便说一句,有length/2
谓词,已经内置于swi-prolog中。
答案 1 :(得分:1)
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
中列表平均值的简单方法答案 2 :(得分:0)
你必须遍历列表,使用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 ....