• Keine Ergebnisse gefunden

VL-11: LOOP und WHILE Programme I (Berechenbarkeit und Komplexit¨at, WS 2017) Gerhard Woeginger

N/A
N/A
Protected

Academic year: 2022

Aktie "VL-11: LOOP und WHILE Programme I (Berechenbarkeit und Komplexit¨at, WS 2017) Gerhard Woeginger"

Copied!
74
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

VL-11: LOOP und WHILE Programme I (Berechenbarkeit und Komplexit¨ at, WS 2017)

Gerhard Woeginger

(2)

Organisatorisches

N¨achste Vorlesung:

Mittwoch, November 29, 14:15–15:45 Uhr, Roter H¨orsaal Webseite:

http://algo.rwth-aachen.de/Lehre/WS1718/BuK.php

(3)

Wiederholung

(4)

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

(5)

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 viel schw¨achere Variante der RAM mit stark eingeschr¨anktem Befehlssatz) ist Turing-m¨achtig

(6)

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 Kurt G¨odel 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 (wegen seiner Animated Features)

(7)

Vorlesung VL-11

LOOP und WHILE Programme I

Die Programmiersprache LOOP Die Programmiersprache WHILE WHILE versus LOOP

WHILE ist Turing-m¨achtig

(8)

Die Programmiersprache LOOP

(9)

Programmiersprache LOOP

Wir betrachten eine einfache Programmiersprache namens LOOP, deren Programme aus den folgenden syntaktischen Komponenten aufgebaut sind:

Variablen: x1 x2 x3 . . . Konstanten: 0 1 2 . . . Symbole: ; := + −

Schl¨usselw¨orter: LOOP DO ENDLOOP

(10)

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.

(11)

LOOP / Syntax (2)

Induktive Definition / Induktionsschritte:

Hintereinanderausf¨uhrung

FallsP1und 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.

(12)

LOOP / Syntax (2)

Induktive Definition / Induktionsschritte:

Hintereinanderausf¨uhrung

FallsP1und 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.

(13)

LOOP / Semantik (1): Zuweisungen

Die Eingabe ist in den Variablen x1, . . . ,xn enthalten.

Alle anderen Variablen werden mit0initialisiert.

Das Resultat eines LOOP-Programms ist die Zahl, die sich am Ende der Abbarbeitung in der Variablen x1ergibt.

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.

(14)

LOOP / Semantik (1): Zuweisungen

Die Eingabe ist in den Variablen x1, . . . ,xn enthalten.

Alle anderen Variablen werden mit0initialisiert.

Das Resultat eines LOOP-Programms ist die Zahl, die sich am Ende der Abbarbeitung in der Variablen x1ergibt.

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.

(15)

LOOP / Semantik (1): Zuweisungen

Die Eingabe ist in den Variablen x1, . . . ,xn enthalten.

Alle anderen Variablen werden mit0initialisiert.

Das Resultat eines LOOP-Programms ist die Zahl, die sich am Ende der Abbarbeitung in der Variablen x1ergibt.

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.

(16)

LOOP / Semantik (2): Hintereinanderausf¨ uhrung

Die Eingabe ist in den Variablen x1, . . . ,xn enthalten.

Alle anderen Variablen werden mit0initialisiert.

Das Resultat eines LOOP-Programms ist die Zahl, die sich am Ende der Abbarbeitung in der Variablen x1ergibt.

In einem LOOP-ProgrammP1;P2

wird zun¨achstP1und danachP2ausgef¨uhrt.

(17)

LOOP / Semantik (3): LOOP-Konstrukte

Die Eingabe ist in den Variablen x1, . . . ,xn enthalten.

Alle anderen Variablen werden mit0initialisiert.

Das Resultat eines LOOP-Programms ist die Zahl, die sich am Ende der Abbarbeitung in der Variablen x1ergibt.

Das ProgrammLOOPxi DOP ENDLOOPhat folgende Bedeutung:

P wirdxi mal hintereinander ausgef¨uhrt.

Anmerkung: Nur der Wert vonxi zu Beginn der Schleifeist relevant.

Andert sich der Variablenwert von¨ xi im Inneren vonP,

(18)

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 DOQENDLOOPein LOOP-Konstrukt, so gilt[P](r1, . . . ,rk) = [Q]ri(r1, . . . ,rk).

(19)

LOOP: Beispiele und Macros

(20)

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

(21)

LOOP-Programme / Beispiele (2)

Beispiel C

x1:=x2;

LOOPx3DOx1:=x1+1 ENDLOOP

Dieses Programm berechnet die Additionx1:=x2+x3

