让Rectangle
和Pair
为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的一行中表达这个集合吗?
答案 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)};
}