Theorem: Kein Computer kann für alle Programme sagen, ob sie eine Lösung finden, oder ewig nach ihr suchen. Beweis: 1. Beschränken wir uns zuerst nur auf die Programme P, die als Eingabeparameter eine natürliche Zahl n nehmen. Das ist legitim: Wenn der Computer schon für diese Programme nicht sagen kann, ob sie enden oder nicht, wird er es für die restlichen erst recht nicht machen können können. Den Aufruf von solchen Programmen schreiben wir kurz als P(n). 2. Listen wir alle solche Programme auf. Die Liste ist unendlich lang und hat ungefähr die Form: Position: -----------1: 2: 3: ... Programm -------------P1 P2 P3 ... Was die P1, P2, P3 tun, spielt keine Rolle für den Beweis. Wichtig ist nur, dass jeder dieser Programme einen Parameter (Benutzereingabe) n nimmt, eine natürliche Zahl. P1(n) könnte z.B. die Summe aller Zahlen von 1 bis n berechnen. P2(n) könnte die kleinste ungerade Zahl suchen, die sich als Summe von n geraden Zahlen darstellen lässt. P3(n) könnte die kleinste Zahl suchen, die sich nicht als Summe von n Primzahlen darstellen lässt. Usw. P1 wird, offensichtlich, immer zu einem Ergebnis kommen. P2 wird nie zu einem Ergebnis kommen. Bei P3 wissen wir es nicht. 3. Nehmen wir an, es gäbe noch ein Programm Q, das zwei Parameter nimmt, p und n. Es endet immer dann, wenn ein Programm p, aufgerufen mit einem Parameter n, nicht enden würde. Wenn das Programm Pp(n) keine Lösung findet, meldet das Programm Q „Keine Lösung“ und endet. Zum Beispiel: • Q(2, 2) überprüft, ob das Programm P2 eine Lösung finden würde, wenn man ihm die 2 als Eingabeparameter übergäbe. • P2 versucht eine ungerade Zahl zu finden, die sich als Summe von zwei geraden Zahlen darstellen lässt. Da eine solche Zahl nicht existiert, würde P2 ewig suchen und keine Lösung finden. • Q(2, 2) meldet „Keine Lösung“ und endet. 4. Nehmen wir das Programm R, das eine Zahl k als Parameter nimmt und das Programm Q mit Parametern (k, k) aufruft. Wenn Q(k, k) „keine Lösung“ meldet, endet R. Ansonsten geht R in eine Endlosschleife, d.h. es endet nie. Zum Beispiel: • R(2) ruft Q(2, 2) auf. • Q(2, 2) überprüft, ob das Programm P2 eine Lösung finden würde, wenn man ihm die 2 als Eingabeparameter übergäbe. • P2 würde versuchen eine ungerade Zahl zu finden, die sich als Summe von zwei ungeraden Zahlen darstellen lässt. Da eine solche Zahl nicht existiert, würde P2 ewig suchen und keine Lösung finden. • Q(2, 2) meldet „Keine Lösung“ und endet. • R(2) endet. Anderes Beispiel: • R(1) ruft Q(1, 1) auf. • Q(1, 1) überprüft, ob das Programm P1 eine Lösung finden würde, wenn man ihm die 1 als Eingabeparameter übergäbe. • P1 würde zum Ergebnis 1 kommen und enden. • Q(1, 1) meldet nicht: „Keine Lösung“. Ob es endet oder nicht, spielt keine Rolle. • R(1) geht in eine Endlosschleife und endet nie. 5. Da unsere Liste alle Programme beinhaltet, die sich mit einem Parameter n (einer natürlichen Zahl) aufrufen lassen, und da R auch so ein Programm ist, fragen wir uns: An welcher Position in der Liste finden wir R? 6. Nehmen wir an, es ist die Position r. In anderen Worten R = Pr. Die nächste Frage ist: Was passiert, wenn wir R(r) aufrufen? Kommt das Programm zum Halt oder nicht? • R(r) ruft Q(r, r) auf. • Q(r, r) überprüft, ob das Programm Pr eine Lösung finden würde, wenn man ihm r als Eingabeparameter übergäbe. Da R(r) = Pr(r) ist, heißt das, dass Q(r, r) überprüft, ob R(r) endet. • Wenn R(r) nicht endet, meldet Q(r, r) „Keine Lösung“ und endet. R(r) endet ebenfalls → Widerspruch! • Wenn R(r) endet, meldet Q(r, r) nicht „Keine Lösung“. R(r) geht in eine Endlosschleife und endet nie → Widerspruch! 7. Anders ausgedrückt, ein Programm R, das überprüft, ob ein gegebenes i-tes Programm endet, kann es nicht geben, weil es an sich selbst scheitern würde. was zu beweisen wäre („quod erat demonstrandum“, QED).