% 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,_),_,_)).发布于 2017-01-12 17:18:09
更详细地描述你尝试了什么以及它是如何失败的会更好,因为(a)有些人不愿意为你做作业,(b)如果我们知道这些误解是什么,我们可以更好地澄清你的误解。
无论如何,Prolog编程都是关于分解问题的。
第一个问题是找出到底存在哪些玩家。球员是球队的队长、副队长或正式队员。这个定义有三个部分,用"or“分隔,这意味着我们需要一个由三个子句组成的谓词:
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,也不需要它。为了表达类似于“存在一个玩家P,这样...”这样的东西,我们只定义了一个包含目标player(P)和一些其他目标的谓词,来表达我们感兴趣的属性。这导致了这样的定义:
good_player(First_name, Recent_score) :-
player(P),
P = player(First_name, _, details(_, Recent_score)),
Recent_score > 15.你可以把它理解为“有一个球员P,名字是First_name,最近的分数是Recent_score,所以最近的分数大于15”。
?- good_player(F, S).
F = michelle,
S = 19 ;
F = louise,
S = 17.https://stackoverflow.com/questions/41600574
复制相似问题