Abschnitt 1.4: Die Ackermannfunktion

Werbung
Kapitel 1: Berechenbarkeitstheorie
1.4 Die Ackermannfunktion
1.4 Die Ackermannfunktion
a : N2 → N :
a(0, y ) = y + 1,
a(x, 0) = a(x − 1, 1), x > 0,
a(x, y ) = a(x − 1, a(x, y − 1)), x, y > 0.
Beispiele:
Beh.: a(1, y ) = y + 2
Bew. durch Induktion über y :
a(1, 0) = a(0, 1) = 2 = 0 + 2.
a(1, y + 1) = a(0, a(1, y )) =I.V. a(0, y + 2) = y + 3 = (y + 1) + 2.
Beh.: a(2, y ) = 2y + 3
Bew. durch Induktion über y :
a(2, 0) = a(1, 1) =s.o. 3 = 2 · 0 + 3.
a(2, y + 1) = a(1, a(2, y )) =I.V. a(1, 2y + 3) =s.o. 2y + 5 = 2(y + 1) + 3.
Prof. Dr. F. Otto (Universität Kassel)
Berechenbarkeit und Formale Sprachen
65 / 313
Kapitel 1: Berechenbarkeitstheorie
1.4 Die Ackermannfunktion
Lemma 1.20
a ist eine totale Funktion, d.h. a(x, y ) ist für alle x, y ∈ N definiert.
Beweis durch Induktion über x:
x =0:
a(0, y ) = y + 1
x − 1 → x : a(x, y ) =
=
=
=
=
Prof. Dr. F. Otto (Universität Kassel)
a(x
a(x
...
a(x
a(x
− 1, a(x, y − 1))
− 1, a(x − 1, a(x, y − 2)))
− 1, . . . , a(x − 1, a(x, 0)) . . .)
− 1, . . . , a(x − 1, a(x − 1, 1)) . . .)
Berechenbarkeit und Formale Sprachen
2
66 / 313
Kapitel 1: Berechenbarkeitstheorie
1.4 Die Ackermannfunktion
Lemma 1.21
(a) y < a(x, y ).
(b) a(x, y ) < a(x, y + 1).
(c) a(x, y + 1) ≤ a(x + 1, y ).
(d) a(x, y ) < a(x + 1, y ).
(b)+(d): ∀x ≤ x ′ ∀y ≤ y ′ : a(x, y ) ≤ a(x ′ , y ′ ).
Prof. Dr. F. Otto (Universität Kassel)
Berechenbarkeit und Formale Sprachen
67 / 313
Kapitel 1: Berechenbarkeitstheorie
1.4 Die Ackermannfunktion
Beweis von (a) durch Induktion über x:
I.A.: x = 0 :
a(0, y ) = y + 1 > y .
I.V.: a(x, y ) > y für alle y .
I.B.: a(x + 1, y ) > y für alle y .
I.S: Induktion über y :
I.A.: y = 0: a(x + 1, 0) = a(x, 1) >I.V. x 1 > 0.
I.V.: a(x + 1, y ) > y für ein y ≥ 0.
I.B.: a(x + 1, y + 1) > y + 1.
=
a(x, a(x + 1, y ))
I.S: a(x + 1, y + 1)
>I.V. x a(x + 1, y )
>I.V. y y ,
d.h., a(x + 1, y + 1) > y + 1.
Prof. Dr. F. Otto (Universität Kassel)
Berechenbarkeit und Formale Sprachen
2
68 / 313
Kapitel 1: Berechenbarkeitstheorie
1.4 Die Ackermannfunktion
Die Funktion fP : N → N für ein LOOP-Programm P
Sei P ein LOOP-Programm mit den Variablen x0 , x1 , . . . , xk . Seien
n0 , n1 , . . . , nk die Startwerte für diese Variablen, und seien
n0′ , n1′ , . . . , nk′ die Endwerte für diese Variablen.
Definiere: fP : N → N :
fP (n) = max{
X
i≥0
ni′
|
X
ni ≤ n }.
i≥0
Lemma 1.22
Für jedes LOOP-Programm P gibt es eine Konstante k , sodass für alle
n folgendes gilt:
fP (n) < a(k , n).
Prof. Dr. F. Otto (Universität Kassel)
Berechenbarkeit und Formale Sprachen
69 / 313
Kapitel 1: Berechenbarkeitstheorie
1.4 Die Ackermannfunktion
Beweis Induktion über den Aufbau von P:
(i) xi := xj ± 1
fP (n) ≤ 2n + 1 < a(2, n), d.h. k = 2.
(ii) P1 ; P2
I.V.: fP1 (n) < a(k1 , n), fP2 (n) < a(k2 , n).
Wähle k3 := max{k1 − 1, k2 }.
Dann : fP (n) ≤ fP2 (fP1 (n)) <
≤
=
≤
d.h. k = k3 + 2.
Prof. Dr. F. Otto (Universität Kassel)
a(k2 , a(k1 , n))
a(k3 , a(k3 + 1, n))
a(k3 + 1, n + 1)
a(k3 + 2, n),
Berechenbarkeit und Formale Sprachen
70 / 313
Kapitel 1: Berechenbarkeitstheorie
1.4 Die Ackermannfunktion
(iii) LOOP xi DO Q END
I.V.: fQ (n) < a(k1 , n).
O.B.d.A.: xi kommt in Q nicht vor.
P ′ P
nj ≤ n }
fP (n) = max{
nj |
j≥0
j≥0
Sei m ≤ n der Wert von xi bei dem
P
j≥0
annimmt.
nj′ den maximalen Wert
m = 0 : fP (n) = n < a(0, n).
m = 1 : fP (n) ≤ fQ (n) < a(k1 , n).
Prof. Dr. F. Otto (Universität Kassel)
Berechenbarkeit und Formale Sprachen
71 / 313
Kapitel 1: Berechenbarkeitstheorie
1.4 Die Ackermannfunktion
m ≥ 2 : fP (n) ≤ fQ (fQ (. . . (fQ (n − m)) . . .)) + m.
|
{z
}
m-mal
< a(k1 , fQ (fQ (. . . (fQ (n − m)) . . .))) + m
{z
}
|
(m−1)-mal
..
.
< a(k1 , a(k1 , . . . , a(k1 , n − m) . . .)) + m
{z
}
|
m-mal
;
fP (n) ≤ a(k1 , a(k1 , . . . , a(k1 , n − m) . . .))
< a(k1 , . . . a(k1 , a(k1 + 1, n − m) . . .))
{z
}
|
(m−1)-mal
= a(k1 + 1, n − 1)
< a(k1 + 1, n),
d.h. k = k1 + 1.
Prof. Dr. F. Otto (Universität Kassel)
Berechenbarkeit und Formale Sprachen
2
72 / 313
Kapitel 1: Berechenbarkeitstheorie
1.4 Die Ackermannfunktion
Satz 1.23
Die Ackermannfunktion ist nicht LOOP-berechenbar, d.h. sie ist nicht
primitiv rekursiv.
Beweis (Indirekt):
Sei P ein LOOP-Programm, das g(n) := a(n, n) berechnet.
Dann gilt g(n) ≤ fP (n).
Es gibt eine Konstante k mit:
∀n ≥ 0 : fP (n) < a(k , n),
d.h. g(k ) ≤ fP (k ) < a(k , k ) = g(k )
Prof. Dr. F. Otto (Universität Kassel)
Widerspruch !
Berechenbarkeit und Formale Sprachen
2
73 / 313
Kapitel 1: Berechenbarkeitstheorie
1.4 Die Ackermannfunktion
Satz 1.24
Die Ackermannfunktion ist eine totale, WHILE-berechenbare Funktion,
die nicht LOOP-berechenbar ist.
Beweis: Vorüberlegung 1
Gleichungen
Rechenregeln
a(0, y ) = y + 1
(0, y ) 7→ y + 1
a(x + 1, 0) = a(x, 1)
(x + 1, 0) 7→ (x, 1)
a(x + 1, y + 1) = a(x, a(x + 1, y )) (x + 1, y + 1) 7→ (x, x + 1, y )
Beispiel:
a(2, 1) = a(1, a(2, 0)) = a(1, a(1, 1)) = a(1, a(0, a(1, 0))) = . . .
(2, 1) →
7
(1, 2, 0)
7→
(1, 1, 1) 7→ (1, 0, 1, 0)
7→ (1, 0, 0, 1)
7→
(1, 0, 2) 7→
(1, 3)
7→
(0, 1, 2)
7→ (0, 0, 1, 1) 7→ (0, 0, 0, 1, 0)
7→ (0, 0, 0, 0, 1) →
7 4
5
Prof. Dr. F. Otto (Universität Kassel)
Berechenbarkeit und Formale Sprachen
74 / 313
Kapitel 1: Berechenbarkeitstheorie
1.4 Die Ackermannfunktion
Beweis: Vorüberlegung 2
Folgende Operationen müssen realisiert werden:
1
Speichere Folge (x1 , . . . , xr −1 , xr ) von natürlichen Zahlen.
2
Teste, ob Folge die Länge r = 1 hat.
3
Bestimme (und entferne) das letzte Element der Folge.
4
Füge eine Zahl an die Folge an.
Hierzu verwenden wir die Speicherstruktur Stack (oder Keller).
Ein Stack speichert eine Folge von Elementen (z.B. Zahlen),
wobei nur folgende Operationen erlaubt sind:
- Initialisieren: Ein leerer Stack wird bereitgestellt.
- Test: Ist der Stack leer?
- Push: Ein Element auf den Stack legen.
- Pop: Das oberste Element des Stacks lesen und vom Stack
entfernen.
Prof. Dr. F. Otto (Universität Kassel)
Berechenbarkeit und Formale Sprachen
75 / 313
Kapitel 1: Berechenbarkeitstheorie
1.4 Die Ackermannfunktion
Beweis von Satz 1.24:
Noch z.z.: a(x, y ) ist WHILE-berechenbar.
1. Schritt:
Ein Programm, das a(x, y ) mit Hilfe eines Stacks berechnet:
INIT(st)
size(st)
PUSH(x, st)
y := POP(st)
:
:
:
:
Prof. Dr. F. Otto (Universität Kassel)
Stack st initialisieren
Anzahl der Elemente im Stack st bestimmen
x auf den Stack st legen
oberstes Element vom Stack st entfernen
und an y übergeben
Berechenbarkeit und Formale Sprachen
76 / 313
Kapitel 1: Berechenbarkeitstheorie
1.4 Die Ackermannfunktion
Ein STACK-Programm zur Berechnung von a(x, y )
INPUT(x, y );
INIT(stack);
PUSH(x,stack); PUSH(y ,stack);
WHILE size(stack) 6= 1 DO
y := POP(stack); x := POP(stack);
IF x = 0 THEN PUSH(y + 1,stack)
ELSE IF y = 0 THEN PUSH(x − 1,stack);
PUSH(1,stack)
ELSE PUSH(x − 1,stack);
PUSH(x,stack);
PUSH(y − 1,stack)
END{IF}
END{WHILE}
result := POP(stack);
OUTPUT(result).
Prof. Dr. F. Otto (Universität Kassel)
Berechenbarkeit und Formale Sprachen
77 / 313
Kapitel 1: Berechenbarkeitstheorie
1.4 Die Ackermannfunktion
Realisierung der Stack-Operationen
Sei (n1 , n2 , . . . , nk ) der aktuelle Stackinhalt.
n := c(nk + 1, c(nk −1 + 1, . . . , c(n2 + 1, c(n1 + 1, 0)) . . .))
die Kodierung des Stackinhalts.
Operation
Realisierung
INIT(stack)
n := 0
PUSH(a,stack)
n := c(a + 1, n)
y := POP(stack)
y := e(n) − 1;
n := f (n)
size(stack) 6= 1
f (n) 6= 0
Also ist a(x, y ) WHILE-berechenbar.
Prof. Dr. F. Otto (Universität Kassel)
Berechenbarkeit und Formale Sprachen
2
78 / 313
Kapitel 1: Berechenbarkeitstheorie
1.4 Die Ackermannfunktion
Übersicht
↔
WHILE
↔
µ-rekursiv
LOOP
↔
prim. rekursiv
(
GOTO
Prof. Dr. F. Otto (Universität Kassel)
Berechenbarkeit und Formale Sprachen
79 / 313
Herunterladen