%Максимум из 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).