【发布时间】:2014-05-13 04:34:02
【问题描述】:
我在学习时正在使用 SWI-Prolog 解决示例问题。我已经到了这个问题的最后一部分,我必须递归地(我希望)比较包含“研究人员”结构的列表的元素,以确定研究人员是否具有相同的姓氏,如果有,则返回 Forename和该列表的组长的姓氏。
只有一个列表符合此条件,它有四个成员,都具有相同的姓氏。但是,正确答案会返回四次。我觉得我的解决方案不优雅而且缺乏。问题来了:
以下 Prolog 数据库代表学科教学团队。
% A research group structure takes the form
% group(Crew, Leader, Assistant_leader).
%
% Crew is a list of researcher structures,
% but excludes the researcher structures for Leader
% and Assistant_leader.
%
% researcher structures take the form
% researcher(Surname, First_name, expertise(Level, Area)).
group([researcher(giles,will,expertise(3,engineering)),
researcher(ford,bertha,expertise(2,computing))],
researcher(mcelvey,bob,expertise(5,biology)),
researcher(pike,michelle,expertise(4,physics))).
group([researcher(davis,owen,expertise(4,mathematics)),
researcher(raleigh,sophie,expertise(4,physics))],
researcher(beattie,katy,expertise(5,engineering)),
researcher(deane,fergus,expertise(4,chemistry))).
group([researcher(hardy,dan,expertise(4,biology))],
researcher(mellon,paul,expertise(4,computing)),
researcher(halls,antonia,expertise(3,physics))).
group([researcher(doone,pat,expertise(2,computing)),
researcher(doone,burt,expertise(5,computing)),
researcher(doone,celia,expertise(4,computing)),
researcher(doone,norma,expertise(2,computing))],
researcher(maine,jack,expertise(3,biology)),
researcher(havilland,olive,expertise(5,chemistry))).
鉴于此信息,编写可用于返回以下内容的 Prolog 规则(以及所需的任何其他谓词):
船员人数超过一人且姓氏相同的任何领导的名字和姓氏。 [4 分]
这是我目前使用递归的解决方案,尽管对于列表的每个成员来说它不必要地低效,它将该成员与其他所有成员进行比较。因此,由于正确的列表有四个成员,它会返回 'jack maine' 四次。
surname(researcher(S,_,_),S).
checkSurname([],Surname):-
Surname==Surname. % base case
checkSurname([Researcher|List],Surname):-
surname(Researcher,SameSurname),
Surname == SameSurname,
checkSurname(List,SameSurname).
q4(Forename,Surname):-
group(Crew,researcher(Surname,Forename,_),_),
length(Crew,Length),
Length > 1,
member(researcher(SameSurname,_,_),Crew),
checkSurname(Crew,SameSurname).
如果没有重复的结果,并且每次都不需要将每个成员与其他每个成员进行冗余比较,我怎么能做到这一点?对于我采取的每一种方法,我每次都被 'SameSurname' 保留为单例,因此不得不在 q4 谓词中强制使用它两次。
电流输出
13 ?- q4(X,Y).
X = jack,
Y = maine ; x4
【问题讨论】:
-
?- q4(X,Y), !.呢? -
@User 你意识到丢弃选择点作为你不完全理解的副作用不是很干净?
标签: prolog