配列の領域にシフトしDafny方法の検証:は、私はあなたが受け取るdeleteメソッドを作るためにDafnyを使用してい
char配列
line
配列の長さ
l
位置
at
デルへの文字数ETE
p
まず、あなたは、よりat + p
に行の文字を削除してから、あなたはat
にat + p
の右側のすべての文字を移動する必要があります。
あなたが[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の右側のすべての文字が確実に新しい位置にあるようにする。このリターンパスに保持しない場合があります7 53
事後条件範囲外
がインデックス:
しかしDafnyは、2つのエラーを出力します。 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;
}
}
Here is the program on rise4fun
しかし、これは実際には配列の最後まで+ pからの文字を削除しませんか? @lexicalscope – MMrj
@MMrjは答えを広げました。最も簡単なことは、別のループを追加することです。 – lexicalscope