Dafny函数返回一组点

时间:2017-04-24 12:17:57

标签: dafny

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

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

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

abs成为函数方法(一行方法),以set<Pair>的形式返回此抽象,给定Rectangle类型的变量

function method abs(rect: Rectangle): set<Pair>
{
    //..?
}

有人知道如何在Dafny的一行中表达这个集合吗?

1 个答案:

答案 0 :(得分:1)

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

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)};
}