Ich weiß, dass in imperativen Programmiersprachen eine while-do-Schleife als Kontrollflusskonstrukt ausreicht, um die Sprache Turing-complete zu machen (was den Kontrollfluss betrifft - natürlich brauchen wir auch unbegrenzten Speicher und bestimmte Operatoren ...) . Der Kern meiner Frage lautet: Hat eine do-while-Schleife die gleiche Rechenleistung wie eine while-do-Schleife? Mit anderen Worten, kann eine Sprache Turing-vollständig sein, wenn es unmöglich ist, Anweisungen vollständig zu überspringen?
Mir ist klar, dass einige der Semantiken hier etwas mehrdeutig sein können. Lassen Sie mich die eigentliche Frage mit einem bestimmten Beispiel formulieren:
Brainfuck (BF) ist ein Turing-Tarpit, bei dem der einzige Kontrollfluss eine while-do-Schleife ist [...]
(am Ende der Frage befindet sich eine vollständige Sprachspezifikation, falls Sie mit Brainfuck nicht vertraut sind). Definieren wir eine neue Sprache BF *, in der ,.+-<>
die gleiche Semantik wie in BF verwendet wird, stattdessen []
jedoch {}
eine do-while-Schleife. Das heißt, der einzige Unterschied zu BF besteht darin, dass jede Schleife mindestens einmal ausgeführt wird, bevor weitere Iterationen übersprungen werden können.
Ist BF * Turing-complete? Wenn ja, würde mich interessieren, wie ich BF in BF * übersetzen könnte. Wenn nicht, wie beweise ich das?
Einige meiner Beobachtungen:
- Nicht jedes BF-Programm kann in BF * übersetzt werden. Beispielsweise ist es unmöglich, ein Programm in BF * zu schreiben, das einen Wert lesen oder nicht lesen oder drucken kann. Wenn das Programm möglicherweise einen oder mehrere Werte druckt, wird immer mindestens einer ausgegeben. Möglicherweise gibt es jedoch eine Turing-vollständige Teilmenge von BF, die in BF * übersetzt werden kann.
- Wir können nicht einfach
[f]
(wof
ist irgendein beliebiges, nur aus Brainfuck bestehendes Programm+-[]<>
) in (in dem Versuch, den Effekt der ersten Iteration aufzuheben) übersetzen, weil a) nicht jede berechenbare Funktion eine berechenbare Inverse hat und b) selbst wenn dies der Fall ist, müßte nicht notwendigerweise weniger Schleifen als so rekursiv diesen Schritt der Anwendung gewährleistet ist nicht in erster Linie zu beenden.f-1{f}
f-1
f
Hier ist ein kurzer Überblick über die Brainfuck-Sprache. Brainfuck arbeitet auf einem unendlichen Band, wobei jede Zelle einen Bytewert enthält, der anfänglich Null ist. Überläufe werden umgangen, sodass eine Erhöhung um 255 0 ergibt und umgekehrt. Die Sprache besteht aus 8 Anweisungen:
+ Increment the current cell.
- Decrement the current cell.
> Move tape head to the right.
< Move tape head to the left.
, Input a character from STDIN into the current cell.
. Output the current cell as a character to STDOUT.
[ If the current cell is zero, jump past the matching ].
] If the current cell is non-zero, jump back to just behind the matching [.
[]
definiert in BF nicht genau eine "while do" -Schleife. Wie in Ihrer Tabelle wird in der linken und rechten Klammer die aktuelle Zellennull / Nichtnull ausgewertet. Wie lautet also die genaue Beschreibung der entsprechenden {}
Klammerbewertungslogik? Schlagen Sie einen weiteren Dialog / eine Diskussion im Computer Science Chat vor . auch deine "Beobachtungen" sind eher wie "Postulate" oder "Sätze" ohne Beweise.
{}
zu machen wäre {
nichts und tun }
das gleiche wie ]
. Ich werde in den nächsten Tagen nicht viel Zeit haben, aber ich werde mich mit Ihnen unterhalten, wenn ich etwas Zeit finde.
{}
und zum Mitnehmen gegeben []
. mit dem Verständnis, dass BF []
ein Konstrukt ist, das nur einer while-do-Schleife in Turing- Gesamtsprachen ähnelt .