Prolog计算知识库

nos*_*rck 4 count prolog

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

number(1).
number(3).
number(6).
number(8).
number(9).
number(12).
Run Code Online (Sandbox Code Playgroud)

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

countnumbers(X).
X = 6.
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?拜托,我是prolog的新手,我无法弄清楚这一点

twi*_*rer 8

用于findall/3从数据库中获取所有事实,然后获取列表的长度:

countnumbers(X) :-
    findall(N, number(N), Ns),
    length(Ns, X).
Run Code Online (Sandbox Code Playgroud)

注意:number/1可能是内置的谓词.


ДМИ*_*КОВ 8

如果你需要知道有多少X满足某些谓词,你不需要知道所有这些谓词.使用of 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 ).
Run Code Online (Sandbox Code Playgroud)

X^意思是"存在X",所以整个公式意味着"计算数字X numberr(X)并调用该数字" Numbers.

所以

?- countNumbers(X).
X = 6.
Run Code Online (Sandbox Code Playgroud)