Kurz gesagt : Was Ihr Lehrer wahrscheinlich gemeint hat, ist, dass die Semantik von while
in den meisten Sprachen ziemlich gleich ist, während sich die Semantik von for
erheblich ändern kann (siehe Diskussion unten). Daher sind abstrakte sprachunabhängige Beweise mit a zuverlässiger while
, aber man sollte darauf achten, dass ein Beweis mit einer Schleife in vielen Sprachen for
möglicherweise nicht mit der Semantik der for
Schleife übereinstimmt .
Ihre Frage ist nicht präzise genug (obwohl dies möglicherweise nicht Ihre Schuld ist).
Der Punkt ist, dass es afaik keine offizielle, ISO-unterstützte Norm oder anderweitig offiziell akzeptierte Referenzdefinition von
for
und while
Schleifen gibt. Die Definition hängt von der Programmiersprache ab.
Daher können Sie keine allgemeine Aussage über ihre Äquivalenz machen, bevor Sie nicht genau definiert haben, was jeder tun kann. Ich spreche das genauer an, da es eines der Hauptargumente ist, die in anderen Antworten verwendet werden (und die Diskussion wird im Folgenden nützlich sein).
Zur Intertranslatierbarkeit von for
und while
Schleifen
Zusammenfassung : Dies hängt von der Programmiersprache ab, ist jedoch immer möglich, solange Sie eine Endlosschleife haben und einen Ausweg finden.
Sie können jedoch eine solche Aussage für eine bestimmte Programmiersprache treffen, und die Antwort hängt von den Merkmalen der Sprache ab.
Das bedeutet auch, dass es keinen allgemeinen Beweis gibt, sondern nur einen für jede Programmiersprache.
Eine Sache, die im Allgemeinen zutrifft, ist, dass eine while
Schleife im Allgemeinen eine for
Schleife imitieren kann , da die while-Schleife die Prüfung der Ausgangsbedingungen der for-Schleife durchführen, die Initialisierung der Steuervariablen mit einer Zuweisung vor dem Eintritt in die Schleife durchführen und die Inkrementierung durchführen kann am Ende des Schleifenkörpers, so dass
for i from 1 by 2 to 10 do { xxx }
wird
i=1
while i≤11 do { xxx; i←i+2 }
Dies funktioniert mehr oder weniger für die meisten Sprachen, ist jedoch nicht so offensichtlich, wie es scheint, und es gibt möglicherweise viele "Details", über die Sie sich Sorgen machen müssen.
In vielen Sprachen for
wertet die Schleife beispielsweise 3 Argumente (Anfangswert, Inkrement und Endwert) als strenge Argumente aus , die einmal vor dem Eintritt in die Schleife ausgewertet werden, während andere dann als Thunk-Argumente verwendet werden , die bei jeder Runde neu bewertet werden sollen, oder möglicherweise als faules Argument , das nur bei erstmaliger Verwendung ausgewertet wird.
Ein weiterer Punkt kann sein, dass die Inkrementvariable lokal für die
for
Schleife sein kann oder eine lokale Variable der Funktion sein muss, in der die Schleife erscheint.
Abhängig von solchen Problemen kann die Übersetzung von a for
in a while
stark variieren, obwohl dies normalerweise möglich ist.
Gleiches gilt für die Umkehrung, bei der a while
in eine for
Schleife übersetzt wird.
Das erste Problem ist, dass eine while
Schleife die Ausgangsbedingung bei jeder Runde immer neu bewertet. Einige for
Schleifen sehen jedoch keine Bedingung vor, die bei jeder Runde neu bewertet wird, außer dem Vergleich der Steuervariablen mit einem festen Wert, der beim Eintritt in die Schleife berechnet wird. Dann ist die Übersetzung nur möglich, wenn es unter anderen Bedingungen ein anderes Mittel gibt, um aus der Schleife zu springen.
Dies ist mit verschiedenen Geräten möglich, wobei normalerweise mit einer bedingten Anweisung begonnen wird, die die Bedingung testet, gefolgt von einem Sprung, der, sofern verfügbar, durch eine Schleifen-Exit-Anweisung, eine return-Anweisung (nach Einkapselung der Schleife in eine Funktion) und eine goto-Anweisung implementiert wird oder eine Ausnahmeerhebung.
Mit anderen Worten, es ist wiederum sehr abhängig von Sprachen und möglicherweise von subtilen Merkmalen von Sprachen.
Wie von @milleniumbug beantwortet , ist die Intertranslation in der Sprache C einfach, da ein for
Lopp im Wesentlichen eine while
Schleife plus etwas Extra für eine inkrementierte Steuervariable ist .
Dies gilt jedoch nicht unbedingt für andere Sprachen und höchstwahrscheinlich nicht auf die gleiche Weise.
Abgesehen davon sollten Programmiersprachen normalerweise nur mit einer dieser Schleifen Turing-Leistung haben, da Sie dafür nur eine Endlosschleife benötigen. Solange Sie also eine Möglichkeit haben, für immer eine Schleife zu erstellen und möglicherweise zu stoppen, sind Sie sich ziemlich sicher, dass Sie jedes andere Konstrukt nachahmen können ... aber nicht unbedingt einfach.
In Bezug auf Beweise
Zusammenfassung : Es ist mir kein Grund bekannt zu behaupten, dass Beweise mit dem einen oder anderen erheblich schwieriger sein sollten (es sei denn, es handelt sich um ein seltsames Merkmal der Sprache).
Es liegt wahrscheinlich ein Missverständnis vor, oder Ihr Lehrer hatte etwas anderes im Sinn.
Die formale Semantik kann für die verschiedenen Arten von Schleifen definiert werden, die in Programmiersprachen definiert sind, und dann zum Nachweis von Eigenschaften verwendet werden.
Abhängig von der Sprache kann es in einigen Fällen komplexer sein, formale Beweise für Programme zu erstellen. Das hängt aber von der Sprache ab.
Ich kann mir keinen Grund vorstellen, warum Beweise bei einem Konstrukt wesentlich schwieriger sein sollten als bei dem anderen. Die for
Schleife kann komplexer sein, da sie wie in C alles bieten kann, was mit einem while
Plus anderer Dinge gemacht wird. Aber wenn Sie es mit a machen würden while
, müssten Sie die Extras in einer anderen Form hinzufügen.
Ich könnte das formale allgemeine Argument der Intertranslatierbarkeit verwenden, solange die Möglichkeit einer einzelnen Endlosschleife besteht. Ich werde dies jedoch unterlassen, da die Konstruktionen nichts sind, mit dem Sie sich in einem Beweis befassen möchten, und es wäre eindeutig eine unfaire Aussage, zumindest in der Praxis.
Nach der obigen Diskussion haben wir jedoch gesehen, dass die Schwierigkeiten für die Intertranslatierbarkeit von der großen Variabilität der for
Schleife von Sprache zu Sprache herrühren. Daher die folgende Schlussfolgerung, die wahrscheinlich die richtige Antwort ist:
Eine Möglichkeit, die Aussage Ihres Lehrers zu verstehen, besteht darin, dass die Semantik der while
Schleife in allen Programmiersprachen ziemlich gleich ist, während die Syntax und Semantik der for
Schleife von Sprache zu Sprache erheblich variieren kann. Daher ist es möglich, allgemeine "abstrakte" Beweise mit while
Schleifen zu erstellen, die weitgehend sprachunabhängige Semantik aufweisen, während dies für die for
Schleife nicht möglich ist, deren Syntax und Semantik sich von Sprache zu Sprache zu stark ändern. Dies gilt jedoch nicht innerhalb einer bestimmten Sprache, wenn die Semantik beider genau definiert ist.
Mein bester Vorschlag ist, dass Sie Ihren Lehrer fragen, was er genau gemeint hat und ob er Ihnen ein Beispiel geben kann. Fehlphrasen oder Missverständnisse sind ein häufiges Ereignis.
for
überwhile
macht einfach keinen Sinn. Es mag einen geben, aber das ist es nicht.