VL-09: LOOP und WHILE Programme I
(Berechenbarkeit und Komplexit¨ at, WS 2019) Gerhard Woeginger
WS 2019, RWTH
Organisatorisches
N¨achste Vorlesungen:
Mittwoch, November 20: Keine Vorlesung Freitag, November 22, 12:30–14:00 Uhr, Audimax
Webseite:
https://algo.rwth-aachen.de/Lehre/WS1920/BuK/BuK.py
Wiederholung
Wdh.: Der Satz von Richardson
Eine Funktion heisstelementar, wenn sie durch Kombination von Addition, Subtraktion, Multiplikation, Division,
Potenzieren, Wurzel ziehen, Logarithmieren, Betragsfunktion und den trigonometrischen Funktionen konstruiert werden kann.
Im Jahr 1968 bewies der Britische Mathematiker Daniel Richardson das folgende Unentscheidbarkeitsresultat:
Satz von Richardson (1968)
Es ist unentscheidbar, ob eine gegebeneelementareFunktion eine elementareStammfunktion besitzt.
Der Beweis reduziert (im Wesentlichen) das Halteproblem f¨ur Turing Maschinen auf das Integrationsproblem.
Wdh.: Hilberts zehntes Problem
Im Originalwortlaut (1900):
EineDiophantischeGleichung mit irgend welchen Unbekannten und mit ganzen rationalen Zahlencoefficienten sei vorgelegt: man soll ein Verfahren angeben, nach welchem sich mittelst einer endlichen Anzahl von Operationen entscheiden l¨asst, ob die Gleichung in ganzen rationalen Zahlen l¨osbar ist.
Dioph={hpi|pist ein Polynom mit ganzzahligen Koeffizienten und mit (mindestens) einer ganzzahligen Nullstelle}
Satz von Matiyasevich (1970)
Es ist unentscheidbar, ob ein (multivariates) ganzzahliges Polynom eine ganzzahlige Nullstelle besitzt.
Wdh.: Berechenbarkeitslandschaft
rekursiv aufz¨ahlbare
Probleme
H
H D
Probleme mit rekursiv aufz¨ahlbarem Komplement H H
D entscheidbare
Probleme
Nicht rekursiv aufz¨ahlbare Probleme mit
nicht rekursiv aufz¨ahlbarem Komplement Htot PCP
Dioph
Wdh.: Turing-m¨ achtige Rechnermodelle
Definition
Ein Rechnermodell wird alsTuring-m¨achtigbezeichnet,
wenn jede Funktion, die durch eine TM berechnet werden kann, auch durch dieses Rechnermodell berechnet werden kann.
Da die Registermaschine (RAM) die Turingmaschine simulieren kann, ist sie Turing-m¨achtig
Auch die Mini-RAM (eine schw¨achere Variante der RAM mit stark eingeschr¨anktem Befehlssatz) ist Turing-m¨achtig
Wdh.: Turing-M¨ achtigkeit
Reines HTML (ohne JavaScript; ohne Browser) istnicht Turing-m¨achtig
Tabellenkalkulationen (ohne Schleifen) sind nichtTuring-m¨achtig Der Lambda Calculus von Alonzo Church ist ¨aquivalent zur TM, und daher Turing-m¨achtig
Die µ-rekursiven Funktionen von Stephen Kleene sind ¨aquivalent zur
TM, und daher Turing-m¨achtig
Alle g¨angigen h¨oheren Programmiersprachen sind Turing-m¨achtig:
Algol, Pascal, C, FORTRAN, COBOL, Java, Smalltalk, Ada, C++, Python, LISP, Haskell, PROLOG, etc.
PostScript, Tex, Latex sind Turing-m¨achtig
Sogar PowerPoint ist Turing-m¨achtig (Animated Features)
Vorlesung VL-09
LOOP und WHILE Programme I
Die Programmiersprache LOOP Die Programmiersprache WHILE WHILE versus LOOP
WHILE ist Turing-m¨achtig Die Ackermann Funktion
Die Programmiersprache LOOP
Programmiersprache LOOP
Wir betrachten eine einfache Programmiersprache namens LOOP, deren Programme aus den folgenden syntaktischen Komponenten aufgebaut sind:
Variablen: x0 x1 x2 x3 . . . Konstanten: 0 und 1 Symbole: := + ;
Schl¨usselw¨orter: LOOP DO ENDLOOP
LOOP / Syntax (1)
Die Syntax von LOOP ist induktiv definiert.
Induktive Definition / Induktionsanfang:
Zuweisungen
F¨ur alle Variablenxi undxj und f¨ur jede Konstantec∈ {0,1}
ist die Zuweisung xi := xj+c ein LOOP Programm.
Anmerkung: Auch das leere Programm ist ein LOOP Programm.
LOOP / Syntax (2)
Induktive Definition / Induktionsschritt:
Hintereinanderausf¨uhrung
FallsP1und P2 LOOP Programme sind, so ist auch P1; P2
ein LOOP Programm.
LOOP / Syntax (3)
Induktive Definition / Induktionsschritt:
LOOP-Konstrukt
FallsP ein LOOP Programm ist, so ist auch LOOPxi DOP ENDLOOP
ein LOOP Programm.
LOOP / Semantik (1)
Die Eingabe ist in den Variablen x1, . . . ,xm enthalten.
Alle anderen Variablen werden mit0initialisiert.
Das Resultat eines LOOP Programms ist die Zahl, die sich am Ende der Abbarbeitung in der Variablen x0ergibt.
LOOP Programme der Formxi :=xj+c
sind Zuweisungen des Wertesxj+c an die Variablexi. In einem LOOP ProgrammP1;P2
wird zun¨achstP1und danachP2ausgef¨uhrt.
Das ProgrammLOOPxi DOP ENDLOOPhat folgende Bedeutung: P wirdxi-mal hintereinander ausgef¨uhrt.
(Nur der Wert vonxi zu Beginn der Schleife ist relevant. ¨Andert sich der Wert vonxi im Inneren vonP, so hat dies keinen Einfluss auf die Anzahl der Wiederholungen.)
LOOP / Semantik (1)
Die Eingabe ist in den Variablen x1, . . . ,xm enthalten.
Alle anderen Variablen werden mit0initialisiert.
Das Resultat eines LOOP Programms ist die Zahl, die sich am Ende der Abbarbeitung in der Variablen x0ergibt.
LOOP Programme der Formxi :=xj+c
sind Zuweisungen des Wertesxj+c an die Variablexi.
In einem LOOP ProgrammP1;P2
wird zun¨achstP1und danachP2ausgef¨uhrt.
Das ProgrammLOOPxi DOP ENDLOOPhat folgende Bedeutung: P wirdxi-mal hintereinander ausgef¨uhrt.
(Nur der Wert vonxi zu Beginn der Schleife ist relevant. ¨Andert sich der Wert vonxi im Inneren vonP, so hat dies keinen Einfluss auf die Anzahl der Wiederholungen.)
LOOP / Semantik (1)
Die Eingabe ist in den Variablen x1, . . . ,xm enthalten.
Alle anderen Variablen werden mit0initialisiert.
Das Resultat eines LOOP Programms ist die Zahl, die sich am Ende der Abbarbeitung in der Variablen x0ergibt.
LOOP Programme der Formxi :=xj+c
sind Zuweisungen des Wertesxj+c an die Variablexi. In einem LOOP ProgrammP1;P2
wird zun¨achstP1und danachP2ausgef¨uhrt.
Das ProgrammLOOPxi DOP ENDLOOPhat folgende Bedeutung: P wirdxi-mal hintereinander ausgef¨uhrt.
(Nur der Wert vonxi zu Beginn der Schleife ist relevant. ¨Andert sich der Wert vonxi im Inneren vonP, so hat dies keinen Einfluss auf die Anzahl der Wiederholungen.)
LOOP / Semantik (1)
Die Eingabe ist in den Variablen x1, . . . ,xm enthalten.
Alle anderen Variablen werden mit0initialisiert.
Das Resultat eines LOOP Programms ist die Zahl, die sich am Ende der Abbarbeitung in der Variablen x0ergibt.
LOOP Programme der Formxi :=xj+c
sind Zuweisungen des Wertesxj+c an die Variablexi. In einem LOOP ProgrammP1;P2
wird zun¨achstP1und danachP2ausgef¨uhrt.
Das ProgrammLOOPxi DOP ENDLOOPhat folgende Bedeutung:
P wirdxi-mal hintereinander ausgef¨uhrt.
(Nur der Wert vonxi zu Beginn der Schleife ist relevant. ¨Andert sich der Wert vonxi im Inneren vonP, so hat dies keinen Einfluss auf die Anzahl der Wiederholungen.)
LOOP / Semantik (2)
Ein LOOP ProgrammP mitk Variablen
berechnet einek-stellige Funktion der Form[P] : Nk →Nk. IstP die Zuweisungxi :=xj+c,
so ist[P](r0, . . . ,rk−1) = (r0, . . . ,ri−1,rj+c,ri+1, . . . ,rk−1).
IstP=P1;P2 eine Hintereinanderausf¨uhrung, so ist[P](r0, . . . ,rk−1) = [P2]([P1](r0, . . . ,rk−1)).
IstP=LOOPxi DOQENDLOOPein LOOP-Konstrukt, so gilt[P](r0, . . . ,rk−1) = [Q]ri(r0, . . . ,rk−1).
LOOP: Beispiele und Macros
LOOP Programme / Beispiele (1)
Das folgende Programm simuliert die Zuweisungxj :=xi. Beispiel A
xj :=xi+0
Es seixzero eine Dummy-Variable, die mit0initialisiert wird und deren Wert nie ver¨andert wird. Das folgende(c+1)-zeilige Programm simuliert die Zuweisungxj:=c eines konstanten Wertesc≥0an eine Variable.
Beispiel B
xj :=xzero; xj :=xj+1;
xj :=xj+1;
... ...
xj :=xj+1;
LOOP Programme / Beispiele (2)
Beispiel C
x0:=x1;
LOOPx2DOx0:=x0+1 ENDLOOP
Dieses Programm berechnet die Additionx0:=x1+x2
Beispiel D
x0:=0;
LOOPx2 DOx0:=x0+x1 ENDLOOP
Dieses Programm berechnet die Multiplikationx0:=x1·x2
LOOP Programme / Beispiele (2)
Beispiel C
x0:=x1;
LOOPx2DOx0:=x0+1 ENDLOOP Dieses Programm berechnet die Additionx0:=x1+x2
Beispiel D
x0:=0;
LOOPx2 DOx0:=x0+x1 ENDLOOP
Dieses Programm berechnet die Multiplikationx0:=x1·x2
LOOP Programme / Beispiele (2)
Beispiel C
x0:=x1;
LOOPx2DOx0:=x0+1 ENDLOOP Dieses Programm berechnet die Additionx0:=x1+x2
Beispiel D
x0:=0;
LOOPx2DOx0:=x0+x1 ENDLOOP
Dieses Programm berechnet die Multiplikationx0:=x1·x2
LOOP Programme / Beispiele (2)
Beispiel C
x0:=x1;
LOOPx2DOx0:=x0+1 ENDLOOP Dieses Programm berechnet die Additionx0:=x1+x2
Beispiel D
x0:=0;
LOOPx2DOx0:=x0+x1 ENDLOOP
Dieses Programm berechnet die Multiplikationx0:=x1·x2
LOOP Programme / Beispiele (3)
Ubung¨
Skizzieren Sie LOOP Programme, die die folgenden Operationen berechnen:
Die (modifizierte) Subtraktionx0:=x1−. x2.
F¨urx1<x2 erh¨altx0den Wert 0; andernfalls den Wertx1−x2 Die Division ohne Restx0:=x1DIVx2
Die Modulo-Operationx0:=x1MODx2
LOOP Programme / Beispiele (4)
Es seienP1undP2 LOOP Programme, in denen die drei Variablenx1,x2undx3 nicht vorkommen.
Beispiel E
x2:=1; x3:=0;
LOOPx1DOx2:=0;x3:=1 ENDLOOP;
LOOPx2DOP1 ENDLOOP;
LOOPx3DOP2 ENDLOOP
Dieses Programm entspricht dem Konstrukt: IF x1=0THENP1 ELSEP2 ENDIF Ubung¨
Skizzieren Sie ein LOOP Programm,
das“IF x1=c THENP1 ELSEP2 ENDIF”simuliert.
LOOP Programme / Beispiele (4)
Es seienP1undP2 LOOP Programme, in denen die drei Variablenx1,x2undx3 nicht vorkommen.
Beispiel E
x2:=1; x3:=0;
LOOPx1DOx2:=0;x3:=1 ENDLOOP;
LOOPx2DOP1 ENDLOOP;
LOOPx3DOP2 ENDLOOP Dieses Programm entspricht dem Konstrukt:
IF x1=0THENP1 ELSEP2 ENDIF
Ubung¨
Skizzieren Sie ein LOOP Programm,
das“IF x1=c THENP1 ELSEP2 ENDIF”simuliert.
LOOP Programme / Beispiele (4)
Es seienP1undP2 LOOP Programme, in denen die drei Variablenx1,x2undx3 nicht vorkommen.
Beispiel E
x2:=1; x3:=0;
LOOPx1DOx2:=0;x3:=1 ENDLOOP;
LOOPx2DOP1 ENDLOOP;
LOOPx3DOP2 ENDLOOP Dieses Programm entspricht dem Konstrukt:
IF x1=0THENP1 ELSEP2 ENDIF Ubung¨
Skizzieren Sie ein LOOP Programm,
das“IF x1=c THENP1 ELSEP2 ENDIF”simuliert.
Die Programmiersprache WHILE
Programmiersprache WHILE
Die Programme der Programmiersprache WHILE sind aus den folgenden syntaktischen Komponenten aufgebaut:
Variablen: x0 x1 x2 x3 . . . Konstanten: 0 und 1 Symbole: := + ; 6=
Schl¨usselw¨orter: LOOP DO ENDLOOP WHILE ENDWHILE
WHILE / Syntax
Die Syntax von WHILE ist induktiv definiert, und stimmt weitgehend mit der Syntax von LOOP ¨uberein.
Zuweisungenxi := xj+c und die Hintereinanderausf¨uhrungP1;P2 sind genau wie in LOOP definiert.
Der Hauptunterschied zu LOOP besteht im Schleifen-Konstrukt.
WHILE-Konstrukt
FallsP ein WHILE Programm ist undxi eine Variable, so ist auch WHILExi6=0 DOP ENDWHILE
ein WHILE Programm.
WHILE / Semantik (1)
Analog zu LOOP Programmen:
Die Eingabe ist in den Variablen x1, . . . ,xm enthalten.
Alle anderen Variablen werden mit0initialisiert.
Das Resultat eines WHILE Programms ist die Zahl, die sich am Ende der Abbarbeitung in der Variablenx0 ergibt.
WHILE / Semantik (2)
Das ProgrammWHILExi6=0 DOP ENDWHILEhat folgende Bedeutung:
P wird solange ausgef¨uhrt, bisxi den Wert0erreicht.
Ein WHILE ProgrammP mitk Variablen
berechnet einek-stellige Funktion der Form[P] : Nk →Nk. IstP=WHILExi6=0 DOQ ENDWHILE ein WHILE-Konstrukt,
so ist[P](r0, . . . ,rk−1) = [Q]`(r0, . . . ,rk−1)f¨ur die kleinste Zahl`, f¨ur die diei-te Komponente von[Q]`(r0, . . . ,rk−1)gleich0ist.
Falls solch ein `nicht existiert, so ist[P](r0, . . . ,rk−1)undefiniert.
WHILE versus LOOP
WHILE versus LOOP (1)
Jede LOOP-berechenbare Funktionf: Nk →Nist auch WHILE-berechenbar.
Bemerkung Die LOOP-Schleife
LOOPxi DOP ENDLOOP
kann auch durch die folgende WHILE-Schleife simuliert werden:
y :=xi
WHILEy 6=0 DOy :=y−1; P ENDWHILE
WHILE versus LOOP (2a)
Es gibt WHILE Programme, die nicht terminieren:
Beispiel
x1:=1;
WHILEx16=0 DOx1:=x1+1 ENDWHILE
WHILE versus LOOP (2b)
LOOP Programme terminieren immer:
Satz
Jedes LOOP Programm h¨alt auf jeder m¨oglichen Eingabe nach endlich vielen Schritten an.
Beweis: Durch Induktion ¨uber den Aufbau des Programms.
Zuweisungen
Hintereinanderausf¨uhrungP =P1;P2
LOOP-KonstruktP=LOOPxi DOQ ENDLOOP
WHILE versus LOOP (3)
Wir werden zeigen:
Satz (wird heute bewiesen)
Die Programmiersprache WHILE istTuring-m¨achtig.
In anderen Worten: Jede berechenbare Funktion kann von einem WHILE Programm berechnet werden.
Satz (wird in der n¨achsten Vorlesung bewiesen)
Die Programmiersprache LOOP istnicht Turing-m¨achtig.
In anderen Worten: Es existiert eine berechenbaretotaleFunktion, die von keinem LOOP Programm berechnet werden kann.
M¨ achtigkeit von WHILE
M¨ achtigkeit von WHILE
Satz
Die Programmiersprache WHILE ist Turing-m¨achtig.
Beweis:
Wir zeigen, dass jede Funktion, die durch eine TM berechnet werden kann, auch durch ein WHILE Programm berechnet werden kann.
Simulation von TM durch WHILE
Wir betrachten eine TMM.
Zustandsmenge Q={q0, . . . ,qt}
Der Anfangszustand istq1, und der Endzustand istq0
TM im Zustand qi ⇐⇒ WHILE VariableZustand=i
BandalphabetΓ ={1,2,B} WHILE kodiert
Buchstaben1durch Dezimalziffer1, Buchstaben2durch Dezimalziffer2, und BuchstabenB durch Dezimalziffer0.
Die Werte in allen WHILE Variablen werden im Folgenden als Dezimalzahlen interpretiert
Simulation von TM durch WHILE
Wir betrachten eine TMM.
Zustandsmenge Q={q0, . . . ,qt}
Der Anfangszustand istq1, und der Endzustand istq0
TM im Zustand qi ⇐⇒ WHILE VariableZustand=i BandalphabetΓ ={1,2,B}
WHILE kodiert
Buchstaben1durch Dezimalziffer1, Buchstaben2durch Dezimalziffer2, und BuchstabenB durch Dezimalziffer0.
Die Werte in allen WHILE Variablen werden im Folgenden als Dezimalzahlen interpretiert
Simulation von TM durch WHILE
Wir betrachten eine TMM.
Zustandsmenge Q={q0, . . . ,qt}
Der Anfangszustand istq1, und der Endzustand istq0
TM im Zustand qi ⇐⇒ WHILE VariableZustand=i BandalphabetΓ ={1,2,B}
WHILE kodiert
Buchstaben1durch Dezimalziffer1, Buchstaben2durch Dezimalziffer2, und BuchstabenB durch Dezimalziffer0.
Die Werte in allen WHILE Variablen werden im Folgenden als Dezimalzahlen interpretiert
Simulierte TuringmaschineM:
· · ·
· · · B 1 1 2 2 2 1 2 1 1 1 B B B
δ 1 2 B
q1
q2
q3 (q2,1,R)
q3
Entsprechende Konfiguration: 1122q3212111
Die vier entsprechenden Variablen im WHILE Programm:
Band-vor-Kopf Kopf fpoK-ba-dnaB
Zustand 3
1122 2 11121
VariableBandLinks VariableUntermKopf
VariableBandRechts VariableZustand
Simulation von TM durch WHILE
Jeder Rechenschritt von M wird durch einige WHILE-Befehle simuliert.
Jeder Rechenschritt der TM besteht (gem¨ass ¨Uberf¨uhrungsfunktion) aus (A) Update von Zustand
(B) Update von Symbol unterm Kopf (C) Bewegung des Kopfes L,R,N
Beginn der Rechenschritt Simulation
Aktueller Zustand steht in der Variablen Zustand
Aktuelles Symbol unterm Kopf steht in der Variablen UntermKopf
Simulation von TM durch WHILE (A)
Jeder Rechenschritt der TM besteht (gem¨ass ¨Uberf¨uhrungsfunktion) aus (A) Update von Zustand
(B) Update von Symbol unterm Kopf (C) Bewegung des Kopfes L,R,N
Der Zustand wird auf den neuen Zustandqi gesetzt, indem man das folgende Programmst¨uck ausf¨uhrt:
Zustand:= i;
Simulation von TM durch WHILE (B)
Jeder Rechenschritt der TM besteht (gem¨ass ¨Uberf¨uhrungsfunktion) aus (A) Update von Zustand
(B) Update von Symbol unterm Kopf (C) Bewegung des Kopfes L,R,N
Das Symbol unterm Kopf wird auf neues Symbolσ∈ {0,1,2} gesetzt, indem man das folgende Programmst¨uck ausf¨uhrt:
UntermKopf := σ;
Simulation von TM durch WHILE (C/links)
Jeder Rechenschritt der TM besteht (gem¨ass ¨Uberf¨uhrungsfunktion) aus (A) Update von Zustand
(B) Update von Symbol unterm Kopf (C) Bewegung des Kopfes L,R,N
Der Kopf wird einen Schritt nach links (L) bewegt, indem man das folgende Programmst¨uck ausf¨uhrt:
BandRechts:=10×BandRechts+UntermKopf;
UntermKopf :=BandLinks MOD 10;
BandLinks:=BandLinksDIV 10;
Illustration: Kopfbewegung nach links
Alte Situation vor Bewegung
· · ·
· · · B 1 1 1 2 1 2 2 1 1 B B B
BandLinks=1112 UntermKopf=1 BandRechts=1122 BandRechts:=10×BandRechts+UntermKopf = 11220+1 UntermKopf :=BandLinks MOD 10 = 2
BandLinks:=BandLinksDIV 10 = 111 Neue Situation nach Bewegung
· · ·
· · · B 1 1 1 2 1 2 2 1 1 B B B
BandLinks=111 UntermKopf=2 BandRechts=11221
Simulation von TM durch WHILE (C/rechts)
Jeder Rechenschritt der TM besteht (gem¨ass ¨Uberf¨uhrungsfunktion) aus (A) Update von Zustand
(B) Update von Symbol unterm Kopf (C) Bewegung des Kopfes L,R,N
Der Kopf wird einen Schritt nach rechts (R) bewegt, indem man das folgende Programmst¨uck ausf¨uhrt:
BandLinks:=10×BandLinks+UntermKopf;
UntermKopf :=BandRechts MOD 10;
BandRechts:=BandRechts DIV 10;
Simulation von TM durch WHILE (C/nichts)
Jeder Rechenschritt der TM besteht (gem¨ass ¨Uberf¨uhrungsfunktion) aus (A) Update von Zustand
(B) Update von Symbol unterm Kopf (C) Bewegung des Kopfes L,R,N
Der Kopf wird nicht bewegt (N),
indem man gar nichts macht und alle Variablen unver¨andert l¨asst:
Grobstruktur der Simulation (1)
Schlussendlich die Grobstruktur der Simulation:
Initialisierung Schleifenstruktur
Initialisierung Zustand:=1;
BandLinks:=0;
UntermKopf :=Erstes Symbol im Eingabewort (als Dezimalziffer);
BandRechts:=Restliches Eingabewort (dezimal & gespiegelt);
Grobstruktur der Simulation (2)
Die ¨aussere Schleife
WHILE Zustand6=0 DO
IF Zustand=1 AND UntermKopf=0 THEN SchrittENDIF;
IF Zustand=1 AND UntermKopf=1 THEN SchrittENDIF;
IF Zustand=1 AND UntermKopf=2 THEN SchrittENDIF;
IF Zustand=2 AND UntermKopf=0 THEN SchrittENDIF;
IF Zustand=2 AND UntermKopf=1 THEN SchrittENDIF;
IF Zustand=2 AND UntermKopf=2 THEN SchrittENDIF;
IF Zustand=3 AND UntermKopf=0 THEN SchrittENDIF;
... ... ... ...
... ... ... ...
IF Zustand=tAND UntermKopf=0 THEN SchrittENDIF;
IF Zustand=tAND UntermKopf=1 THEN SchrittENDIF;
IF Zustand=tAND UntermKopf=2 THEN SchrittENDIF;
ENDWHILE
Die Ackermann Funktion
Ackermann Funktion: Definition
Definition
Die Ackermann FunktionA:N2→Nist folgendermassen definiert:
A(0,n) = n+1 f¨urn≥0 A(m+1,0) = A(m,1) f¨urm≥0 A(m+1,n+1) = A(m,A(m+1,n)) f¨urm,n≥0
Ackermann Funktion: Beispiele (1)
A(0,n) = n+1 f¨urn≥0 A(m+1,0) = A(m,1) f¨urm≥0 A(m+1,n+1) = A(m,A(m+1,n)) f¨urm,n≥0
Ein paar Beispiele f¨urm=1:
A(1,0) =A(0,1) =2
A(1,1) =A(0,A(1,0)) =A(1,0) +1=3 A(1,2) =A(0,A(1,1)) =A(1,1) +1=4 A(1,3) =A(0,A(1,2)) =A(1,2) +1=5 Beobachtung
A(1,n) =n+2
Ackermann Funktion: Beispiele (1)
A(0,n) = n+1 f¨urn≥0 A(m+1,0) = A(m,1) f¨urm≥0 A(m+1,n+1) = A(m,A(m+1,n)) f¨urm,n≥0
Ein paar Beispiele f¨urm=1:
A(1,0) =A(0,1) =2
A(1,1) =A(0,A(1,0)) =A(1,0) +1=3 A(1,2) =A(0,A(1,1)) =A(1,1) +1=4 A(1,3) =A(0,A(1,2)) =A(1,2) +1=5
Beobachtung A(1,n) =n+2
Ackermann Funktion: Beispiele (1)
A(0,n) = n+1 f¨urn≥0 A(m+1,0) = A(m,1) f¨urm≥0 A(m+1,n+1) = A(m,A(m+1,n)) f¨urm,n≥0
Ein paar Beispiele f¨urm=1:
A(1,0) =A(0,1) =2
A(1,1) =A(0,A(1,0)) =A(1,0) +1=3 A(1,2) =A(0,A(1,1)) =A(1,1) +1=4 A(1,3) =A(0,A(1,2)) =A(1,2) +1=5
Beobachtung A(1,n) =
n+2
Ackermann Funktion: Beispiele (1)
A(0,n) = n+1 f¨urn≥0 A(m+1,0) = A(m,1) f¨urm≥0 A(m+1,n+1) = A(m,A(m+1,n)) f¨urm,n≥0
Ein paar Beispiele f¨urm=1:
A(1,0) =A(0,1) =2
A(1,1) =A(0,A(1,0)) =A(1,0) +1=3 A(1,2) =A(0,A(1,1)) =A(1,1) +1=4 A(1,3) =A(0,A(1,2)) =A(1,2) +1=5 Beobachtung
A(1,n) =n+2
Ackermann Funktion: Beispiele (2)
A(0,n) = n+1 f¨urn≥0 A(m+1,0) = A(m,1) f¨urm≥0 A(m+1,n+1) = A(m,A(m+1,n)) f¨urm,n≥0
Ein paar Beispiele f¨urm=2:
A(2,0) =A(1,1) =3
A(2,1) =A(1,A(2,0)) =A(2,0) +2=5 A(2,2) =A(1,A(2,1)) =A(2,1) +2=7 A(2,3) =A(1,A(2,2)) =A(2,2) +2=9 Beobachtung
A(2,n) =2n+3
Ackermann Funktion: Beispiele (2)
A(0,n) = n+1 f¨urn≥0 A(m+1,0) = A(m,1) f¨urm≥0 A(m+1,n+1) = A(m,A(m+1,n)) f¨urm,n≥0
Ein paar Beispiele f¨urm=2:
A(2,0) =A(1,1) =3
A(2,1) =A(1,A(2,0)) =A(2,0) +2=5 A(2,2) =A(1,A(2,1)) =A(2,1) +2=7 A(2,3) =A(1,A(2,2)) =A(2,2) +2=9
Beobachtung A(2,n) =
2n+3
Ackermann Funktion: Beispiele (2)
A(0,n) = n+1 f¨urn≥0 A(m+1,0) = A(m,1) f¨urm≥0 A(m+1,n+1) = A(m,A(m+1,n)) f¨urm,n≥0
Ein paar Beispiele f¨urm=2:
A(2,0) =A(1,1) =3
A(2,1) =A(1,A(2,0)) =A(2,0) +2=5 A(2,2) =A(1,A(2,1)) =A(2,1) +2=7 A(2,3) =A(1,A(2,2)) =A(2,2) +2=9 Beobachtung
A(2,n) =2n+3
Ackermann Funktion: Beispiele (3)
A(0,n) = n+1 f¨urn≥0 A(m+1,0) = A(m,1) f¨urm≥0 A(m+1,n+1) = A(m,A(m+1,n)) f¨urm,n≥0
Und ein paar Beispiele f¨urm=3:
A(3,0) =A(2,1) =5
A(3,1) =A(2,A(3,0)) =2·A(3,0) +3=13 A(3,2) =A(2,A(3,1)) =2·A(3,1) +3=29 A(3,3) =A(2,A(3,2)) =2·A(3,2) +3=61 Beobachtung
A(3,n) =2n+3−3
Ackermann Funktion: Beispiele (3)
A(0,n) = n+1 f¨urn≥0 A(m+1,0) = A(m,1) f¨urm≥0 A(m+1,n+1) = A(m,A(m+1,n)) f¨urm,n≥0
Und ein paar Beispiele f¨urm=3:
A(3,0) =A(2,1) =5
A(3,1) =A(2,A(3,0)) =2·A(3,0) +3=13 A(3,2) =A(2,A(3,1)) =2·A(3,1) +3=29 A(3,3) =A(2,A(3,2)) =2·A(3,2) +3=61 Beobachtung
A(3,n) =
2n+3−3
Ackermann Funktion: Beispiele (3)
A(0,n) = n+1 f¨urn≥0 A(m+1,0) = A(m,1) f¨urm≥0 A(m+1,n+1) = A(m,A(m+1,n)) f¨urm,n≥0
Und ein paar Beispiele f¨urm=3:
A(3,0) =A(2,1) =5
A(3,1) =A(2,A(3,0)) =2·A(3,0) +3=13 A(3,2) =A(2,A(3,1)) =2·A(3,1) +3=29 A(3,3) =A(2,A(3,2)) =2·A(3,2) +3=61 Beobachtung
A(3,n) =2n+3−3
Ackermann Funktion: Zusammenfassung der Beispiele
Wenn man den ersten Parameter fixiert:
A(1,n) =n+2 A(2,n) =2n+3 A(3,n) =2n+3−3 A(4,n) = 22··
·2
| {z } n+3 viele
Zweien
−3
Bereits der Wert A(4,2) =265536−3
ist gr¨osser als die Anzahl aller Atome im Weltraum.
“Wovon man nicht sprechen kann, dar¨uber muss man schweigen.”
Exkurs: UpArrow-Notation (1)
Addition ist iterierte Nachfolgerbildung:
S(S(. . .(S(a). . .)
| {z }
bmal
= a+b
Multiplikation ist iterierte Addition: a+· · ·+a
| {z }
bmal
= a×b
Potenzierung ist iterierte Multiplikation: a× · · · ×a
| {z }
bmal
= ab =: a↑b
Der Potenzturm ist iterierte Potenzierung: aa. .
.a
| {z }
bmal
=: a↑↑b
Wiederholte Potenzturmbildung gibt a↑↑a↑↑. . .↑↑a
| {z }
bmal
=: a↑↑↑b
Exkurs: UpArrow-Notation (1)
Addition ist iterierte Nachfolgerbildung:
S(S(. . .(S(a). . .)
| {z }
bmal
= a+b
Multiplikation ist iterierte Addition:
a+· · ·+a
| {z }
bmal
= a×b
Potenzierung ist iterierte Multiplikation: a× · · · ×a
| {z }
bmal
= ab =: a↑b
Der Potenzturm ist iterierte Potenzierung: aa. .
.a
| {z }
bmal
=: a↑↑b
Wiederholte Potenzturmbildung gibt a↑↑a↑↑. . .↑↑a
| {z }
bmal
=: a↑↑↑b
Exkurs: UpArrow-Notation (1)
Addition ist iterierte Nachfolgerbildung:
S(S(. . .(S(a). . .)
| {z }
bmal
= a+b
Multiplikation ist iterierte Addition:
a+· · ·+a
| {z }
bmal
= a×b
Potenzierung ist iterierte Multiplikation:
a× · · · ×a
| {z }
bmal
= ab =: a↑b
Der Potenzturm ist iterierte Potenzierung: aa. .
.a
| {z }
bmal
=: a↑↑b
Wiederholte Potenzturmbildung gibt a↑↑a↑↑. . .↑↑a
| {z }
bmal
=: a↑↑↑b
Exkurs: UpArrow-Notation (1)
Addition ist iterierte Nachfolgerbildung:
S(S(. . .(S(a). . .)
| {z }
bmal
= a+b
Multiplikation ist iterierte Addition:
a+· · ·+a
| {z }
bmal
= a×b
Potenzierung ist iterierte Multiplikation:
a× · · · ×a
| {z }
bmal
= ab =: a↑b
Der Potenzturm ist iterierte Potenzierung:
aa. .
.a
| {z }
bmal
=: a↑↑b
Wiederholte Potenzturmbildung gibt a↑↑a↑↑. . .↑↑a
| {z }
bmal
=: a↑↑↑b
Exkurs: UpArrow-Notation (1)
Addition ist iterierte Nachfolgerbildung:
S(S(. . .(S(a). . .)
| {z }
bmal
= a+b
Multiplikation ist iterierte Addition:
a+· · ·+a
| {z }
bmal
= a×b
Potenzierung ist iterierte Multiplikation:
a× · · · ×a
| {z }
bmal
= ab =: a↑b
Der Potenzturm ist iterierte Potenzierung:
aa. .
.a
| {z }
bmal
=: a↑↑b
Wiederholte Potenzturmbildung gibt a↑↑a↑↑. . .↑↑a
| {z }
bmal
=: a↑↑↑b
Exkurs: UpArrow-Notation (2)
Definition (UpArrow-Notation von Donald Knuth)
a↑mb :=
1 wennb=0
a·b wennm=0
ab wennm=1
a↑m−1(a↑m(b−1)) sonst
Es gilt:
A(1,n) =2+ (n+3)−3 A(2,n) =2·(n+3)−3 A(3,n) =2↑(n+3)−3 A(4,n) =2↑↑(n+3)−3 A(5,n) =2↑↑↑(n+3)−3 ...
A(m,n) =2↑m−2(n+3)−3 f¨urm≥2
Exkurs: UpArrow-Notation (2)
Definition (UpArrow-Notation von Donald Knuth)
a↑mb :=
1 wennb=0
a·b wennm=0
ab wennm=1
a↑m−1(a↑m(b−1)) sonst Es gilt:
A(1,n) =2+ (n+3)−3 A(2,n) =2·(n+3)−3 A(3,n) =2↑(n+3)−3 A(4,n) =2↑↑(n+3)−3 A(5,n) =2↑↑↑(n+3)−3 ...
A(m,n) =2↑m−2(n+3)−3 f¨urm≥2