私は Dafny を使用して、あなたが受け取る削除メソッドを作成しています:
文字配列
line
配列の長さ
l
位置
at
削除する文字数
p
最初に at から to までの行の文字を削除し、次にtoat + p
の右側のすべての文字を移動する必要があります。at + p
at
たとえば、[e][s][p][e][r][m][a]
、 、at = 3
、およびp = 3
がある場合、最終結果は次のようになります。[e][s][p][a]
私は次のような意味のある事後条件を証明しようとしています:
ensures forall j :: (at<=j<l) ==> line[j] == old(line[j+p]);
at + p の右側からのすべての文字が新しい位置にあることを確認します。
しかし、Dafny は 2 つのエラーを出力します。
範囲外のインデックス 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;
}
}