VL-11: LOOP und WHILE Programme I
(Berechenbarkeit und Komplexit¨ at, WS 2017) Gerhard Woeginger
WS 2017, RWTH
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 1/46
Organisatorisches
I N¨achste Vorlesung:
Mittwoch, November 29, 14:15–15:45 Uhr, Roter H¨orsaal
I Webseite:
http://algo.rwth-aachen.de/Lehre/WS1718/BuK.php
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 2/46
Wiederholung
Wdh.: Berechenbarkeitslandschaft
rekursiv aufz¨ahlbare
Probleme
H
H D
Probleme mit rekursiv aufz¨ahlbarem Komplement H H D Entscheidbare
Probleme
Unentscheidbare Probleme mit unentscheidbarem Komplement Htot
MPCP 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.
I Da die Registermaschine (RAM) die Turingmaschine simulieren kann, ist sie Turing-m¨achtig
I Auch die Mini-RAM (eine viel schw¨achere Variante der RAM mit stark eingeschr¨anktem Befehlssatz) ist Turing-m¨achtig
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 5/46
Wdh.: Turing-M¨ achtigkeit
I Reines HTML (ohne JavaScript; ohne Browser) ist nicht Turing-m¨achtig
I Tabellenkalkulationen (ohne Schleifen) sind nichtTuring-m¨achtig
I Der Lambda Calculus von Alonzo Church ist ¨aquivalent zur TM, und daher Turing-m¨achtig
I Die µ-rekursiven Funktionen von Kurt G¨odel sind ¨aquivalent zur TM, und daher Turing-m¨achtig
I Alle g¨angigen h¨oheren Programmiersprachen sind Turing-m¨achtig:
Algol, Pascal, C, FORTRAN, COBOL, Java, Smalltalk, Ada, C++, Python, LISP, Haskell, PROLOG, etc.
I PostScript, Tex, Latex sind Turing-m¨achtig
I Sogar PowerPoint ist Turing-m¨achtig (wegen seiner Animated Features)
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 6/46
Vorlesung VL-11
LOOP und WHILE Programme I
IDie Programmiersprache LOOP IDie Programmiersprache WHILE IWHILE versus LOOP
IWHILE ist Turing-m¨achtig
Die Programmiersprache LOOP
Programmiersprache LOOP
Wir betrachten eine einfache Programmiersprache namens LOOP, deren Programme aus den folgenden syntaktischen Komponenten aufgebaut sind:
I Variablen: x1 x2 x3 . . .
I Konstanten: 0 1 2 . . .
I Symbole: ; := + −
I Schl¨usselw¨orter: LOOP DO ENDLOOP
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 9/46
LOOP / Syntax (1)
Die Syntax von LOOP ist induktiv definiert.
Induktive Definition / Induktionsanfang:
Zuweisungen
F¨ur jede Konstantec ∈Nsind die Zuweisungen xi := xj+c und
xi := xj−c LOOP-Programme.
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 10/46
LOOP / Syntax (2)
Induktive Definition / Induktionsschritte:
Hintereinanderausf¨uhrung
FallsP1 und P2 LOOP-Programme sind, so ist auch P1; P2
ein LOOP-Programm.
LOOP-Konstrukt
FallsP ein LOOP-Programm ist, so ist auch LOOPxi DOP ENDLOOP
ein LOOP-Programm.
LOOP / Semantik (1): Zuweisungen
I Die Eingabe ist in den Variablenx1, . . . ,xn enthalten.
I Alle anderen Variablen werden mit 0initialisiert.
I Das Resultat eines LOOP-Programms ist die Zahl, die sich am Ende der Abbarbeitung in der Variablenx1 ergibt.
LOOP-Programme der Formxi :=xj+c
sind Zuweisungen des Wertesxj+c an die Variablexi.
LOOP-Programme der Formxi :=xj−c
sind Zuweisungen des Wertesxj−c an die Variablexi.
Anmerkung: Die Variablen d¨urfen nur nat¨urliche Werte annehmen.
Daher verwenden wir diemodifizierteSubtraktion:
Fallsxj <c gilt, so wird das Resultatxi auf0gesetzt.
LOOP / Semantik (2): Hintereinanderausf¨ uhrung
I Die Eingabe ist in den Variablenx1, . . . ,xn enthalten.
I Alle anderen Variablen werden mit0initialisiert.
I Das Resultat eines LOOP-Programms ist die Zahl, die sich am Ende der Abbarbeitung in der Variablenx1 ergibt.
In einem LOOP-ProgrammP1;P2
wird zun¨achstP1 und danachP2 ausgef¨uhrt.
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 13/46
LOOP / Semantik (3): LOOP-Konstrukte
I Die Eingabe ist in den Variablenx1, . . . ,xn enthalten.
I Alle anderen Variablen werden mit 0initialisiert.
I Das Resultat eines LOOP-Programms ist die Zahl, die sich am Ende der Abbarbeitung in der Variablenx1 ergibt.
Das ProgrammLOOPxi DOP ENDLOOPhat folgende Bedeutung:
P wirdxi mal hintereinander ausgef¨uhrt.
Anmerkung: Nur der Wert vonxi zu Beginn der Schleife ist relevant.
Andert sich der Variablenwert von¨ xi im Inneren vonP,
so hat dies keinen Einfluss auf die Anzahl der Wiederholungen.
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 14/46
LOOP / Semantik (4)
Ein LOOP-ProgrammP mitk Variablen
berechnet einek-stellige Funktion der Form[P] :Nk →Nk. IstP die Zuweisungxi:=xj+c,
so ist [P](r1, . . . ,rk) = (r1, . . . ,ri−1,rj+c,ri+1, . . . ,rk).
IstP die Zuweisungxi:=xj−c,
ist [P](r1, . . . ,rk) = (r1, . . . ,ri−1,rj−c,ri+1, . . . ,rk)fallsrj ≥c, und andernfalls[P](r1, . . . ,rk) = (r1, . . . ,ri−1,0,ri+1, . . . ,rk).
IstP =P1;P2 eine Hintereinanderausf¨uhrung, so ist [P](r1, . . . ,rk) = [P2]([P1](r1, . . . ,rk)).
IstP =LOOPxi DOQ ENDLOOPein LOOP-Konstrukt, so gilt [P](r1, . . . ,rk) = [Q]ri(r1, . . . ,rk).
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 Programm simuliert dann die Zuweisungxj:=c eines konstanten Wertes an eine Variable.
Beispiel B
xj :=xzero+c
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 17/46
LOOP-Programme / Beispiele (2)
Beispiel C
x1:=x2;
LOOPx3 DOx1:=x1+1 ENDLOOP Dieses Programm berechnet die Additionx1:=x2+x3
Beispiel D
x1:=0;
LOOPx3 DOx1:=x1+x2ENDLOOP Dieses Programm berechnet die Multiplikationx1:=x2·x3
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 18/46
LOOP-Programme / Beispiele (3)
Ubung ¨
Skizzieren Sie LOOP-Programme, die die folgenden Operationen berechnen:
I Die modifizierte Subtraktionx1:=x2−x3
(die f¨ur x2<x3 den Wert0ergibt)
I Die Division ohne Restx1:=x2 DIVx3
I Die Modulooperationx1:=x2 MODx3
LOOP-Programme / Beispiele (4)
Es seienP1 undP2 LOOP-Programme, in denen die drei Variablenx1,x2 undx3 nicht vorkommen.
Beispiel E
x2:=1; x3:=0;
LOOPx1 DOx2:=0;x3:=1 ENDLOOP;
LOOPx2 DOP1ENDLOOP;
LOOPx3 DOP2ENDLOOP Dieses Programm entspricht dem Konstrukt:
IFx1=0 THENP1 ELSEP2 ENDIF
Ubung ¨
Skizzieren Sie ein LOOP-Programm,
das“IFx1=c THENP1 ELSEP2 ENDIF”simuliert.
Die Programmiersprache WHILE
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 21/46
Programmiersprache WHILE
Die Programme der Programmiersprache WHILE sind aus den folgenden syntaktischen Komponenten aufgebaut:
I Variablen: x1 x2 x3 . . .
I Konstanten: 0 1 2 . . .
I Symbole: ; := + − 6=
I Schl¨usselw¨orter: WHILE DO ENDWHILE
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 22/46
WHILE / Syntax
I Die Syntax von WHILE ist induktiv definiert, und stimmt weitgehend mit der Syntax von LOOP ¨uberein.
I Zuweisungenxi := xj+c undxi := xj−c und
Hintereinanderausf¨uhrungP1; P2sind genau wie in LOOP definiert.
I Der Hauptunterschied zu LOOP besteht im Schleifen-Konstrukt.
WHILE-Konstrukt
FallsP ein WHILE-Programm ist undxi eine Variable, so ist auch WHILExi 6=0 DOP ENDWHILE
ein WHILE-Programm.
WHILE / Semantik
I Die Eingabe ist in den Variablenx1, . . . ,xn enthalten.
I Alle anderen Variablen werden mit 0initialisiert.
I Das Resultat eines WHILE-Programms ist die Zahl, die sich am Ende der Abbarbeitung in der Variablenx1 ergibt.
Das ProgrammWHILExi 6=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=WHILExi 6=0 DOQ ENDWHILEein WHILE-Konstrukt,
so ist[P](r1, . . . ,rk) = [Q]`(r1, . . . ,rk)f¨ur die kleinste Zahl`, f¨ur die diei-te Komponente von[Q]`(r1, . . . ,rk)gleich0ist.
Falls solch ein` nicht existiert, so ist[P](r1, . . . ,rk)undefiniert.
WHILE versus LOOP
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 25/46
WHILE versus LOOP (1)
Beobachtung
Die LOOP-Schleife
LOOPxi DOP ENDLOOP
kann durch die folgende WHILE-Schleife simuliert werden:
y :=xi
WHILE y6=0 DOy :=y−1; P ENDWHILE
Ergo: Jede LOOP-berechenbare Funktionf:Nk →Nist auch WHILE-berechenbar.
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 26/46
WHILE versus LOOP (2)
Es gibt WHILE-Programme, die nicht terminieren:
Beispiel
x1:=1;
WHILEx16=0 DOx1:=x1+1 ENDWHILE
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 Syntax-Baum.
IHintereinanderausf¨uhrungP=P1;P2
ILOOP-KonstruktP=LOOPxiDOQENDLOOP
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 berechenbare Funktion, die von keinem LOOP-Programm berechnet werden kann.)
M¨ achtigkeit von WHILE
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 29/46
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.
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 30/46
Simulation von TM durch WHILE (1)
Wir betrachten eine TMM.
I ZustandsmengeQ={q0, . . . ,qt}
I Der Anfangszustand istq1, und der Endzustand istq0
I TM im Zustandqi ⇐⇒ WHILE Variable Zustand=i
I BandalphabetΓ ={1,2,B}
I WHILE kodiert Buchstaben 1 durch Dezimalziffer 1, Buchstaben 2 durch Dezimalziffer 2, und BuchstabenB durch Dezimalziffer 0.
I Alle WHILE Variablen enthalten im Folgenden Dezimalzahlen
Simulierte Turingmaschine M:
· · ·
· · · 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
Drei entsprechende Variablen im WHILE-Programm:
Band-vor-Kopf Zustand pfoK-ba-danB
1122 3 111212
Variable BandVorKopf Variable Zustand Variable BandAbKopf
Simulation von TM durch WHILE (2)
Jeder Rechenschritt vonM 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
I Aktueller Zustand steht in der VariablenZustand
I Das Symbol unterm Kopf erhalten wir durch den Befehl UntermKopf:=BandAbKopf MOD 10
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 33/46
Simulation von TM durch WHILE (3A)
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 neuen Zustandqi gesetzt, indem man die Zuweisung Zustand:=i ausf¨uhrt
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 34/46
Simulation von TM durch WHILE (3B)
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σ∈ {0,1,2}gesetzt, indem man das folgende Programmst¨uck ausf¨uhrt:
BandAbKopf:=BandAbKopf DIV 10;
BandAbKopf:=10·BandAbKopf+σ;
UntermKopf:= σ;
Simulation von TM durch WHILE (3C-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:
UntermKopf:=BandVorKopf MOD 10;
BandVorKopf:=BandVorKopf DIV 10;
BandAbKopf:=10·BandAbKopf+UntermKopf;
Simulation von TM durch WHILE (3C-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:
UntermKopf:=BandAbKopf MOD 10;
BandVorKopf:=10·BandVorKopf+UntermKopf;
BandAbKopf:=BandAbKopf DIV 10;
UntermKopf:=BandAbKopf MOD 10;
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 37/46
Simulation von TM durch WHILE (3C-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:
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 38/46
Simulation von TM durch WHILE (4)
Schlussendlich die Grobstruktur der Simulation:
Initialisierung
Zustand :=1;
BandVorKopf:=0;
BandAbKopf:=Gespiegeltes Eingabewort als Dezimalzahl;
UntermKopf:=BandAbKopf MOD 10;
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=t AND UntermKopf=2 THEN SchrittENDIF;
ENDWHILE
Ausblick: Landschaft um LOOP, WHILE, TM, RAM
TM = RAM = WHILE = entscheidbar
LOOP = primitiv rekursiv + − × ab ab nk
A(m,n)
Ackermann Funktion
Die Ackermann Funktion
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 41/46
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
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 42/46
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
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
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 45/46
Ackermann Funktion: Beispiele (4)
Zusammenfassung der Beispiele
Wenn man den ersten Parameter fixiert ...
I A(1,n) =n+2
I A(2,n) =2n+3
I A(3,n) =2n+3−3
I 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.
BuK/WS 2017 VL-11: LOOP und WHILE Programme I 46/46