employee_average_salary/2
Primind o listă identică celei de la Exercițiul 1, dar cu apariții multiple ale unui angajat (considerând că fiecare intrare reprezintă salariul într-o anumită lună), determinați salariul mediu al fiecărui angajat.
De exemplu, dacă peter apare ca employee_salary(peter, 1000) și employee_salary(peter, 1200), în lista de rezultat va fi doar (peter, 1100).
?- employee_average_salary([employee_salary(peter, 1000), employee_salary(oliver, 1200),
employee_salary(sam, 700), employee_salary(oliver, 800),
employee_salary(sam, 900), employee_salary(sandra, 4500),
employee_salary(peter, 1200), employee_salary(oliver, 400)], Result).
Result = [(peter, 1100), (oliver, 800), (sam, 800), (sandra, 4500)]
Hint: pentru fiecare angajat calculezi suma și numărul de apariții (
sum_and_count_by_name/4), apoi media. După ce ai procesat un angajat, elimini toate intrările lui din listă (remove_by_name/3) și reapelezi pe lista redusă.
Te-ai blocat?
editor
soluție
sum_and_count_by_name(_, [], 0, 0) :- !.
sum_and_count_by_name(Name, [employee_salary(Name, CurrentSalary) | Tail], Sum, Count) :-
sum_and_count_by_name(Name, Tail, SumTail, CountTail),
Sum is SumTail + CurrentSalary,
Count is CountTail + 1, !.
sum_and_count_by_name(Name, [_ | Tail], Sum, Count) :-
sum_and_count_by_name(Name, Tail, Sum, Count).
remove_by_name(_, [], []).
remove_by_name(Name, [employee_salary(Name, _) | Tail], TR) :-
remove_by_name(Name, Tail, TR), !.
remove_by_name(Name, [H | T], [H | TR]) :-
remove_by_name(Name, T, TR).
employee_average_salary([], []) :- !.
employee_average_salary([employee_salary(Name, Salary) | Tail], [(Name, Average) | TR]) :-
sum_and_count_by_name(Name, [employee_salary(Name, Salary) | Tail], Sum, Count),
Average is Sum / Count,
remove_by_name(Name, [employee_salary(Name, Salary) | Tail], NewList),
employee_average_salary(NewList, TR).
?-
Tastează o interogare (ex. father_of(sandra, X).) și apasă Enter — sau apasă pe un caz de test de mai jos.
Cazuri de test (1 — apasă pe unul ca să îl rulezi, sau Verifică pentru toate)
?
employee_average_salary([employee_salary(peter,1000), employee_salary(oliver,1200), employee_salary(sam,700), employee_salary(oliver,800), employee_salary(sam,900), employee_salary(sandra,4500), employee_salary(peter,1200), employee_salary(oliver,400)], R).
așteptat: R = [(peter,1100.0),(oliver,800.0),(sam,800.0),(sandra,4500.0)]