首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog计数知识库

Prolog计数知识库
EN

Stack Overflow用户
提问于 2011-12-14 21:33:51
回答 2查看 5.6K关注 0票数 4

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

代码语言:javascript
复制
number(1).
number(3).
number(6).
number(8).
number(9).
number(12).

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

代码语言:javascript
复制
countnumbers(X).
X = 6.

我该怎么做呢?求求你,我是prolog新手,我搞不懂这个

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-14 21:43:23

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

代码语言:javascript
复制
countnumbers(X) :-
    findall(N, number(N), Ns),
    length(Ns, X).

注意:number/1可能是一个内置的谓词。

票数 8
EN

Stack Overflow用户

发布于 2011-12-14 22:02:28

如果您需要知道有多少X满足了某个谓词,那么您不需要知道所有这些谓词。在这样的任务中,使用findall/3确实是多余的。当你有6或606个这样的X时--当然,这不是什么大问题。但是当你有一个很大很重的生成器时,你不需要把所有的值都保存在列表中,然后计算它的长度。

Aggregate很好地解决了这个问题:

代码语言:javascript
复制
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

所以

代码语言:javascript
复制
?- countNumbers(X).
X = 6.
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8505362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档