我的知识库里有这样的东西:
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的新手,我无法弄清楚这一点
用于findall/3从数据库中获取所有事实,然后获取列表的长度:
countnumbers(X) :-
findall(N, number(N), Ns),
length(Ns, X).
Run Code Online (Sandbox Code Playgroud)
注意:number/1可能是内置的谓词.
如果你需要知道有多少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)
| 归档时间: |
|
| 查看次数: |
4977 次 |
| 最近记录: |