【发布时间】:2020-12-08 10:31:43
【问题描述】:
当第一次进入循环时,while 循环中的modifies 子句只计算一次。例如,如果我有一个对象序列并且我对其进行了扩展,但还修改了我在之前的迭代中创建的新元素,Dafny 不会接受它:
class Foo {
var x: int;
constructor()
{
x := 0;
}
}
method main(n: nat)
requires n > 0
{
var first := new Foo();
var arr: seq<Foo> := [first];
var i := 1;
while i < n
modifies set x | x in arr
invariant 0 <= i <= n
invariant |arr| == i
{
arr[i-1].x := i;
var next := new Foo();
arr := arr + [next];
i := i + 1;
}
}
我尝试过使用递归并且它可以工作,但我想使用 while 循环来进行说明。有没有其他方法可以克服这个问题?是否有某种“动态”modifies 子句?
【问题讨论】: