使用列表的序言分配

时间:2011-10-12 11:37:47

标签: prolog

我的作业让我发疯了......这是作业:

公司内部人员的以下联系方式如下:

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

在Prolog中定义谓词,允许回答以下问题:

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 个答案:

答案 0 :(得分:1)

您可以使用元谓词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).