我正在使用 Dafny 制作一个删除方法,您会收到:
字符数组
line
数组的长度
l
一个位置
at
要删除的字符数
p
首先从 at to 删除 line 的字符at + p
,然后必须移动at + p
to右边的所有字符at
。
例如,如果您有[e][s][p][e][r][m][a]
, and at = 3
, and p = 3
, 那么最终结果应该是[e][s][p][a]
我试图证明一个有意义的后置条件,例如:
ensures forall j :: (at<=j<l) ==> line[j] == old(line[j+p]);
确保 at + p 右侧的所有字符都在新位置。
但是 Dafny 输出两个错误:
索引超出范围 7 53
后置条件可能不会在此返回路径上成立。19 2
method delete(line:array<char>, l:int, at:int, p:int)
requires line!=null;
requires 0 <= l <= line.Length && p >= 0 && at >= 0;
requires 0 <= at+p <= l;
modifies line;
ensures forall j :: (at<=j<l) ==> line[j] == old(line[j+p]) ;
{
var tempAt:int := at;
var tempAt2:int := at;
var tempPos:int := at+p;
while(tempAt < at + p)
invariant at<=tempAt<=at + p;
{
line[tempAt] := ' ';
tempAt := tempAt + 1;
}
while(tempPos < line.Length && tempAt2 < at + p)
invariant at + p<=tempPos<=line.Length;
invariant at<=tempAt2<=at+p;
{
line[tempAt2] := line[tempPos];
tempAt2 := tempAt2 + 1;
line[tempPos] := ' ';
tempPos := tempPos + 1;
}
}