Dafny 对集合交集函数的定义没有问题。
function method intersection(A: set<int>, B: set<int>): (r: set<int>)
{
set x | x in A && x in B
}
但是当谈到联合时,Dafny 抱怨道,“集合推导必须产生一个有限集合,但 Dafny 的启发式算法无法弄清楚如何为 'x' 产生一组有界值”。A 和 B 是有限的,因此显然联合也是。
function method union(A: set<int>, B: set<int>): (r: set<int>)
{
set x | x in A || x in B
}
是什么解释了这种对初学者来说看似不一致的行为?