这是我正在使用的知识库:
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.*/
如何做到这一点,任何帮助都会很棒?
答案 0 :(得分:0)
听起来你想找到作家的确认数。
bagof/3
是你的朋友。它
bagof(+Template, :Goal, -Bag)
使用 Template 的替代方案统一 Bag 。如果目标除了一个之外还有自由变量 与模板共享,
bagof/3
将回溯这些免费的替代品 变量,将 Bag 与 Template 的相应替代项统一起来。构造+Var^Goal
告诉bagof/3
不要在目标中绑定 Var 。如果目标没有,则bagof/3
会失败 的解决方案。
相当于
bagof/3
,所有自由变量都与存在运算符(^
)绑定, 除了{em>目标没有解决方案时bagof/3
失败。
所以...这应该可以得到给定作者的知识总和,或者,如果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)。