首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询Prolog知识库

查询Prolog知识库
EN

Stack Overflow用户
提问于 2017-01-12 04:58:53
回答 1查看 591关注 0票数 1
代码语言:javascript
复制
% 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数据库:

代码语言:javascript
复制
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,但它总是给我错误。

第二个问题:

我需要得到任何副队长的姓氏,他的球队包括一名队长或一名擅长科学的普通队员。

我可以通过下面的第一行得到副队长的姓氏,但第二部分更棘手。

代码语言:javascript
复制
part_two(Surname):-
team(_,player(_,Surname,_),_),
Regular_player = team(_,_,player(_,_,details(science,_))),
Captain = team(player(_,_,details(science,_),_,_)).
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-12 17:18:09

更详细地描述你尝试了什么以及它是如何失败的会更好,因为(a)有些人不愿意为你做作业,(b)如果我们知道这些误解是什么,我们可以更好地澄清你的误解。

无论如何,Prolog编程都是关于分解问题的。

第一个问题是找出到底存在哪些玩家。球员是球队的队长、副队长或正式队员。这个定义有三个部分,用"or“分隔,这意味着我们需要一个由三个子句组成的谓词:

代码语言:javascript
复制
player(Captain) :-
    team(Captain, _, _).
player(Vice_captain) :-
    team(_, Vice_captain, _).
player(Regular_player) :-
    team(_, _, Regular_members),
    member(Regular_player, Regular_members).

我们可以测试一下:

代码语言:javascript
复制
?- 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)和一些其他目标的谓词,来表达我们感兴趣的属性。这导致了这样的定义:

代码语言:javascript
复制
good_player(First_name, Recent_score) :-
    player(P),
    P = player(First_name, _, details(_, Recent_score)),
    Recent_score > 15.

你可以把它理解为“有一个球员P,名字是First_name,最近的分数是Recent_score,所以最近的分数大于15”。

代码语言:javascript
复制
?- good_player(F, S).
F = michelle,
S = 19 ;
F = louise,
S = 17.
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41600574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档