%Максимум из 2-х чисел
max(X,Y,Z):-
X >= Y,
Z is X,
!.
max(_,Y,Z):-
Z is Y.
max(X,Y):-
max(X,Y,Z),
write(Z).
%Максимум списка
fmax([],Z,R):-
R is Z.
fmax([H|T],Z,R):-
max(H,Z,Z1),
fmax(T,Z1,R).
fmax([H|T],R):-
fmax([H|T],0,R).
%Удаление всех вхождений элемента
% из списка
removeall([],_,[]).
removeall([X|T],X,L):-
removeall(T,X,L),
!.
removeall([Y|T],X,[Y|L]):-
X=\=Y,
removeall(T,X,L).
%Удаление всех вхождений максимального
% элемента списка
removemax(X,L):-
fmax(X,M),
removeall(X,M,L).
%Нумерация элементов списка
fn([],_,_,_).
fn([H|_],H,N,R):-R is N.
fn([_|T],V,N,R):-
N1 is N+1,
fn(T,V,N1,R).
fn([H|T],V,R):-
fn([H|T],V,1,R).
%Номер максимального элемента списка
fnmax([],_).
fnmax(L,N):-
fmax(L,Z),
fn(L,Z,R),
N is R,
!.
%Среднее арифметическое списка
mean([],0,_,R):-
R is 0,
!.
mean([],S,N,R):-
R is S/N,
!.
mean([X|T],S,N,R):-
X =:= 0,
mean(T,S,N,R),
!.
mean([X|T],S,N,R):-
S1 is S+X,
N1 is N+1,
mean(T,S1,N1,R).
mean([X|T],R):-
mean([X|T],0,0,R).
%Среднее арифметическое списка
% из которого исключены все
% элементы равные максимальному
fmean(L1,R):-
removemax(L1,Z),
mean(Z,R).