Aggregates聚合语法
About 4 min
Aggregates聚合语法
Aggregate就是一些在集合上执行的函数,集合通常是依照某些条件构建出来的。
规则体中的aggregates
基本形式为:
其中,
由于是集合,所以
r(X) :- #sum{1:a; 1:b} = X.
a.
b.
它只有一个回答集:a b r(1)
。
值得区分的是,何时要将条件放在Aggregate中,何时要放在外面。下面的程序:
a(1).
b(1..2).
x(M, N):- a(M), N=1.
x(M, N):- b(M), N=2.
r(X) :- X = #count{M,N : x(M,N)}, b(N).
#show r/1.
回答集是r(1) r(2)
。它表示当b(N)
成立时,X
等于满足x(M,N)
的元组(M,N)
的个数。而把b(N)
移到里面:
a(1).
b(1..2).
x(M, N):- a(M), N=1.
x(M, N):- b(M), N=2.
r(X) :- X = #count{M,N : x(M,N), b(N)}.
#show r/1.
回答集是r(3)
。它表示X
等于满足x(M,N)
且b(N)
的元组(M,N)
的个数,显然有(1,1)(1,2)(2,2)
三个。
允许使用的函数#count
, #sum
, #sum+
, #min
, #max
。当
r(X) :- #sum{1:a; 1:b} = X.
a.
b.
和
r(X) :- #sum{1,1:a; 1,2:b} = X.
a.
b.
后者的回答集是a b r(2)
。
规则头中的aggregates
基本形式为:
其中的
1=#count{1:a;2:b;3:c}.
它有三个回答集:a
,b
,和c
。注意这个例子中
5=#sum{1:a;2:b;3:c;4:d}.
它的回答集是c b
和d a
。而
5=#sum{1:a;2:b;3:c;4:d:x}.
:- x.
的回答集只有c b
一个了,这个例子展示了
缩略语法
可以被省略,默认为#count
。 和 可以被省略。对于规则体中的aggregates来说同时省略二者没有意义(会使整个aggregate恒真),对于规则头中的来说相当于没有任何限制(即任意选择),此时一般也会省略 ,因为除了#count
以外的 也没有意义。 和 可以被省略(不省略 和/或 ),此时默认为 。- 当
是#count
(或者省略)时, 可以被省略。- 对于规则头中的aggregates,省略
会使gringo在grounding时自动生成形如 的 。其中 是 中 的数量, 是 中的Atom。这样的组合唯一地编码了一个 (因为单纯的 并不能作为 使用,其中可能含有否定) - 对于规则体中的aggregates,形如
的aggregate代表 ,其中的 根据 自动产生,产生规则同规则头中的aggregates。
- 对于规则头中的aggregates,省略
- 对于规则头中的aggregates,当
为空时可以省略 。
根据以上缩略语法,有一种常用的写法为:
{a;b}.
它利用了上面的第1、2、4、5条缩略语法。根据第1、2条缩略语法,它代表了从集合中选择任意个元素,该规则都可以被满足。根据第4、5条缩略语法,很明显这里的a
和b
都是中间项(空)
、a
、b
、a b
四个回答集。这样的语法可以给出集合中任意个项的所有组合。