Beispiel D

x1:=0;

LOOPx3DOx1:=x1+x2 ENDLOOP Dieses Programm berechnet die Multiplikationx1:=x2·x3

(22)

LOOP-Programme / Beispiele (2)

Beispiel C

x1:=x2;

LOOPx3DOx1:=x1+1 ENDLOOP Dieses Programm berechnet die Additionx1:=x2+x3

Beispiel D

x1:=0;

LOOPx3DOx1:=x1+x2 ENDLOOP Dieses Programm berechnet die Multiplikationx1:=x2·x3

(23)

LOOP-Programme / Beispiele (2)

Beispiel C

x1:=x2;

LOOPx3DOx1:=x1+1 ENDLOOP Dieses Programm berechnet die Additionx1:=x2+x3

Beispiel D

x1:=0;

LOOPx3DOx1:=x1+x2 ENDLOOP

Dieses Programm berechnet die Multiplikationx1:=x2·x3

(24)

LOOP-Programme / Beispiele (2)

Beispiel C

x1:=x2;

LOOPx3DOx1:=x1+1 ENDLOOP Dieses Programm berechnet die Additionx1:=x2+x3

Beispiel D

x1:=0;

LOOPx3DOx1:=x1+x2 ENDLOOP Dieses Programm berechnet die Multiplikationx1:=x2·x3

(25)

LOOP-Programme / Beispiele (3)

Ubung¨

Skizzieren Sie LOOP-Programme, die die folgenden Operationen berechnen:

Die modifizierte Subtraktionx1:=x2−x3 (die f¨urx2<x3den Wert0ergibt) Die Division ohne Restx1:=x2DIVx3 Die Modulooperationx1:=x2MODx3

(26)

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: IFx1=0 THEN P1 ELSEP2ENDIF Ubung¨

Skizzieren Sie ein LOOP-Programm,

das“IFx1=c THENP1ELSEP2 ENDIF”simuliert.

(27)

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:

IFx1=0 THEN P1 ELSEP2ENDIF

Ubung¨

Skizzieren Sie ein LOOP-Programm,

das“IFx1=c THENP1ELSEP2 ENDIF”simuliert.

(28)

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:

IFx1=0 THEN P1 ELSEP2ENDIF Ubung¨

Skizzieren Sie ein LOOP-Programm,

das“IFx1=c THENP1ELSEP2 ENDIF”simuliert.

(29)

Die Programmiersprache WHILE

(30)

Programmiersprache WHILE

Die Programme der Programmiersprache WHILE sind aus den folgenden syntaktischen Komponenten aufgebaut:

Variablen: x1 x2 x3 . . . Konstanten: 0 1 2 . . . Symbole: ; := + − 6=

Schl¨usselw¨orter: WHILE DO ENDWHILE

(31)

WHILE / Syntax

Die Syntax von WHILE ist induktiv definiert, und stimmt weitgehend mit der Syntax von LOOP ¨uberein.

Zuweisungenxi := xj+c und xi := xj−c und

Hintereinanderausf¨uhrungP1; P2sind genau wie in LOOP definiert.

Der Hauptunterschied zu LOOP besteht im Schleifen-Konstrukt.

WHILE-Konstrukt

FallsP ein WHILE-Programm ist und xi eine Variable, so ist auch WHILExi6=0 DOP ENDWHILE

(32)

WHILE / Semantik

Die Eingabe ist in den Variablen x1, . . . ,xn enthalten.

Alle anderen Variablen werden mit0initialisiert.

