Das Halteproblem
für Java-Klassen
Gibt es eine Methode, die
folgendes leistet:
Alternative Formulierung:
|
Grobentwurf für die Java-Methode haelt:
static boolean
haelt(text p, text x)
{
ergebnis = true; else ergebnis = false; return ergebnis; } // Ende von haelt |
Annahme: Es gibt eine solche Methode. Kann sich mit ihr eine Klasse zunächst selbst testen?
Klasse Seltsam:
public class seltsam;
{ static boolean haelt(text p, text x) {
if (p terminiert bei Eingabe von x)
public static void main (String []
argumente)
lies(seltsam.java);
} // Ende der Klasse seltsam |
Ergebnis: Der Selbsttest funktioniert nicht! Dann kann diese Klasse und diese Methode erst recht keine beliebigen anderen Klassen auf endliche Programmausführung überprüfen.
Grafische Darstellung des Sachverhaltes:
Satz von Turing (für Java-Methoden):
Es gibt keine Java-Methode, die für eine
beliebige Klasse p und eine beliebige Eingabe x die
Frage beantwortet, ob p auf x angewendet nach endlich
vielen Schritten anhält oder nicht.
Alternative Formulierung: Es gibt kein Testprogramm, dass für andere Programme und deren Eingaben entscheidet, ob sie anhalten (und eine Ausgabe liefern)! |
Allgemein:
Die Halteeigenschaft für Programme ist
unentscheidbar.
Die Verantwortung für das Anhalten (die Terminierung) von Programmen wird niemals einer Maschine übertragen werden können; sie bleibt beim Menschen. |
Entscheidbar sind:
- Geradeausprogramme
- Programme mit ausschließlich Vorwärtsverzweigungen
Unentscheidbar:
- Programme mit Schleifen
- rekursive Programme