2015-01-08 3 views
0

Это база знаний я работаю с:Суммируя уже выводимый список

localLib('AHorowitz','Stormbreaker',2). 
localLib('AHorowitz','Scorpia',4). 
localLib('AHorowitz','Ark Angel',6). 

Ключ для базы знаний выглядит следующим образом:

localLib(W,B,C) where 
W=Writer 
B=Book 
C=Acknowledgements 

Я хотел бы написать правило что добавляет все подтверждения писателя. Это код, который я написал до сих пор:

getAcknowledgement(W,X):- findall(C,localLib(W,_,C),X). 

Это правило помогает мне перечислить все подтверждения в отдельном списке, например,

?- getAcknowledgement('AHorowitz',X). 
X = [2, 4, 6] 

Я сейчас застрял в том, как добавить эти предметы. Я знаю о sum_list построен в и хотя я знаю, что это не исправить, что я хочу, чтобы достичь это:

getAcknowledgement(W,X):- findall(C,localLib(W,_,C),X). 

sum_list(X,[getAcknowledgement]). 

/* I would like to sum the output that I receive from the first rule above. 
    The KB has been simplified in this example to 3 clauses however in reality 
    there are 1000.*/ 

Как бы я идти об этом, любая помощь будет большим?

+1

'getAcknowledgement (W, X), sum_list (X, S) .' –

+0

Спасибо, я знал, что был почти там! –

ответ

0

Похоже, вы хотите найти количество подтверждений от писателя.

bagof/3 Ваш друг здесь. Это

  • bagof(+Template, :Goal, -Bag)

    Унифицируйте сумка с альтернативами Шаблон. Если Цель имеет свободные переменные, кроме одной обмена с Шаблон, bagof/3 будет возвращаться назад над альтернативами этих свободных переменных, объединяющим сумка с соответствующими альтернативами Шаблон. Конструкция +Var^Goal сообщает bagof/3 не связывать Var в Цель. bagof/3 не работает, если Цель не имеет решений.

findall/3 является

эквивалентно bagof/3 со всеми свободными переменными, связанными с экзистенциальным оператором (^), за исключением того, bagof/3 терпит неудачу, когда Цели не имеет решений.

Итак ... это вы должны получить суммированный подсчет knowledgements для данного писателя, или, если Writer находится в несвязанной, на возвратов, он найдет решения для всех писателей, по одному за раз.

acknowledgements_by_writer(Writer , Acknowledgements) :- 
    bagof(N , local_lib(Writer,_,N) , Ns) , 
    sum_list(Ns,Acknowledgments). 

Если вы хотите, чтобы общее количество подтверждений, что-то вроде этого должно сделать вас

total_acknowledgements (T): - FindAll (N, local_lib (,, N), Ns), sum_list (Ns, T).

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