Schleifeninvariante

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Schleifeninvariante

    Hallo zusammen,
    bin ganz neu hier und auch neu im Informatik-Studium seid ca 1 Monat :)
    Ich habe nun das Problem das ich eine Schleifeninvarinate fuer eine Schleife angeben muss die ich geschrieben habe. Leider verstehe ich aus dem Script, aus Wiki auch nicht wirklich heraus wie man dort am besten vorgeht.
    Und per Suchfunktion hier auch nix :(
    Also im endeffekt ist die Schleifeninvariante doch der Teil einer Schleife der immer gleich ist (Wo das Verhaeltnis immer gleich ist) oder is das falsch?
    Wuerd mich ueber eine Antwort freuen :)

    Gruss Grumsh
  • Das siehst du richtig. Ist auch gar nicht immer (nie?) einfach ihn zu bestimmen, aber da es keinen Algorithmus zum automatischen Bestimmen gibt, ich dir also kaum mehr als in der Wikipedia steht, erzählen kann, würde ich sagen: Poste mal deinen Code und wir versuchen zusammen unser Glück.

    Eine Schleifeninvariante ist die Beziehung zwischen den in einem Programm vorkommenden größten Werte, die vor Eintritt in die Schleife gelten, sowie während der Ausführung unverändert (invariant) bleiben.

    Die Schleifeninvarianten sind das Herzstück des Hoare-Kalküls.

    Zu überlegen, was sich in einer Schleife nicht ändert, ist zunächst ungewohnt, liefert aber meist interessante Einsichten in die zugrundeliegende algorithmische Idee.

    Auffinden geeigneter Invarianten ist anspruchsvoll und zurzeit nicht komplett automatisierbar.
  • Hallo, danke fuer die fixe Antwort :)

    Hier mal meine Methode die eine Zahl quadriert:

    Quellcode

    1. public static int quadrat(int x)
    2. {
    3. int a = 0; //Summe
    4. if (x == 0) return 0; //Abbruch Bedingung
    5. else
    6. {
    7. while (x >= 1)
    8. {
    9. a=a+(2*(x-1))+1;
    10. x--;
    11. }
    12. return a;
    13. }
    14. }
    Alles anzeigen


    Anhand von einem Beispiel was ich gesehen habe und nach bissel Probieren bin ich auf: //INV a == a von x gekommen, aber bin mir total unsicher ob das stimmt.

    Gruss Grumsh
  • Eine Invatriante für i = x wäre z.B. 0 <= x <= i.
    In Worten: x ist endweder gleich dem Startwert oder kleiner (aber nicht negativ).

    Es kommt ja darauf an, was du damit vorhast, um die Korrektheit deines Programmes zu beweisen. Oft ist ein einfacher Algorithmus für das Problem besser geeignet, da die Invariate sonst recht schwer zu finden ist.

    Aber ich sage aus Erfahrung:
    Viel Spaß! :mrgreen:
    Die Japaner glauben jetzt auch, sie könnten den Superrechner verkaufen. Das wäre
    so, als würde man einen Jumbo-Jet nehmen, vorne und hinten die Spitzen absägen,
    davon 10 Stück zusammenschweißen und als ultimativen Super-Jet verkaufen.
  • Reche das doch einfach mal durch.

    DIE Invariante gibt es nicht, es gibt einfach welche, mit denen man zum Ergebnis kommt und welche, mit denen man das nicht schafft.

    Aber eine Gleichheitsaussage über a zu treffen geht vielleicht nicht, da a ja nicht gleich bleibt während eines Schleifendruchlaufes.
    Was wollt ihr mit der Invarianten überhaupt machen?
    Zur Not such in diesem Script einfach mal na Invariante, vielleicht hilft das ja weiter.
    http://ls5-www.cs.uni-dortmund.de/ls5Medien/Dokumente/Lehre/DAP1/skript-dap1-ws0607.pdf
    Die Japaner glauben jetzt auch, sie könnten den Superrechner verkaufen. Das wäre
    so, als würde man einen Jumbo-Jet nehmen, vorne und hinten die Spitzen absägen,
    davon 10 Stück zusammenschweißen und als ultimativen Super-Jet verkaufen.
  • "Max123" schrieb:

    Eine Invatriante für i = x wäre z.B. 0 <= x <= i.
    In Worten: x ist endweder gleich dem Startwert oder kleiner (aber nicht negativ).


    Nein, das stimmt nicht. Der Sinn von Invarianten ist es, Schleifen/Funktionen besser zu verstehen, mit dem Ziel beweisen zu können, das etwas funktioniert oder eine Schleife endet. Deswegen lässt man sich nicht davon verleiten zu gucken was ein Programm eigentlich machen soll (Quadrieren), sondern guckt auf das was sich ändert/was nicht und was vor der Schleife und was nach der Schleife gilt.

    Ums auf den Punkt zu bringen: Wenn ich der Funktion -4 übergebe, wird 0 zurückgeliefert, x bleibt unverändert. Das ist nicht nur falsch, sondern die Invariante von Max123 stimmt nicht. Du wirst eine Fallunterscheidung brauchen, weil sich die Funktion nicht regelmäßig verhält.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • Was mich interessieren würde (ist schon etwas her, seit dem ich das lernen musste):
    Betrachtet man nur die Zählvareable der Schleife oder können alle Vareablen, von denen man innerhalb der Schleife zugreifen kann, betrachtet werden?
    Werden auch Einschränkungen betrachtet, die außerhalb der Schleife für die Vareable festgelegt werden?
    Ist x >= 1 und a >= 0 richtig?