
%%%%% Ex 5.1 %%%%%%%%

mostfreq(List,Item) :-
	mostfreq1(List,Occs),
	printf("Occs: %w%n",[Occs]),
	highest(Occs,(Item,_)).


mostfreq1([],[]).
mostfreq1([H|T],Occs) :-
	mostfreq1(T,Occs1),
	pick((H,N),Occs1,Occs2), !,
	N1 is N+1,
	Occs = [(H,N1)|Occs2].
mostfreq1([H|T],Occs) :-
	mostfreq1(T,Occs1),
	Occs = [(H,1)|Occs1].


pick(H,[H|T],T) :- !.
pick(E,[H|T],[H|T1]) :- pick(E,T,T1).


highest([(E,N)],(E,N)) :- !.
highest([(E,N)|T],(E,N)) :- highest(T,(_,N1)), N >= N1, !.
highest([_|T],(E,N)) :- highest(T,(E,N)).


/* another variant using If-Then-Else (If -> Then ; Else)
highest([(E,N)],(E,N)) :- !.
highest([(E,N)|T],(E2,N2)) :-
	highest(T,(E1,N1)),
	(N >= N1 -> (E2,N2) = (E,N) ; (E2,N2) = (E1,N1)).
*/

