我的知识库里有这样的东西:
number(1).
number(3).
number(6).
number(8).
number(9).
number(12).现在,我需要一个谓词来评估知识库中有多少个数字,例如:
countnumbers(X).
X = 6.我该怎么做呢?求求你,我是prolog新手,我搞不懂这个
发布于 2011-12-14 21:43:23
使用findall/3从数据库中获取所有事实,然后获取列表的长度:
countnumbers(X) :-
findall(N, number(N), Ns),
length(Ns, X).注意:number/1可能是一个内置的谓词。
发布于 2011-12-14 22:02:28
如果您需要知道有多少X满足了某个谓词,那么您不需要知道所有这些谓词。在这样的任务中,使用findall/3确实是多余的。当你有6或606个这样的X时--当然,这不是什么大问题。但是当你有一个很大很重的生成器时,你不需要把所有的值都保存在列表中,然后计算它的长度。
Aggregate很好地解决了这个问题:
numberr(1).
numberr(3).
numberr(6).
numberr(8).
numberr(9).
numberr(12).
countNumbers( Numbers ) :-
aggregate( count, X^numberr( X ), Numbers ).X^的意思是“存在X",因此整个公式的意思类似于”计算numberr(X)的数字X,并将该数字称为Numbers。
所以
?- countNumbers(X).
X = 6.https://stackoverflow.com/questions/8505362
复制相似问题