查询Prolog知识库

时间:2017-01-11 20:58:53

标签: prolog

% 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,_),_,_)).

1 个答案:

答案 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