Пролог, который использует списки - PullRequest
0 голосов
/ 12 октября 2011

У меня есть задание, которое сводит меня с ума .... Вот задание:

Следующие контакты для людей в компании сохраняются как факты, как следующие:

phones(joao, [home/217777777, mobile91/917777777]).
phones(maria, [work/218888888, mobile93/938888888, mobile91/918888888]).
phones(jose, [home/213333333, mobile91/914444444]).

Определите предикаты в Прологе, которые позволяют ответить на следующий вопрос:

1) Какие возможные контакты доступны, если вы хотите позвонить любому человеку в группе?

Например:

?- all_contacts([joao,jose],ListOfContacts).

ListOfContactss = [home/217777777, mobile91/917777777, home/213333333,mobile91/914444444]

То, что я сделал, это:

all_contacts([],_):-[].


all_contactos([X|T],LIST):-phones(X,LIST),all_contacts(T,Y).

Однако, если я сделаю:

?- all_contactos([jose,maria],LIST_CONTACTS).
LIST_CONTACTS = [casa/213333333, movel91/914444444].

То есть я получаю контакты только от первого лицасписок.

Спасибо за любую помощь.

1 Ответ

1 голос
/ 12 октября 2011

Вы можете использовать мета-предикат findall для сбора телефонов для всех контактов из списка ввода:

all_contacts(People, Contacts):-
  findall(Contact, 
     ( member(Person, People),    % For each person
       phones(Person, LContact),  % get the list of contacts of person
       member(Contact, LContact)  % collect each contact from that list
     ), Contacts).  % Finally gather all contacts in one list

Для вашего примера это дает:

all_contacts([jose,maria],LIST_CONTACTS).
LIST_CONTACTS = [home/213333333, mobile91/914444444, work/218888888, mobile93/938888888, mobile91/918888888].

Если вы не хотите использовать встроенный предикат, вы можете достичь того же, используя рекурсивные предикаты, выполняя итерацию по всем людям, а затем по каждому телефону для каждого человека и создавая список контактов вдоль рекурсии:

all_contacts(People, Contacts):-
  all_contacts(People, [], Contacts).

all_contacts([], Contacts, Contacts).
all_contacts([Person|People], Contacts, NContacts):-
  phones(Person, LContacts),
  all_contacts_person(LContacts, Contacts, MContacts),
  all_contacts(People, MContacts, NContacts).

all_contacts_person([], Contacts, Contacts).
all_contacts_person([Contact|LContacts], Contacts, MContacts):-
  all_contacts_person(LContacts, [Contact|Contacts], MContacts).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...