I Dafny bin mit einer Löschmethode zu machen, wo Sie erhalten:Überprüfen eine Dafny Methode, die einen Bereich eines Arrays verschiebt
char-Array
line
die Länge des Arrays
l
eine Position
at
die Anzahl der Zeichen zu del ete
p
Zuerst die Zeichen der Linie von an zu at + p
, löschen und dann müssen Sie alle Zeichen auf der rechten Seite von at + p
-at
bewegen.
Zum Beispiel, wenn Sie [e][s][p][e][r][m][a]
haben, und at = 3
und p = 3
, dann sollte das Endergebnis sein [e][s][p][a]
Ich versuche, eine Nachbedingung zu beweisen, die Sinn macht wie:
ensures forall j :: (at<=j<l) ==> line[j] == old(line[j+p]);
Um sicherzustellen, dass alle Zeichen von rechts von + p in den neuen Positionen sind.
Aber Dafny gibt zwei Fehler:
Index außerhalb des zulässigen Bereichs 7 53
Nachbedingung möglicherweise nicht auf diesem Rückpfad halten. 2 19
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
Aber das löscht tatsächlich nicht die Zeichen von at + p bis zum Ende des Arrays? @lexicalscope – MMrj
@MMrj haben die Antwort erweitert. Am einfachsten ist es, eine weitere Schleife hinzuzufügen. – lexicalscope