# WHILE-Programm

WHILE-Programme spielen in der Theoretischen Informatik eine Rolle, insbesondere in Zusammenhang mit Berechenbarkeit.

## Eigenschaften

* RAM-berechenbar, Turing-berechenbar, GOTO-berechenbar und WHILE-berechenbar sind äquivalent
* LOOP-berechenbar $\varsubsetneq$ WHILE-berechenbar
* Kleenesche Normalform (Jedes WHILE-Programm kommt auch nur mit einer While-Schleife aus)

## Syntax

WHILE-Programme haben folgende Syntax in modifizierter Backus-Naur-Form:
${\begin{array}{lrl}P&::=&x_{i}:=x_{j}+c\\&|&x_{i}:=x_{j}-c\\&|&P;P\\&|&\mathrm {LOOP} \,x_{i}\,\mathrm {DO} \,P\,\mathrm {END} \\&|&\mathrm {WHILE} \,x_{i}\neq 0\,\mathrm {DO} \,P\,\mathrm {END} \end{array}}$
Auf das LOOP-Konstrukt in dieser Definition kann auch verzichtet werden, ohne dass die Menge der WHILE-berechenbaren Funktionen kleiner wird. Schließlich kann jeder LOOP-Ausdruck durch ein WHILE emuliert werden. Allerdings hat ein Verzicht auf das LOOP zur Folge, dass nicht mehr alle WHILE-Programme in Kleenesche Normalform gebracht werden können.

### Erklärung der Syntax

Ein WHILE-Programm P besteht aus den Symbolen WHILE, LOOP, DO, END, :=, +, -, ;, $\neq$, einer Anzahl Variablen $x_{1},x_{2},...$ sowie beliebigen Konstanten c.
Es sind nur vier verschiedene Anweisungen erlaubt, nämlich
* die Zuweisung einer Variablen durch eine weitere Variable, vermehrt um eine Konstante, etwa
       $x_{3}:=x_{4}+10$
* oder vermindert um eine Konstante, etwa
       $x_{5}:=x_{6}-300$
* eine LOOP-Anweisung, die zu Beginn den Wert einer Variablen überprüft und ein WHILE-Programm entsprechend oft wiederholt, etwa
       $\mathrm {LOOP} \quad x_{7}\quad \mathrm {DO} \quad x_{7}:=x_{7}+1\quad \mathrm {END}$
Zu beachten ist, dass bei LOOP eine Änderung des Variablenwertes im zu wiederholenden Teilprogramm keine Auswirkung auf die Anzahl der Wiederholungen dieses Teilprogramms hat.
* eine WHILE-Anweisung, die eine Variable auf ungleich Null abfragt und ein WHILE-Programm zwischen DO und END enthält, etwa
       $\mathrm {WHILE} \quad x_{8}\neq 0\quad \mathrm {DO} \quad x_{8}:=x_{8}+1\quad \mathrm {END}$
Die Anweisungen sind für sich genommen bereits vollständige WHILE-Programme. Des Weiteren ist die
* Aneinanderreihung von WHILE-Programmen, jeweils getrennt durch ein Semikolon, etwa
       $x_{9}:=x_{9}+3;\quad x_{10}:=x_{9}-2$
wieder ein WHILE-Programm.

### Allgemein

Jede WHILE-berechenbare Funktion ist GOTO-berechenbar und umgekehrt sowie turingberechenbar.
Mit $\mathrm {WHILE}$ wird ferner die Menge aller WHILE-Programme gemäß obiger Definition bezeichnet.

## Kleenesche Normalform für WHILE-Programme

Jede WHILE-berechenbare Funktion kann durch ein WHILE-Programm mit nur einer WHILE-Schleife berechnet werden.
Beweis: Sei $P$ ein beliebiges WHILE-Programm. Wir formen $P$ zunächst, wie im Abschnitt „Simulation durch GOTO-Programme“ dieses Artikels beschrieben, um, um ein äquivalentes GOTO-Programm $P'$ zu erhalten. Anschließend formen wir $P'$ den Anweisungen im Abschnitt „Simulation durch WHILE-Programm“ im Artikel GOTO-Programm folgend in ein äquivalentes WHILE-Programm $P''$ um. Hierbei ist zu beachten, dass die für diese Konstruktion notwendigen IF THEN END Anweisungen durch LOOPs simuliert werden können. Per Konstruktion hat $P''$ nur eine WHILE-Schleife.

## Konsequenzen

Die einfach beweisbare Tatsache, dass jedes GOTO-Programm in ein WHILE-Programm überführt werden kann und umgekehrt, hat zur Konsequenz, dass man beweisen kann, dass ein beliebiges Pascal-Programm die gleichen Leistungen erbringen kann wie ein beliebiges BASIC-Programm. Außerdem zeigt sie, dass man jedes Programm auch strukturiert programmieren kann, ohne „Spaghetticode“ zu erzeugen.

## Simulation durch GOTO-Programm

Ein jedes WHILE-Programm
    $\mathrm {WHILE} \quad x_{2}\neq 0\quad \mathrm {DO} \quad P\quad \mathrm {END}$
kann durch das folgende GOTO-Programm simuliert werden: