% A quiz team structure takes the form:
% team(Captain, Vice_captain, Regular_team_members).
% Captain and Vice_captain are player structures;
% Regular_team_members is a list of player structures.
% player structures take the form:
% player(First_name, Surname, details(Speciality,Recent_score)).
我已获得以下Prolog数据库:
team(player(niall,elliott,details(history,11)),
player(michelle,cartwright,details(fashion,19)),
[player(peter,lawlor,details(science,12)),
player(louise,boyle,details(current_affairs,17))
]
).
获得最近得分超过15的所有玩家的名字和最近得分所需的代码是什么?
我尝试使用exists但它一直给我错误。
第二个问题:
我需要得到任何副队长的姓氏,他的团队包括一名队长或一名常规团队成员,他的专长是科学。
我可以通过使用下面的第一行获得副队长的姓氏,但第二部分更棘手。
part_two(Surname):-
team(_,player(_,Surname,_),_),
Regular_player = team(_,_,player(_,_,details(science,_))),
Captain = team(player(_,_,details(science,_),_,_)).
答案 0 :(得分:2)
更详细地说明您尝试过的内容以及它的工作原理会更好,因为(a)有些人不愿意为您做作业,(b)如果有问题,我们可以更好地解决您的误解。我们知道那些误解是什么。
无论如何,Prolog编程就是要解决问题。
第一个问题是找出哪些球员存在。球员是队长或队副队长或常规队员。这个定义有三个部分用"或"分隔,这表明我们需要一个由三个子句组成的谓词:
player(Captain) :-
team(Captain, _, _).
player(Vice_captain) :-
team(_, Vice_captain, _).
player(Regular_player) :-
team(_, _, Regular_members),
member(Regular_player, Regular_members).
我们可以测试一下:
?- player(P).
P = player(niall, elliott, details(history, 11)) ;
P = player(michelle, cartwright, details(fashion, 19)) ;
P = player(peter, lawlor, details(science, 12)) ;
P = player(louise, boyle, details(current_affairs, 17)).
现在我们想要识别出优秀的玩家"。你写道,你已经尝试过使用exists"。 Prolog中没有exists
,也不需要它。为了表达类似于"类似于...... {#1}}的玩家,我们只定义一个包含目标P
的谓词和其他一些表达我们属性的目标感兴趣。这导致了这样的定义:
player(P)
您可以将其视为"有一个名为good_player(First_name, Recent_score) :-
player(P),
P = player(First_name, _, details(_, Recent_score)),
Recent_score > 15.
且最近得分为P
的玩家First_name
,以便最近得分大于15"。
Recent_score