我的知识库中有这样的东西:
number(1).
number(3).
number(6).
number(8).
number(9).
number(12).
现在,我需要一个谓词来评估知识库中有多少个数字,例如:
countnumbers(X).
X = 6.
我该怎么做?拜托,我是prolog的新手,我无法弄明白
答案 0 :(得分:8)
使用findall/3
从数据库中获取所有事实,然后获取列表的长度:
countnumbers(X) :-
findall(N, number(N), Ns),
length(Ns, X).
注意:number/1
可能是内置的谓词。
答案 1 :(得分:8)
如果你需要知道有多少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.