Как рассчитать среднее значение существующего списка внутри базы знаний кода пролога? - PullRequest
3 голосов
/ 29 октября 2011

Я, например, пытался получить список [1,3] и вычислить его среднее значение внутри кода, не вводя самого меньшего. Я не уверен в правильном синтаксисе, который заставил бы его работать, проблема только в первой строке, поскольку она прекрасно работает, если я набрал среднее значение и ввел числа при запуске пролога.

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.

Ответы [ 3 ]

1 голос
/ 29 октября 2011

Ну, вы не хотите вводить список все время. Это означает, что вы должны иметь предикат что-то вроде 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-пролог.

1 голос
/ 05 апреля 2015
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

0 голосов
/ 29 октября 2011

Вы должны пройтись по списку, использовать 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 ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...