Das Resultat eines WHILE-Programms ist die Zahl, die sich am Ende der Abbarbeitung in der Variablenx1 ergibt.

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](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.

(33)

WHILE / Semantik

Die Eingabe ist in den Variablen x1, . . . ,xn enthalten.

Alle anderen Variablen werden mit0initialisiert.

Das Resultat eines WHILE-Programms ist die Zahl, die sich am Ende der Abbarbeitung in der Variablenx1 ergibt.

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=WHILEx 6=0 DOQ ENDWHILE ein WHILE-Konstrukt,

(34)

WHILE versus LOOP

(35)

WHILE versus LOOP (1)

Beobachtung Die LOOP-Schleife

LOOPxi DOP ENDLOOP

kann durch die folgende WHILE-Schleife simuliert werden:

y :=xi

WHILEy 6=0 DOy :=y−1; P ENDWHILE

Ergo: Jede LOOP-berechenbare Funktionf:Nk →Nist auch WHILE-berechenbar.

(36)

WHILE versus LOOP (1)

Beobachtung Die LOOP-Schleife

LOOPxi DOP ENDLOOP

kann durch die folgende WHILE-Schleife simuliert werden:

y :=xi

WHILEy 6=0 DOy :=y−1; P ENDWHILE

Ergo: Jede LOOP-berechenbare Funktionf:Nk →Nist auch WHILE-berechenbar.

(37)

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. Hintereinanderausf¨uhrungP=P1;P2

LOOP-KonstruktP =LOOPxi DOQ ENDLOOP

(38)

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.

Hintereinanderausf¨uhrungP=P1;P2

LOOP-KonstruktP =LOOPxi DOQ ENDLOOP

(39)

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.

(40)

M¨ achtigkeit von WHILE

(41)

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.

(42)

Simulation von TM durch WHILE (1)

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 Buchstaben 1 durch Dezimalziffer 1, Buchstaben 2 durch Dezimalziffer 2, und BuchstabenB durch Dezimalziffer 0.

Alle WHILE Variablen enthalten im Folgenden Dezimalzahlen

(43)

Simulation von TM durch WHILE (1)

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 Buchstaben 1 durch Dezimalziffer 1, Buchstaben 2 durch Dezimalziffer 2, und BuchstabenB durch Dezimalziffer 0.

Alle WHILE Variablen enthalten im Folgenden Dezimalzahlen

(44)

Simulation von TM durch WHILE (1)

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 Buchstaben 1 durch Dezimalziffer 1, Buchstaben 2 durch Dezimalziffer 2, und BuchstabenB durch Dezimalziffer 0.

Alle WHILE Variablen enthalten im Folgenden Dezimalzahlen

(45)

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 Drei entsprechende Variablen im WHILE-Programm:

Band-vor-Kopf Zustand

1122 3

Variable BandVorKopf Variable Zustand

(46)

Simulation von TM durch WHILE (2)

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 Das Symbol unterm Kopf erhalten wir durch den Befehl UntermKopf:=BandAbKopf MOD 10

(47)

Simulation von TM durch WHILE (2)

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 Das Symbol unterm Kopf erhalten wir durch den Befehl

(48)

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

(49)

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+σ;

(50)

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;

(51)

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;

(52)

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:

(53)

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=tAND UntermKopf=2 THEN SchrittENDIF; ENDWHILE

(54)

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=tAND UntermKopf=2 THEN SchrittENDIF;

ENDWHILE

(55)

Ausblick: Landschaft um LOOP, WHILE, TM, RAM

TM = RAM = WHILE = entscheidbar

LOOP = primitiv rekursiv + − × ab ab kn

A(m,n)

(56)

Die Ackermann Funktion

(57)

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

(58)

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

(59)

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

(60)

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

(61)

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

(62)

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

(63)

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

(64)

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

(65)

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

(66)

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

(67)

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

2n+3

(68)

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

(69)

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

(70)

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

(71)

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

(72)

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

(73)

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

(74)

Ackermann Funktion: Beispiele (4)

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.

Referenzen

ÄHNLICHE DOKUMENTE

WHILE ist Turing-m¨ achtig Die Ackermann Funktion.. Die Programmiersprache LOOP.. ¨ Andert sich der Wert von x i im Inneren von P, so hat dies keinen Einfluss auf die Anzahl

Das Symbol unterm Kopf wird auf neues Symbol σ ∈ {0, 1, 2} gesetzt, indem man das folgende Programmst¨ uck ausf¨ uhrt:. UntermKopf

Zwecks Widerspruchs nehmen wir an, dass die Ackermann Funktion LOOP-berechenbar ist.. Die M¨ achtigkeit von

Eigenschaften der Ackermann Funktion Ackermann Funktion und LOOP Programme Primitive Rekursion.. BuK/WS 2019 VL-10: LOOP und WHILE Programme

F¨ ur eine abz¨ ahlbar unendliche Menge M gibt es immer auch eine bijektive (bijektiv = surjektiv+injektiv) Abbildung c : N → M: Wiederholungen von Elementen von M k¨ onnen bei der

Tabellenkalkulationen (ohne Schleifen) sind nicht Turing-m¨ achtig Der Lambda Calculus von Alonzo Church ist ¨ aquivalent zur TM, und daher Turing-m¨ achtig. Die µ-rekursiven

I Das Symbol unterm Kopf erhalten wir durch den Befehl UntermKopf := BandAbKopf MOD 10. BuK/WS 2017 VL-11: LOOP und WHILE Programme

Eigenschaften der Ackermann Funktion Ackermann Funktion und LOOP-Programme Primitiv rekursive Funktionen... M¨ achtigkeit