Stopp-Tester
Die entwickelte Software untersucht letztlich stets eine endliche Menge von Eingaben und prüft, ob die Folge auf Eins endet. Bisher hat man dies für alle Zahlen bis 20·258 (lt. Spiegel 2011) positiv beantworten können. Dennoch könnte schon die nächste Zahl das Programm in eine Endlosschleife führen. Sinnvoll wäre ein Programm, mit dessen Hilfe man für jedes beliebige Programm entscheiden kann, ob es mit jeder beliebigen Eingabe nach endlich vielen Schritten abbricht oder nicht?
Dies dürfte kein Problem sein, da jedes Programm als eine Zeichenkette dargestellt werden kann und damit als Eingabe für das Stopp-Test-Programm dienen kann. Man könnte sogar für Testzwecke das Stopp-Programm selbst als Eingabe nutzen. Die Informatiker nennen dies "Selbstanwendbarkeitsproblem".
Wie kann so ein Algorithmus aussehen?
Sicherlich ist ein bestimmter Programmvorbau notwendig. Da jedoch zum Ende des Algorithmus die Ausgabe der Entscheidung ansteht, hat das - verbal beschrieben - Programm sicherlich folgende Gestalt, wobei stopp eine boolesche Variable ist, die vorher berechnet wurde.
BEGIN
{...}
IF (stopp)
THEN Ausgabe: "Das Programm ist selbststoppend."
ELSE Ausgabe: "Das Programm ist nicht selbststoppend."
END.
Wenn dieses Programm existiert, dann könnte ein Programmierer den Quelltext aber auch ändern und so das Programm SELTSAM erschaffen:
BEGIN
{...}
IF (stopp)
THEN Ausgabe: "Das Programm ist selbststoppend."
WHILE (true) DO //nichts
ELSE Ausgabe: "Das Programm ist nicht selbststoppend."
END.
Ist Seltsam selbststoppend oder nicht?
Angenommen es ist selbststoppend. Startet man nun das Programm SELTSAM und gibt ihm seinen Quelltext als Eingabe, so wird der gleiche Algorithmus abgearbeitet, wie beim Stopp-Test und damit die Variable stopp auf true gesetzt. Das Programm gibt nun aus, dass es selbststoppend ist, bleibt aber dann in der Endlosschleife hängen, ist also nicht selbststoppend. Damit steht es im Widerspruch zur Annahme.
Angenommen es ist nicht selbststoppend. Auch hier wird das Programm SELTSAM wie oben beschrieben abgearbeitet und die Variable stopp erhält den Wert false. Der Algorithmus gibt nun aus "Das Programm ist nicht selbststoppend", hält aber anschließend. Damit ist aber wieder ein Widerspruch zur Annahme vorhanden.
Da SELTSAM weder die Eigenschaft "selbststoppend" noch deren logische Negation besitzt, kann es nach den Gesetzen der Logik nicht existieren. Da es formal aus dem ersten Programm entwickelt wurde, kann es aber auch kein Programm Stopp-Tester geben.
Resümee:
Es ist nicht möglich von einem beliebigen Programm zu sagen, ob es nach endlich vielen Schritten stoppt oder nicht! Damit wurde (beweisbar) ein Problem gefunden, dass nicht mit Hilfe des Computers gelöst werden kann.
Vertiefung/Visualisierung: