Wobei man dazu sagen muss, dass eine Turingmaschine ein unendlich langes Speicherband hat und das Problem deswegen nicht entscheidbar ist.
Was für ein Blödsinn. Das Halteproblem ist generell nicht entscheidbar. Ein Beispiel dazu gibt es in den
SICP vorlesungen. Ich gebe das mal hier wieder.
Man definiert eine Funktion "diag1", die ein Argument p annimmt. Wenn es sicher ist, p auf p anzuwenden,
also, wenn die Anwendung von p auf p irgendwann hält, so führt diag1 eine Endlosschleife aus. Ansonsten
gebe sie 3 zurück.
Hier die Definition der Funktion:
Code:
(define diag1
(lambda (p)
(if (safe? p p)
(inf)
3)))
(define inf
(lambda ()
((lambda (x) (x x))
(lambda (x) (x x)))))
Wendet man nun diag1 auf diag1 an, und substituiert diag1 für p in der Funktion, so wird geprüft, ob es
sicher ist, diag1 auf diag1 anzuwenden. Dafür gibt es zwei Möglichkeiten. Wenn es sicher wäre, diag1 auf
diag1 anzuwenden, hieße das, diese Anwendung müsste irgendwann anhalten. Die Definition der Funktion
verlangt aber, dass in diesem Fall eine Endlosschleife ausgeführt wird.
Im anderen Fall, also dass (safe? diag1 diag1) ergäbe, dass die Anwendung eine Endlosschleife ergibt, gibt
die Anwendung aber eine 3 zurück.
Das ist ein Widerspruch, also kann es eine Funktion safe? nicht geben. Völlig egal, ob der Speicher begrenzt
ist, oder unendlich.
€: Ein zweites Beispiel geht folgendermaßen:
Man definiere eine weitere Funktion "diag2" mit einem Argument p, die prüft, ob die Anwendung von p auf p
sicher ist. Ist das der Fall, gebe etwas Anderes zurück, als die Anwendung von p auf p. Ansonsten gebe false
zurück.
Code:
(define diag2
(lambda (p)
(if (safe? p p)
(other-than (p p))
false)))
(define other-than
(lambda (x)
(if (eq? x 'a)
'b
'a)))
other-than prüft hier, ob ihr Argument der Buchstabe "a" ist. Ist das so, gibt sie "b" zurück, ansonsten "a". Das
heißt ganz klar: Egal, was ihr Argument ist, die Funktion gibt immer etwas Anderes zurück. Wie verlangt.
Wendet man nun wieder diag2 auf diag2 an, so wird nur p auf p angewendet, wenn es sicher ist, dies zu tun.
Gibt es also eine Funktion safe? dann ist diag2 immer definiert und damit sicher. Also muss die Anwendung von
diag2 auf diag2 immer zu (other-than (diag2 diag2)) reduziert werden. Also wäre, wenn es eine Funktion gäbe,
die erkennt, ob eine Funktion anhält, oder eine Endlosschleife ergibt, die Anwendung von diag2 auf diag2 immer
etwas Anderes als die Anwendung von diag2 auf diag2. Auch das ist offensichtlich ein Widerspruch, also
zeigt auch das, dass es keine solche Funktion safe? geben kann.