2017-01-13 3 views
1
% 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)). 

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))]). 

Мне была предоставлена ​​база данных выше (я не копировал все записи людей, как это было бы слишком долго).Запрос на знание Prolog

Меня попросили получить фамилию любого вице-капитана, в команду которого входит капитан или член регулярной команды, чья специальность - наука.

Я могу получить фамилию вице-капитанов, используя приведенный ниже код, но я не могу вернуть только те команды, которые включают капитана или членов регулярной команды, специальность которых - наука. Что мне нужно добавить, чтобы сделать это?

part_two(Surname):- 
    team(_,player(_,Surname,_),_). 

Я также попросил, чтобы также получить имя и фамилию любого капитана, чьи регулярные члены группы насчитывают более одного, и кто все имеют одинаковые фамилии.

Это моя попытка до сих пор:

part_three(First_name,Surname):- 
    team(Captain,_,Regular_team_members), 
    first_name(Captain,First_name), 
    surname(Captain,Surname), 
    Regular_team_members=[_,_|_]. 

Мне просто нужно, чтобы исключить детали этих капитанов, чьи регулярные члены команды не все имеют одинаковую фамилию.

+0

Если первые 2 команды являются капитаном и вице-капитаном автоматически, как команда не может содержать капитана? – BitTickler

+0

@BitTickler Я просто пропустил детали капитана, поскольку мне нужны были только детали вице-капитана. – Dazzler95

ответ

3
part_two(Surname):- 
    team(Captain, Vice_captain, Regular_team_members), 
    surname(Vice_captain, Surname), 
    member(Player, [Captain|Regular_team_members]), 
    specialty(Player, science). 

% 'abstract data structures' accessors 
surname(player(_First_name, Surname, _Details), Surname). 
specialty(player(_First_name, _Surname, details(Speciality, _Recent_score)), Speciality). 

Поскольку вы все равно собираетесь отсканировать список Regular_team_members, ищите подходящее ограничение, вы можете получить более простую «программу», сначала «присоединяющуюся» к Captain другим игрокам.

+0

Ваше решение отлично работало. Ваш метод использования аксессуаров определенно пригодится для других вопросов. Огромное спасибо! – Dazzler95

+0

Я поставил второй вопрос выше. Не могли бы вы помочь мне закончить его? – Dazzler95

+0

вы можете использовать '..., Regular_team_members = [_, _ | _], setof (S, (член (P, Regular_team_members), фамилия (P, S)), [_])' – CapelliC

1

Вы можете немного изменить то, что вы уже написали следующее:

part_two(Surname):- 
    team(P,player(_,Surname,_),L), 
    (P=player(_,_,details(science,_)) -> true ; member(player(_,_,details(science,_)),L)). 

Пример:

База данных:

team(player(niall,elliott,details(history,11)), 
    player(michelle,cartwright,details(fashion,19)), 
      [player(peter,lawlor,details(history,12)), 
      player(louise,boyle,details(current_affairs,17))]). 


team(player(niall1,elliott1,details(science,11)), 
    player(michelle1,cartwright1,details(fashion,19)), 
      [player(peter,lawlor,details(history,12)), 
      player(louise,boyle,details(current_affairs,17))]). 

team(player(niall2,elliott2,details(history,11)), 
    player(michelle2,cartwright2,details(fashion,19)), 
      [player(peter,lawlor,details(science,12)), 
      player(louise,boyle,details(current_affairs,17))]). 



team(player(niall3,elliott3,details(science,11)), 
    player(michelle3,cartwright3,details(fashion,19)), 
      [player(peter,lawlor,details(science,12)), 
      player(louise,boyle,details(current_affairs,17))]). 

Теперь запрашивая:

?- part_two(X). 
X = cartwright1 ; 
X = cartwright2 ; 
X = cartwright3. 
+0

Спасибо, ваше решение также сработало. – Dazzler95

+0

Добро пожаловать! рад помочь!!! – coder

+0

Я поставил второй вопрос выше. Как вы думаете, вы могли бы помочь мне с последней частью? – Dazzler95

Смежные вопросы