Angajați pe departament — 3 interogări findall
Fie următoarea bază de cunoștințe, definită de predicatele:
employee_info(Name, DepartmentNumber, Scale)department(DepartmentNumber, DepartmentName)salary(Scale, Amount)
a) Determinați toți angajații din departamentul 1 și care au Scale > 2.
?- employee_info(Name, DepartmentNumber, Scale), DepartmentNumber = 1, Scale > 2.
Acum, puneți toate aceste rezultate într-o singură listă.
b) Determinați toți angajații dintr-un anumit departament.
c) Selectați Name și Scale al angajaților din departamentul 1 cu Scale > 3.
Hint: trei apeluri separate la
findall/3cu diferite constrângeri înGoal.
Te-ai blocat?
editor
soluție
employee_info(mcardon,1,5).
employee_info(treeman,2,3).
employee_info(chapman,1,2).
employee_info(claessen,4,1).
employee_info(petersen,5,8).
employee_info(cohn,1,7).
employee_info(duffy,1,9).
department(1,board).
department(2,human_resources).
department(3,production).
department(4,technical_services).
department(5,administration).
salary(1,1000).
salary(2,1500).
salary(3,2000).
salary(4,2500).
salary(5,3000).
salary(6,3500).
salary(7,4000).
salary(8,4500).
salary(9,5000).
employees_from_department_eq_1_with_scale_gt_2(List) :-
findall(Name,
(employee_info(Name, DepNum, Scale),
DepNum = 1, Scale > 2),
List).
employees_from_department(DepNumber, List) :-
findall(Name,
(employee_info(Name, DepNum, _), DepNum = DepNumber),
List).
employees_from_department_eq_1_with_scale_gt_3(List) :-
findall((Name, Scale),
(employee_info(Name, DepNum, Scale),
DepNum = 1, Scale > 3),
List).
?-
Tastează o interogare (ex. father_of(sandra, X).) și apasă Enter — sau apasă pe un caz de test de mai jos.
Cazuri de test (3 — apasă pe unul ca să îl rulezi, sau Verifică pentru toate)
?
employees_from_department_eq_1_with_scale_gt_2(R).
așteptat: R = [mcardon,cohn,duffy]
?
employees_from_department(1, R).
așteptat: R = [mcardon,chapman,cohn,duffy]
?
employees_from_department_eq_1_with_scale_gt_3(R).
așteptat: R = [(mcardon,5),(cohn,7),(duffy,9)]