Dafny 函数返回一组点
Dafny function returning a set of points
设 Rectangle
和 Pair
为定义如下的 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)};
}
设 Rectangle
和 Pair
为定义如下的 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)};
}