Theorem: Beweis - Milch und Honig

Werbung
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).
Herunterladen