开发者

A prolog assignment which uses lists

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:

phon开发者_如何学Goes(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.


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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