Wir halten fest: WHILE-Programme sind rekursiv definiert. Die folgenden beiden Zeichenketten sind atomare WHILE-Programme für beliebige natürliche Zahlen \(i\), \(j\) und \(c\):
\(x_i := x_j + c\)
\(x_i := x_j - c\)
Für die Subtraktion zweier natürlicher Zahlen \(a\) und \(b\) gilt dabei, dass \(a - b = 0\), falls \(b \geq a\).
Wenn \(P_1\) und \(P_2\) WHILE-Programme sind und \(v\) ein Variablensymbol, dann sind auch die folgenden beiden Zeichenketten WHILE-Programme:
\(P_1;P_2\)
\(\textbf{WHILE } v \neq 0 \textbf{ DO } P_1 \textbf{ END}\)
Wichtig hierbei ist, dass die WHILE-Schleife stets nur auf Ungleichheit zur \(0\) prüft.
In dieser sehr simplen Programmiersprache können wir jetzt kompliziertere Funktionen bauen, zum Beispiel die Addition:
\(x_0 := x_1 + 0;\)
\(\textbf{WHILE } x_2 \neq 0 \textbf{ DO}\)
\( x_0 := x_0 + 1; \)
\( x_2 := x_2 - 1 \)
\(\textbf{END}\)
Zuweisungen von Konstanten, also \(x_i := c\), sind auch nicht direkt möglich. Stattdessen kann man zum Beispiel das folgende Programmschema nehmen:
\(\textbf{WHILE } x_i \neq 0 \textbf{ DO}\)
\( x_i := x_i - 1 \)
\(\textbf{END};\)
\( x_i := x_i + c \)
Dieser Code beschreibt nicht direkt ein WHILE-Programm, da die Indizes der Variablen keine konkreten Werte haben. Er steht allerdings stellvertretend für das Programm, das man erhält, wenn man einen konkreten Wert für \(i\) angibt.
Ebenso können andere, auch komplizierte aritmetische Operationen eingeführt werden, inklusive Relationen wie \(\leq\) und \(\geq\) (wobei wir eine Ausgabe von \(0\) als false interpretieren und alle anderen Werte als true). Auch können wir andere Konstrukte erstellen, zum Beispiel IF-Verzweigungen. Wenn wir \(\textbf{IF } v \neq 0 \textbf{ THEN } P \textbf{ END}\) implementieren wollen, können wir zum Beispiel das folgende Schema bentzen:
\(z := v + 0;\)
\(\textbf{WHILE } z \neq 0 \textbf{ DO}\)
\( P; \)
\( z := 0 \)
\(\textbf{END}\)
Dabei bezeichnen \(z\) und \(v\) wieder Platzhalter, die in einem konkreten Programm mit richtigen Variablen belegt werden müssten.
Wir erlauben uns, IF-Verzweigungen und andere komplexe Operationen im WHILE-Code zu benutzen, und verstehen das als verkürzte Darstellung des (etwas länglichen) tatsächlichen WHILE-Codes (mit entsprechend vorsichtiger Wahl der zusätzlich benötigten Variablen). Man spricht dann auch von Syntactic Sugar.