Dafny 函数返回一组点

Dafny function returning a set of points

RectanglePair 为定义如下的 Dafny 数据类型:

datatype Rectangle = rect(pos: Pair, width: int, height: int)
datatype Pair = pair(x: int, y: int)

这个矩形的一个数学 abstraction/representation(我想用 Dafny 编写)是这个矩形包含的所有点 (i,j) 的集合。例如矩形 rect(pos:(5,5), width=2, height=3) 表示点集:{(5,5), (6,5), (7,5), (5, 6), (6,6), (7,6)}

abs成为函数方法(单行方法),returns这个抽象形式set<Pair>,给定Rectangle

类型的变量
function method abs(rect: Rectangle): set<Pair>
{
    //..?
}

有谁知道在 Dafny 中如何用一行表达这个集合?

您的示例似乎交换了我期望的高度和宽度的含义,但这是一个解决方案:

function method abs(rect: Rectangle): set<Pair>
{
    set x:int, y:int | 0 <= x - rect.pos.x < rect.height &&
                       0 <= y - rect.pos.y < rect.width :: pair(x, y)
}

以下引理证明解决方案满足您的测试用例:

lemma lemma_Test()
{
    var r := rect(pair(5, 5), 2, 3);
    var s := abs(r);
    assert s == {pair(5,5), pair(6,5), pair(7,5), pair(5,6),
                 pair(6,6), pair(7,6)};
}