Prolog计算知识库

时间:2011-12-14 13:33:51

标签: count prolog

我的知识库中有这样的东西:

number(1).
number(3).
number(6).
number(8).
number(9).
number(12).

现在,我需要一个谓词来评估知识库中有多少个数字,例如:

countnumbers(X).
X = 6.

我该怎么做?拜托,我是prolog的新手,我无法弄明白

2 个答案:

答案 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.