2015-01-30 2 views
0

Я реализую семейную программу в прологе. У меня есть проблема для реализации некоторых правил.Пролог, у меня есть список структуры, как Извлечь данные и вернуть новый список другой структуры?

первую очередь я реализовать это правило: список

number_of_children_couple(_list):- 
    findall(children(_f,_m,_n),children(_f,_m,_n),_list). 

возврата:

19 ?- number_of_children_couple(_list). 
_list = [children(mordechai, miriam, 1), children(salax, naima, 1), children(eli, bella, 2), children(..., ..., ...)|...]. 

моя проблема заключается в том, как реализовать:

number_of_children_person(_list28,list_person):- 

первый аргумент:

_list28 = _list //the above list ,that return from the rule 

и второй аргумент:

list_person = [children(mordechai, 1), children(salax, 1),children(eli, 2),children(..., ...)|...] 

и я также использовать с:

%_num is number of children for couple 
children(_father,_mother,_num):- 
    couple(_mother,_father), 
    findall(_child,parents(_mother,_father,_child),_children), 
    length1(_children,_num). 

% _num является количество детей для _person

children(_person,_num):- 
    gender(_person,_), 
    findall(_child,parent(_person,_child),_list), 
    length1(_list,_num). 
+2

Для начала FindAll/3, безусловно, не является хорошей идеей. См. «Искусство Пролога» как хороший вводный текст. – false

ответ

0

если то, что вы хотите отбросить аргумент из структуры children/3, можно сделать несколькими способами, тем более простым

number_of_children_person([],[]). 
number_of_children_person([children(A,_,C)|R],[children(A,C)|T]) :- 
    number_of_children_person(R,T). 

или более succintly

number_of_children_person(L3,L2) :- 
    findall(children(A,C), member(children(A,B,C),L3), L2). 
+0

, но я также хочу в списке детей L2 (B, C) не только детей (A, C). –

+0

Я думаю о чем-то вроде этого: 'number_of_children_person (L3, L2): -' findall (дети (A, C), член (дети (A, B, C), L3), L4), findall (дети (B, C), член (дети (A, B, C), L3), L5), conc (L4, L5, L2). –

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