总结已经输出的列表

时间:2015-01-08 15:46:24

标签: prolog logic

这是我正在使用的知识库:

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

答案 0 :(得分:0)

听起来你想找到作家的确认数。

bagof/3是你的朋友。它

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

         

    使用 Template 的替代方案统一 Bag 。如果目标除了一个之外还有自由变量   与模板共享bagof/3将回溯这些免费的替代品   变量,将 Bag Template 的相应替代项统一起来。构造   +Var^Goal告诉bagof/3不要在目标中绑定 Var 。如果目标没有,则bagof/3会失败   的解决方案。

  •   

findall/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)。