我正在通过旧考试并尝试检查我的工作。我附上了图片,但文字如下:
我们想扩展一个处理公司员工的程序。
对于每个部门,有一个事实
department(Id, Manager, Groups)
定义了部门Id
的名称, ,其经理的姓名,Manager
,以及构成该部门的工作组或其他部门的列表,Groups
。对于每个工作组,都有一个事实 ,
group(Id, Leader, Participant)
定义Id
了该组的唯一名称 , ,该组Leader
的经理或领导者,以及一个Participant
包含该组成员名称的列表 , 。个人可以是一个或多个工作组的成员,或者“只是”经理。同一个人可以是多个小组/部门的领导或经理。领导者被认为是他们领导的工作组的一部分,而等级较高的经理不会自动成为任何工作组的成员。
例如,程序的数据库可能如下所示:
department( management, knut_billkvist, [administration, factory] ). department( administration, lisa_larsson, [economy, staff] ). department( economy, ahmed_hassan, [billing, budget, project_office] ). department( staff, jenny_bengtsson, [recruitment, health, salaries] ). department( factory, rune_viking, [assembly, testing] ). group( billing, lotta_persson, [anna_nilsson,arne_johnsson] ). group( budget, lena_levin, [kurt_allgen, mona_malm] ). group( project_office, ahmed_hassan, [kurt_allgen, anna_nilsson] ). group( recruitment, lill_nilsson, [annie_cedrell, jonna_spjuth] ). group( salaries, bengt_karlsson, [gullbritt_svensson, siri_hallin] ). group( assembly, rune_runesson, [johnny_kraft] ). group( testing, allan_snygg, [edvin_karlsson, mohammed_tayed] ).
定义这些谓词!
coworker(Name, Department, Group)
如果一个人 ,Name
属于某个部门 ,Department
和某个工作组 ,则为真的谓词Group
, (none
如果该人不属于任何工作组,则使用)。
leader(Name, GroupId)
如果一个人Name
是某个工作组的领导者,则谓词为真GroupId
。
manager(Name, Id)
如果某人是某个部门的经理,Id
或者名称为 的工作组的领导者,则谓词为真Id
。请考虑个人通常可以直接成为工作组的成员,也可以隐含地成为多个级别的部门成员!
我的代码如下:
coworker(Name,Department,Group):-
begot(Name,department(ID,Name,group),Group).
leader(Name,GroupID):-
bagof(Name,Group(ID,Name,Participants),GroupId).
manager(Name,ID):-
setof (Name,Department(ID,Name,Groups),ID)setof (Name,Group(Id,names,participants),GroupId).
我已按照以下建议修改了我的代码:
cowoker(Name,Department,Group) :-
group(Group,Name,Manager).
leader(Name,GroupID) :-
Group(_,Name,GroupID).
manager(Name,ID) :-
department(_,Name,ID),
Group(_,Name,GroupId).