我在使用SWI-Prolog学习时正在研究样本问题。这不是一个家庭作业问题,只是通过练习题进行考试修订。
在这个问题中,我有一些提供的结构(部门),其中包含一个列表,我必须找到部门中任何头部馆长的首字母和姓氏,其中包含总共2个或更多具有早期历史或现代历史的工作人员作为他们的专业。
以下Prolog数据库代表博物馆的部门。
% A museum department is represented by the structure:
% dept(Area, Head_curator, Deputy_curator, Floor_staff).
%
% Floor_staff is a (possibly empty) list of staff structures and excludes
% the staff for Head_curator and Deputy_curator.
%
% Structures representing staff take the form:
% staff(Initial, Surname,
% cv(Specialism,Second_specialism,Years_employed)).
... Removed db entries that don't satisfy the question
dept(history,staff(d,steele,cv(early_history,modern_history,40)),
staff(d,owen,cv(modern_history,early_history,35)),
[staff(c,freud,cv(early_history,modern_history,30))]).
我发现很难确定如何确保至少有两位主管或副主任或任何一名职员在早期或现代历史上具有第一或第二专业。我创建了以下规则来提取此信息:
head_curator(X) :- dept(_,X,_,_).
deputy_curator(X) :- dept(_,_,X,_).
floor_staff(X) :- dept(_,_,_,List), member(X,List).
exists(X) :-
head_curator(X);
deputy_curator(X);
floor_staff(X).
first_specialism((staff(_,_,cv(S,_,_,_)),S).
second_specialism((staff(_,_,cv(_,S,_,_)),S).
我已经在下面写了PROLOG,以提取首席策展人的姓氏和姓氏 - 但是,我不确定如何实施一个'计数'确保任何两个人都具备所需的专业性
q2(Initial,Surname) :-
dept(_,HeadCurator,_,List),
% forcing the same dept to be checked
HeadCurator = exists(staff(Initial,Surname,_)),
% check first and second specialisations
% somehow iterate through each person in this dept and
% stop once requirement reaches two people
%
% e.g. (first_specialisation(X) = modern_history;
% first_specialisation(X) = early_history;)
%
% (second_specialisation(X) = modern_history;
% second_specialisation(X) = early_history;)
我试图充实伪代码,概述我试图解决的问题,让你知道我已经考虑过了!我只是不确定如何实施检查:
很多人都有第一或第二专业
一旦两个人决定具有该专业化,则返回真实