2015-01-08 75 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不要綁定變量目標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)。