0
votes

I have an assignment that's driving me crazy.... Here's the assignment:

The following contacts for people in a company are kept as facts as the followings:

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

Define predicates in Prolog that allow to answer the following question:

1) Which are the possible contacts availiable if you want to phone to any person in a group?

For example:

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

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

What I've done is this:

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


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

However if I do:

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

That is, I only get the contacts for the first person on the list.

Thanks for any help.

1

1 Answers

1
votes

You can use the meta predicate findall to collect the phones for all contacts of an input list:

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

For your example this yields:

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

If you don't want to use builtin predicate you can achieve the same thing using recursive predicates by iterating over all the people and then over every phone for each person, and building a list of contacts along the recursion:

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