0 Daumen
380 Aufrufe

Aufgabe:

Zeigen Sie, dass die definierte Schleifeninvariante in jedem Bereich der gegebenen Schleife gilt:

Vor dem Betreten der Schleife, vor und nach dem Ausfuhren des Rumpfes und nach dem Verlassen der Schleife.

Code:

 @requires field in front of victor is free
  * @ensures victor has moves 1 field forward
  * @loop_invariant victor visited i field
  * @decreasing 5-i

private void multiMove(Integer times) {
  for(int i = 0 ;i < 5; i++)
  victor.move();


Ansatz/Problem:

Ich dachte, dass durch die requires und ensure bereits festgelegt wird, dass vor und nach der Ausführung die Vorausssetzungen gegeben sind. In diesem Fall wäre es ja solange ein Feld vor victor frei ist kann er sich fortbewegen.

Avatar von

1 Antwort

0 Daumen

Antwort mit KI erzeugt

Java Schleifeninvariante beweisen

Um die gegebene Schleifeninvariante zu beweisen, müssen wir sicherstellen, dass sie vor dem Betreten der Schleife, vor und nach der Ausführung des Schleifenrumpfes und nach dem Verlassen der Schleife gilt.

Die Schleifeninvariante lautet: "victor hat \(i\) Felder besucht".

Der Codeausschnitt sieht wie folgt aus:

java
private void multiMove(Integer times) {
    for(int i = 0; i < 5; i++)
        victor.move();
}


Vor dem Betreten der Schleife

Bevor die Schleife beginnt, ist \(i=0\). Das bedeutet, victor hat sich noch nicht bewegt, also \(0\) Felder besucht. Die Schleifeninvariante "victor hat \(i\) Felder besucht" gilt also, da \(i\) zu diesem Zeitpunkt \(0\) ist und victor \(0\) Felder besucht hat.

Vor dem Ausführen des Rumpfes

Nehmen wir an, dass \(i = k\) für ein beliebiges \(k\) vor dem Ausführen des Schleifenrumpfes. Das bedeutet, laut unserer Annahme und der Schleifeninvariante, dass victor bereits \(k\) Felder besucht hat. Zu diesem Zeitpunkt gilt also die Schleifeninvariante für den Wert \(i=k\).

Nach dem Ausführen des Rumpfes

Nach der Ausführung von victor.move(); innerhalb der Schleife hat sich victor ein weiteres Feld bewegt, was bedeutet, dass er nun \(k+1\) Felder besucht hat, da er bereits \(k\) Felder besucht hatte, bevor die aktuelle Iteration des Schleifenrumpfes ausgeführt wurde. Da \(i\) um 1 erhöht wird nach jeder Iteration (\(i++\)), gilt nach dem Ausführen des Schleifenrumpfes, dass \(i = k+1\) und victor \(k+1\) Felder besucht hat. Somit bleibt die Schleifeninvariante erfüllt.

Nach dem Verlassen der Schleife

Die Schleife terminiert, wenn \(i = 5\). Zu diesem Zeitpunkt hat victor insgesamt \(5\) Felder besucht, was mit unserer Schleifeninvariante übereinstimmt, da \(i = 5\) und die Anzahl der von victor besuchten Felder ebenfalls \(5\) ist.

Zusammenfassung

Die Schleifeninvariante "victor hat \(i\) Felder besucht" gilt zu jedem relevanten Zeitpunkt:
- vor Betreten der Schleife (victor hat \(0\) Felder besucht, \(i=0\)),
- vor und nach der Ausführung des Schleifenrumpfes (victor besucht ein weiteres Feld in jeder Iteration, was mit dem Wert von \(i\) in der Schleife übereinstimmt),
- und nach Verlassen der Schleife (victor hat \(5\) Felder in \(5\) Iterationen besucht, \(i=5\)).

Damit ist gezeigt, dass die Schleifeninvariante in jedem Abschnitt der Schleife gilt.
Avatar von

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community