VL-11: LOOP und WHILE Programme I. (Berechenbarkeit und Komplexität, WS 2017) Gerhard Woeginger

Ähnliche Dokumente
Mächtigkeit von WHILE-Programmen

Syntax von LOOP-Programmen

1 Einführung. 2 Typ-0- und Typ-1-Sprachen. 3 Berechnungsmodelle. 4 Unentscheidbarkeit. 5 Unentscheidbare Probleme. 6 Komplexitätstheorie

Zusammenfassung Grundzüge der Informatik 4

2.4 Kontextsensitive und Typ 0-Sprachen

Turing-Maschinen. Definition 1. Eine deterministische Turing-Maschine (kurz DTM) ist ein 6- Dem endlichen Alphabet Σ von Eingabesymbolen.

Theoretische Grundlagen der Informatik

11.1 Kontextsensitive und allgemeine Grammatiken

Rekursiv aufzählbare Sprachen

2. Berechnungsmächtigkeit von Zellularautomaten. Ziele Simulation von Schaltwerken Simulation von Turingmaschinen

Algorithmen mit konstantem Platzbedarf: Die Klasse REG

Berechenbarkeit und Komplexität

Ausgewählte unentscheidbare Sprachen

Formale Sprachen und Automaten

Rekursive Funktionen Basisfunktionen

8. Turingmaschinen und kontextsensitive Sprachen

GTI. Hannes Diener. 6. Juni Juni. ENC B-0123, diener@math.uni-siegen.de

Kontrollstrukturen, Pseudocode und Modulo-Rechnung

Grundbegriffe der Informatik

Berechenbarkeitstheorie 17. Vorlesung

Kapitel 5: Abstrakte Algorithmen und Sprachkonzepte. Elementare Schritte

Einführung in Berechenbarkeit, Komplexität und formale Sprachen

Algorithmen und Programmierung

Entscheidungsprobleme. Berechenbarkeit und Komplexität Entscheidbarkeit und Unentscheidbarkeit. Die Entscheidbarkeit von Problemen

Lösungen zur 3. Projektaufgabe TheGI1

ALP I Rekursive Funktionen

Referat rekursive Mengen vs. rekursiv-aufzählbare Mengen

2: Zahlentheorie / Restklassen 2.1: Modulare Arithmetik

Theoretische Informatik Testvorbereitung Moritz Resl

Vorlesung Berechenbarkeit und Komplexität. Motivation, Übersicht und Organisatorisches

Sprachen und Automaten. Tino Hempel

Wie viel Mathematik kann ein Computer?

Zahlen in Haskell Kapitel 3

Funktionale Programmierung (in Clojure)

Einführung in die Programmierung WS 2014/ Algorithmus, Berechenbarkeit und Programmiersprachen 2-1

Probeklausur zur Vorlesung Berechenbarkeit und Komplexität

Deterministische Turing-Maschinen (DTM) F3 03/04 p.46/395

Statt (r s) schreiben wir in Zukunft meistens rs, gelegentlich auch (r; s).

Die Programmiersprache Scheme... DrRacket: Die Programmierumgebung Sprache: Semantik. Sprache: Syntax

C.3 Funktionen und Prozeduren

Die Programmiersprache C Eine Einführung

Einführung in die Theoretische Informatik

Informatik II. Registermaschinen. Registermaschinen. Registermaschinen. Rainer Schrader. 7. Dezember 2005

Entwurf von Algorithmen - Kontrollstrukturen

Programmiersprachen. Organisation und Einführung. Berthold Hoffmann. Studiengang Informatik Universität Bremen

Induktive Beweise und rekursive Definitionen

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen. I.2. I.2. Grundlagen von von Programmiersprachen.

Ideen der Informatik. Was ist ein Computer? Was ist ein Programm? Können Computer Alles? Kurt Mehlhorn und Adrian Neumann

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Grundlagen der Informatik II. Teil I: Formale Modelle der Informatik

3. Turingmaschinen FORMALISIERUNG VON ALGORITHMEN. Turingmaschinen Registermaschinen Rekursive Funktionen UNTERSCHEIDUNGSMERKMALE DER ANSÄTZE:

Theoretische Informatik 1

Automaten, Spiele, und Logik

1 Varianten von Turingmaschinen

Programmierkurs Python I

Modul 122 VBA Scribt.docx

Übung Theoretische Grundlagen

1 Vom Problem zum Programm

Python Programmierung. Dipl.-Ing.(FH) Volker Schepper

Dr. Monika Meiler. Inhalt

Infovorkurs, Teil III: Maschinenabstraktion & Ausblick

Übung zu Grundbegriffe der Informatik. Simon Wacker. 15. November 2013

Komplexität von Algorithmen

Grundlagen der Programmierung

FORMALE SYSTEME. Sprachen beschreiben. Wiederholung. Wie kann man Sprachen beschreiben? 2. Vorlesung: Grammatiken und die Chomsky-Hierarchie

Algorithmen und Datenstrukturen 1 Kapitel 4.1

Einführung in die Informatik 1

Algorithmen und ihre Programmierung

1 Σ endliches Terminalalphabet, 2 V endliche Menge von Variablen (mit V Σ = ), 3 P (V (Σ ΣV )) {(S, ε)} endliche Menge von Regeln,

Rekursionsanfang, Rekursionsschritt oder äquivalente Antworten. (z.b.: Abbruchbedingung (= Basisfall), eigentliche Rekursion (= Selbstaufruf))

Kontextsensitive und Typ 0 Sprachen

4.9 Deterministische Kellerautomaten Wir haben bereits definiert: Ein PDA heißt deterministisch (DPDA), falls

Wortproblem für kontextfreie Grammatiken

Einführung in die Informatik für Hörer aller Fakultäten II. Andreas Podelski Stephan Diehl Uwe Waldmann

Einführung in die Programmierung

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Wissensbasierte Systeme

Reduzierbarkeit und das Post'sche Korrespondenzproblem

12. Rekursion Grundlagen der Programmierung 1 (Java)

Datentypen. Agenda für heute, 4. März, Pascal ist eine streng typisierte Programmiersprache

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 2

Stefan Schmid TU Berlin & T-Labs, Berlin, Germany. Reduktionen in der Berechenbarkeitstheorie

Theoretische Grundlagen der Informatik

BuK 2000 Lösungen Übungen

Kontrollstrukturen - Universität Köln

Theoretische Informatik

Formale Methoden 1. Gerhard Jäger 16. Januar Uni Bielefeld, WS 2007/2008 1/19

Programmieren. 10. Tutorium 4./ 5. Übungsblatt Referenzen

Teil V. Weiterführende Themen, Teil 1: Kontextsensitive Sprachen und die Chomsky-Hierarchie

Theoretische Informatik 2

Automaten, Spiele und Logik

Modellierung und Programmierung 1

SWP Prüfungsvorbereitung

5 Der Begriff Berechnungsmodell

a n b n c n ist kontextsensitiv kontextfreie Sprachen (Typ 2) Abschnitt 3.3 kontextfreie Sprachen: Abschlusseigenschaften Chomsky NF und binäre Bäume

1. Einführung Einführung in die Programmierung (fbw) Sommersemester 2008 Prof. Dr. Bernhard Humm Hochschule Darmstadt, fbi

Übung zur Vorlesung Einführung in die Computerlinguistik und Sprachtechnologie

1 Syntax von Programmiersprachen

1. LPC - Lehmanns Programmier Contest - Lehmanns Logo

Theoretische Informatik 2

Transkript:

VL-11: LOOP und WHILE Programme I (Berechenbarkeit und Komplexität, WS 2017) Gerhard Woeginger WS 2017, RWTH BuK/WS 2017 VL-11: LOOP und WHILE Programme I 1/46

Organisatorisches Nächste Vorlesung: Mittwoch, November 29, 14:15 15:45 Uhr, Roter Hörsaal Webseite: http://algo.rwth-aachen.de/lehre/ws1718/buk.php BuK/WS 2017 VL-11: LOOP und WHILE Programme I 2/46

Wiederholung BuK/WS 2017 VL-11: LOOP und WHILE Programme I 3/46

Wdh.: Berechenbarkeitslandschaft PCP rekursiv aufzählbare Probleme H Hɛ D MPCP Dioph Entscheidbare Probleme Probleme mit rekursiv aufzählbarem Komplement D H ɛ H Unentscheidbare Probleme mit unentscheidbarem Komplement H tot BuK/WS 2017 VL-11: LOOP und WHILE Programme I 4/46

Wdh.: Turing-mächtige Rechnermodelle Definition Ein Rechnermodell wird als Turing-mächtig bezeichnet, 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ächtig Auch die Mini-RAM (eine viel schwächere Variante der RAM mit stark eingeschränktem Befehlssatz) ist Turing-mächtig BuK/WS 2017 VL-11: LOOP und WHILE Programme I 5/46

Wdh.: Turing-Mächtigkeit Reines HTML (ohne JavaScript; ohne Browser) ist nicht Turing-mächtig Tabellenkalkulationen (ohne Schleifen) sind nicht Turing-mächtig Der Lambda Calculus von Alonzo Church ist äquivalent zur TM, und daher Turing-mächtig Die µ-rekursiven Funktionen von Kurt Gödel sind äquivalent zur TM, und daher Turing-mächtig Alle gängigen höheren Programmiersprachen sind Turing-mächtig: Algol, Pascal, C, FORTRAN, COBOL, Java, Smalltalk, Ada, C++, Python, LISP, Haskell, PROLOG, etc. PostScript, Tex, Latex sind Turing-mächtig Sogar PowerPoint ist Turing-mächtig (wegen seiner Animated Features) BuK/WS 2017 VL-11: LOOP und WHILE Programme I 6/46

Vorlesung VL-11 LOOP und WHILE Programme I Die Programmiersprache LOOP Die Programmiersprache WHILE WHILE versus LOOP WHILE ist Turing-mächtig BuK/WS 2017 VL-11: LOOP und WHILE Programme I 7/46

Die Programmiersprache LOOP BuK/WS 2017 VL-11: LOOP und WHILE Programme I 8/46

Programmiersprache LOOP Wir betrachten eine einfache Programmiersprache namens LOOP, deren Programme aus den folgenden syntaktischen Komponenten aufgebaut sind: Variablen: x 1 x 2 x 3... Konstanten: 0 1 2... Symbole: ; := + Schlüsselwörter: 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ür jede Konstante c N sind die Zuweisungen x i := x j + c und x i := x j c LOOP-Programme. BuK/WS 2017 VL-11: LOOP und WHILE Programme I 10/46

LOOP / Syntax (2) Induktive Definition / Induktionsschritte: Hintereinanderausführung Falls P 1 und P 2 LOOP-Programme sind, so ist auch P 1 ; P 2 ein LOOP-Programm. BuK/WS 2017 VL-11: LOOP und WHILE Programme I 11/46

LOOP / Syntax (2) Induktive Definition / Induktionsschritte: Hintereinanderausführung Falls P 1 und P 2 LOOP-Programme sind, so ist auch P 1 ; P 2 ein LOOP-Programm. LOOP-Konstrukt Falls P ein LOOP-Programm ist, so ist auch LOOP x i DO P ENDLOOP ein LOOP-Programm. BuK/WS 2017 VL-11: LOOP und WHILE Programme I 11/46

LOOP / Semantik (1): Zuweisungen Die Eingabe ist in den Variablen x 1,..., x n enthalten. Alle anderen Variablen werden mit 0 initialisiert. Das Resultat eines LOOP-Programms ist die Zahl, die sich am Ende der Abbarbeitung in der Variablen x 1 ergibt. BuK/WS 2017 VL-11: LOOP und WHILE Programme I 12/46

LOOP / Semantik (1): Zuweisungen Die Eingabe ist in den Variablen x 1,..., x n enthalten. Alle anderen Variablen werden mit 0 initialisiert. Das Resultat eines LOOP-Programms ist die Zahl, die sich am Ende der Abbarbeitung in der Variablen x 1 ergibt. LOOP-Programme der Form x i := x j + c sind Zuweisungen des Wertes x j + c an die Variable x i. BuK/WS 2017 VL-11: LOOP und WHILE Programme I 12/46

LOOP / Semantik (1): Zuweisungen Die Eingabe ist in den Variablen x 1,..., x n enthalten. Alle anderen Variablen werden mit 0 initialisiert. Das Resultat eines LOOP-Programms ist die Zahl, die sich am Ende der Abbarbeitung in der Variablen x 1 ergibt. LOOP-Programme der Form x i := x j + c sind Zuweisungen des Wertes x j + c an die Variable x i. LOOP-Programme der Form x i := x j c sind Zuweisungen des Wertes x j c an die Variable x i. Anmerkung: Die Variablen dürfen nur natürliche Werte annehmen. Daher verwenden wir die modifizierte Subtraktion: Falls x j < c gilt, so wird das Resultat x i auf 0 gesetzt. BuK/WS 2017 VL-11: LOOP und WHILE Programme I 12/46

LOOP / Semantik (2): Hintereinanderausführung Die Eingabe ist in den Variablen x 1,..., x n enthalten. Alle anderen Variablen werden mit 0 initialisiert. Das Resultat eines LOOP-Programms ist die Zahl, die sich am Ende der Abbarbeitung in der Variablen x 1 ergibt. In einem LOOP-Programm P 1 ; P 2 wird zunächst P 1 und danach P 2 ausgeführt. BuK/WS 2017 VL-11: LOOP und WHILE Programme I 13/46

LOOP / Semantik (3): LOOP-Konstrukte Die Eingabe ist in den Variablen x 1,..., x n enthalten. Alle anderen Variablen werden mit 0 initialisiert. Das Resultat eines LOOP-Programms ist die Zahl, die sich am Ende der Abbarbeitung in der Variablen x 1 ergibt. Das Programm LOOP x i DO P ENDLOOP hat folgende Bedeutung: P wird x i mal hintereinander ausgeführt. Anmerkung: Nur der Wert von x i zu Beginn der Schleife ist relevant. Ändert sich der Variablenwert von x i im Inneren von P, 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-Programm P mit k Variablen berechnet eine k-stellige Funktion der Form [P]: N k N k. Ist P die Zuweisung x i := x j + c, so ist [P](r 1,..., r k ) = (r 1,..., r i 1, r j + c, r i+1,..., r k ). Ist P die Zuweisung x i := x j c, ist [P](r 1,..., r k ) = (r 1,..., r i 1, r j c, r i+1,..., r k ) falls r j c, und andernfalls [P](r 1,..., r k ) = (r 1,..., r i 1, 0, r i+1,..., r k ). Ist P = P 1 ; P 2 eine Hintereinanderausführung, so ist [P](r 1,..., r k ) = [P 2 ]([P 1 ](r 1,..., r k )). Ist P = LOOP x i DO Q ENDLOOP ein LOOP-Konstrukt, so gilt [P](r 1,..., r k ) = [Q] r i (r 1,..., r k ). BuK/WS 2017 VL-11: LOOP und WHILE Programme I 15/46

LOOP: Beispiele und Macros BuK/WS 2017 VL-11: LOOP und WHILE Programme I 16/46

LOOP-Programme / Beispiele (1) Das folgende Programm simuliert die Zuweisung x j := x i. Beispiel A x j := x i + 0 Es sei x zero eine Dummy-Variable, die mit 0 initialisiert wird und deren Wert nie verändert wird. Das folgende Programm simuliert dann die Zuweisung x j := c eines konstanten Wertes an eine Variable. Beispiel B x j := x zero + c BuK/WS 2017 VL-11: LOOP und WHILE Programme I 17/46

LOOP-Programme / Beispiele (2) Beispiel C x 1 := x 2 ; LOOP x 3 DO x 1 := x 1 + 1 ENDLOOP BuK/WS 2017 VL-11: LOOP und WHILE Programme I 18/46

LOOP-Programme / Beispiele (2) Beispiel C x 1 := x 2 ; LOOP x 3 DO x 1 := x 1 + 1 ENDLOOP Dieses Programm berechnet die Addition x 1 := x 2 + x 3 BuK/WS 2017 VL-11: LOOP und WHILE Programme I 18/46

LOOP-Programme / Beispiele (2) Beispiel C x 1 := x 2 ; LOOP x 3 DO x 1 := x 1 + 1 ENDLOOP Dieses Programm berechnet die Addition x 1 := x 2 + x 3 Beispiel D x 1 := 0; LOOP x 3 DO x 1 := x 1 + x 2 ENDLOOP BuK/WS 2017 VL-11: LOOP und WHILE Programme I 18/46

LOOP-Programme / Beispiele (2) Beispiel C x 1 := x 2 ; LOOP x 3 DO x 1 := x 1 + 1 ENDLOOP Dieses Programm berechnet die Addition x 1 := x 2 + x 3 Beispiel D x 1 := 0; LOOP x 3 DO x 1 := x 1 + x 2 ENDLOOP Dieses Programm berechnet die Multiplikation x 1 := x 2 x 3 BuK/WS 2017 VL-11: LOOP und WHILE Programme I 18/46

LOOP-Programme / Beispiele (3) Übung Skizzieren Sie LOOP-Programme, die die folgenden Operationen berechnen: Die modifizierte Subtraktion x 1 := x 2 x 3 (die für x 2 < x 3 den Wert 0 ergibt) Die Division ohne Rest x 1 := x 2 DIV x 3 Die Modulooperation x 1 := x 2 MOD x 3 BuK/WS 2017 VL-11: LOOP und WHILE Programme I 19/46

LOOP-Programme / Beispiele (4) Es seien P 1 und P 2 LOOP-Programme, in denen die drei Variablen x 1, x 2 und x 3 nicht vorkommen. Beispiel E x 2 := 1; x 3 := 0; LOOP x 1 DO x 2 := 0; x 3 := 1 ENDLOOP; LOOP x 2 DO P 1 ENDLOOP; LOOP x 3 DO P 2 ENDLOOP BuK/WS 2017 VL-11: LOOP und WHILE Programme I 20/46

LOOP-Programme / Beispiele (4) Es seien P 1 und P 2 LOOP-Programme, in denen die drei Variablen x 1, x 2 und x 3 nicht vorkommen. Beispiel E x 2 := 1; x 3 := 0; LOOP x 1 DO x 2 := 0; x 3 := 1 ENDLOOP; LOOP x 2 DO P 1 ENDLOOP; LOOP x 3 DO P 2 ENDLOOP Dieses Programm entspricht dem Konstrukt: IF x 1 = 0 THEN P 1 ELSE P 2 ENDIF BuK/WS 2017 VL-11: LOOP und WHILE Programme I 20/46

LOOP-Programme / Beispiele (4) Es seien P 1 und P 2 LOOP-Programme, in denen die drei Variablen x 1, x 2 und x 3 nicht vorkommen. Beispiel E x 2 := 1; x 3 := 0; LOOP x 1 DO x 2 := 0; x 3 := 1 ENDLOOP; LOOP x 2 DO P 1 ENDLOOP; LOOP x 3 DO P 2 ENDLOOP Dieses Programm entspricht dem Konstrukt: IF x 1 = 0 THEN P 1 ELSE P 2 ENDIF Übung Skizzieren Sie ein LOOP-Programm, das IF x 1 = c THEN P 1 ELSE P 2 ENDIF simuliert. BuK/WS 2017 VL-11: LOOP und WHILE Programme I 20/46

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: Variablen: x 1 x 2 x 3... Konstanten: 0 1 2... Symbole: ; := + Schlüsselwörter: WHILE DO ENDWHILE BuK/WS 2017 VL-11: LOOP und WHILE Programme I 22/46

WHILE / Syntax Die Syntax von WHILE ist induktiv definiert, und stimmt weitgehend mit der Syntax von LOOP überein. Zuweisungen x i := x j + c und x i := x j c und Hintereinanderausführung P 1 ; P 2 sind genau wie in LOOP definiert. Der Hauptunterschied zu LOOP besteht im Schleifen-Konstrukt. WHILE-Konstrukt Falls P ein WHILE-Programm ist und x i eine Variable, so ist auch WHILE x i 0 DO P ENDWHILE ein WHILE-Programm. BuK/WS 2017 VL-11: LOOP und WHILE Programme I 23/46

WHILE / Semantik Die Eingabe ist in den Variablen x 1,..., x n enthalten. Alle anderen Variablen werden mit 0 initialisiert. Das Resultat eines WHILE-Programms ist die Zahl, die sich am Ende der Abbarbeitung in der Variablen x 1 ergibt. Das Programm WHILE x i 0 DO P ENDWHILE hat folgende Bedeutung: P wird solange ausgeführt, bis x i den Wert 0 erreicht. BuK/WS 2017 VL-11: LOOP und WHILE Programme I 24/46

WHILE / Semantik Die Eingabe ist in den Variablen x 1,..., x n enthalten. Alle anderen Variablen werden mit 0 initialisiert. Das Resultat eines WHILE-Programms ist die Zahl, die sich am Ende der Abbarbeitung in der Variablen x 1 ergibt. Das Programm WHILE x i 0 DO P ENDWHILE hat folgende Bedeutung: P wird solange ausgeführt, bis x i den Wert 0 erreicht. Ein WHILE-Programm P mit k Variablen berechnet eine k-stellige Funktion der Form [P]: N k N k. Ist P = WHILE x i 0 DO Q ENDWHILE ein WHILE-Konstrukt, so ist [P](r 1,..., r k ) = [Q] l (r 1,..., r k ) für die kleinste Zahl l, für die die i-te Komponente von [Q] l (r 1,..., r k ) gleich 0 ist. Falls solch ein l nicht existiert, so ist [P](r 1,..., r k ) undefiniert. BuK/WS 2017 VL-11: LOOP und WHILE Programme I 24/46

WHILE versus LOOP BuK/WS 2017 VL-11: LOOP und WHILE Programme I 25/46

WHILE versus LOOP (1) Beobachtung Die LOOP-Schleife LOOP x i DO P ENDLOOP kann durch die folgende WHILE-Schleife simuliert werden: y := x i WHILE y 0 DO y := y 1; P ENDWHILE BuK/WS 2017 VL-11: LOOP und WHILE Programme I 26/46

WHILE versus LOOP (1) Beobachtung Die LOOP-Schleife LOOP x i DO P ENDLOOP kann durch die folgende WHILE-Schleife simuliert werden: y := x i WHILE y 0 DO y := y 1; P ENDWHILE Ergo: Jede LOOP-berechenbare Funktion f : N k N ist 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 x 1 := 1; WHILE x 1 0 DO x 1 := x 1 + 1 ENDWHILE BuK/WS 2017 VL-11: LOOP und WHILE Programme I 27/46

WHILE versus LOOP (2) Es gibt WHILE-Programme, die nicht terminieren: Beispiel x 1 := 1; WHILE x 1 0 DO x 1 := x 1 + 1 ENDWHILE LOOP-Programme terminieren immer: Satz Jedes LOOP-Programm hält auf jeder möglichen Eingabe nach endlich vielen Schritten an. Beweis: Durch Induktion über den Syntax-Baum. Hintereinanderausführung P = P 1 ; P 2 LOOP-Konstrukt P = LOOP x i DO Q ENDLOOP BuK/WS 2017 VL-11: LOOP und WHILE Programme I 27/46

WHILE versus LOOP (3) Wir werden zeigen: Satz (wird heute bewiesen) Die Programmiersprache WHILE ist Turing-mächtig. (In anderen Worten: Jede berechenbare Funktion kann von einem WHILE-Programm berechnet werden.) Satz (wird in der nächsten Vorlesung bewiesen) Die Programmiersprache LOOP ist nicht Turing-mächtig. (In anderen Worten: Es existiert eine berechenbare Funktion, die von keinem LOOP-Programm berechnet werden kann.) BuK/WS 2017 VL-11: LOOP und WHILE Programme I 28/46

Mächtigkeit von WHILE BuK/WS 2017 VL-11: LOOP und WHILE Programme I 29/46

Mächtigkeit von WHILE Satz Die Programmiersprache WHILE ist Turing-mächtig. 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 TM M. Zustandsmenge Q = {q 0,..., q t } Der Anfangszustand ist q 1, und der Endzustand ist q 0 TM im Zustand q i WHILE Variable Zustand = i BuK/WS 2017 VL-11: LOOP und WHILE Programme I 31/46

Simulation von TM durch WHILE (1) Wir betrachten eine TM M. Zustandsmenge Q = {q 0,..., q t } Der Anfangszustand ist q 1, und der Endzustand ist q 0 TM im Zustand q i WHILE Variable Zustand = i Bandalphabet Γ = {1, 2, B} WHILE kodiert Buchstaben 1 durch Dezimalziffer 1, Buchstaben 2 durch Dezimalziffer 2, und Buchstaben B durch Dezimalziffer 0. BuK/WS 2017 VL-11: LOOP und WHILE Programme I 31/46

Simulation von TM durch WHILE (1) Wir betrachten eine TM M. Zustandsmenge Q = {q 0,..., q t } Der Anfangszustand ist q 1, und der Endzustand ist q 0 TM im Zustand q i WHILE Variable Zustand = i Bandalphabet Γ = {1, 2, B} WHILE kodiert Buchstaben 1 durch Dezimalziffer 1, Buchstaben 2 durch Dezimalziffer 2, und Buchstaben B durch Dezimalziffer 0. Alle WHILE Variablen enthalten im Folgenden Dezimalzahlen BuK/WS 2017 VL-11: LOOP und WHILE Programme I 31/46

Simulierte Turingmaschine M: B 1 1 2 2 2 1 2 1 1 1 B B B δ 1 2 B q 1 q 2 q 3 (q 2, 1, R) q 3 Entsprechende Konfiguration: 1122 q 3 212111 Drei entsprechende Variablen im WHILE-Programm: Band-vor-Kopf Zustand pfok-ba-danb 1122 3 111212 Variable BandVorKopf Variable Zustand Variable BandAbKopf BuK/WS 2017 VL-11: LOOP und WHILE Programme I 32/46

Simulation von TM durch WHILE (2) Jeder Rechenschritt von M wird durch einige WHILE-Befehle simuliert. Jeder Rechenschritt der TM besteht (gemäss Überführungsfunktion) aus (A) Update von Zustand (B) Update von Symbol unterm Kopf (C) Bewegung des Kopfes L,R,N BuK/WS 2017 VL-11: LOOP und WHILE Programme I 33/46

Simulation von TM durch WHILE (2) Jeder Rechenschritt von M wird durch einige WHILE-Befehle simuliert. Jeder Rechenschritt der TM besteht (gemäss Überführungsfunktion) 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 BuK/WS 2017 VL-11: LOOP und WHILE Programme I 33/46

Simulation von TM durch WHILE (3A) Jeder Rechenschritt der TM besteht (gemäss Überführungsfunktion) aus (A) Update von Zustand (B) Update von Symbol unterm Kopf (C) Bewegung des Kopfes L,R,N Der Zustand wird auf neuen Zustand q i gesetzt, indem man die Zuweisung Zustand := i ausführt BuK/WS 2017 VL-11: LOOP und WHILE Programme I 34/46

Simulation von TM durch WHILE (3B) Jeder Rechenschritt der TM besteht (gemäss Überführungsfunktion) 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ück ausführt: BandAbKopf := BandAbKopf DIV 10; BandAbKopf := 10 BandAbKopf + σ; UntermKopf := σ; BuK/WS 2017 VL-11: LOOP und WHILE Programme I 35/46

Simulation von TM durch WHILE (3C-links) Jeder Rechenschritt der TM besteht (gemäss Überführungsfunktion) 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; BuK/WS 2017 VL-11: LOOP und WHILE Programme I 36/46

Simulation von TM durch WHILE (3C-rechts) Jeder Rechenschritt der TM besteht (gemäss Überführungsfunktion) 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äss Überführungsfunktion) 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ändert lässt: 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; BuK/WS 2017 VL-11: LOOP und WHILE Programme I 39/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 äussere Schleife WHILE Zustand 0 DO IF Zustand=1 AND UntermKopf=0 THEN Schritt ENDIF; IF Zustand=1 AND UntermKopf=1 THEN Schritt ENDIF; IF Zustand=1 AND UntermKopf=2 THEN Schritt ENDIF; IF Zustand=2 AND UntermKopf=0 THEN Schritt ENDIF;.. IF Zustand=t AND UntermKopf=2 THEN Schritt ENDIF; ENDWHILE BuK/WS 2017 VL-11: LOOP und WHILE Programme I 39/46

Ausblick: Landschaft um LOOP, WHILE, TM, RAM TM = RAM = WHILE = entscheidbar A(m, n) LOOP = primitiv rekursiv + a b a ( ) b n k Ackermann Funktion BuK/WS 2017 VL-11: LOOP und WHILE Programme I 40/46

Die Ackermann Funktion BuK/WS 2017 VL-11: LOOP und WHILE Programme I 41/46

Ackermann Funktion: Definition Definition Die Ackermann Funktion A : N 2 N ist folgendermassen definiert: A(0, n) = n + 1 für n 0 A(m + 1, 0) = A(m, 1) für m 0 A(m + 1, n + 1) = A(m, A(m + 1, n)) für m, n 0 BuK/WS 2017 VL-11: LOOP und WHILE Programme I 42/46

Ackermann Funktion: Beispiele (1) A(0, n) = n + 1 für n 0 A(m + 1, 0) = A(m, 1) für m 0 A(m + 1, n + 1) = A(m, A(m + 1, n)) für m, n 0 BuK/WS 2017 VL-11: LOOP und WHILE Programme I 43/46

Ackermann Funktion: Beispiele (1) A(0, n) = n + 1 für n 0 A(m + 1, 0) = A(m, 1) für m 0 A(m + 1, n + 1) = A(m, A(m + 1, n)) für m, n 0 Ein paar Beispiele für m = 1: BuK/WS 2017 VL-11: LOOP und WHILE Programme I 43/46

Ackermann Funktion: Beispiele (1) A(0, n) = n + 1 für n 0 A(m + 1, 0) = A(m, 1) für m 0 A(m + 1, n + 1) = A(m, A(m + 1, n)) für m, n 0 Ein paar Beispiele für m = 1: A(1, 0) = A(0, 1) = 2 BuK/WS 2017 VL-11: LOOP und WHILE Programme I 43/46

Ackermann Funktion: Beispiele (1) A(0, n) = n + 1 für n 0 A(m + 1, 0) = A(m, 1) für m 0 A(m + 1, n + 1) = A(m, A(m + 1, n)) für m, n 0 Ein paar Beispiele für m = 1: A(1, 0) = A(0, 1) = 2 A(1, 1) = BuK/WS 2017 VL-11: LOOP und WHILE Programme I 43/46

Ackermann Funktion: Beispiele (1) A(0, n) = n + 1 für n 0 A(m + 1, 0) = A(m, 1) für m 0 A(m + 1, n + 1) = A(m, A(m + 1, n)) für m, n 0 Ein paar Beispiele für m = 1: A(1, 0) = A(0, 1) = 2 A(1, 1) = A(0, A(1, 0)) = A(1, 0) + 1 = 3 BuK/WS 2017 VL-11: LOOP und WHILE Programme I 43/46

Ackermann Funktion: Beispiele (1) A(0, n) = n + 1 für n 0 A(m + 1, 0) = A(m, 1) für m 0 A(m + 1, n + 1) = A(m, A(m + 1, n)) für m, n 0 Ein paar Beispiele für m = 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 BuK/WS 2017 VL-11: LOOP und WHILE Programme I 43/46

Ackermann Funktion: Beispiele (1) A(0, n) = n + 1 für n 0 A(m + 1, 0) = A(m, 1) für m 0 A(m + 1, n + 1) = A(m, A(m + 1, n)) für m, n 0 Ein paar Beispiele für m = 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 BuK/WS 2017 VL-11: LOOP und WHILE Programme I 43/46

Ackermann Funktion: Beispiele (2) A(0, n) = n + 1 für n 0 A(m + 1, 0) = A(m, 1) für m 0 A(m + 1, n + 1) = A(m, A(m + 1, n)) für m, n 0 Ein paar Beispiele für m = 2: A(2, 0) = A(1, 1) = 3 A(2, 1) = A(1, A(2, 0)) = A(2, 0) + 2 = 5 BuK/WS 2017 VL-11: LOOP und WHILE Programme I 44/46

Ackermann Funktion: Beispiele (2) A(0, n) = n + 1 für n 0 A(m + 1, 0) = A(m, 1) für m 0 A(m + 1, n + 1) = A(m, A(m + 1, n)) für m, n 0 Ein paar Beispiele für m = 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 BuK/WS 2017 VL-11: LOOP und WHILE Programme I 44/46

Ackermann Funktion: Beispiele (2) A(0, n) = n + 1 für n 0 A(m + 1, 0) = A(m, 1) für m 0 A(m + 1, n + 1) = A(m, A(m + 1, n)) für m, n 0 Ein paar Beispiele für m = 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) = BuK/WS 2017 VL-11: LOOP und WHILE Programme I 44/46

Ackermann Funktion: Beispiele (2) A(0, n) = n + 1 für n 0 A(m + 1, 0) = A(m, 1) für m 0 A(m + 1, n + 1) = A(m, A(m + 1, n)) für m, n 0 Ein paar Beispiele für m = 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 BuK/WS 2017 VL-11: LOOP und WHILE Programme I 44/46

Ackermann Funktion: Beispiele (3) A(0, n) = n + 1 für n 0 A(m + 1, 0) = A(m, 1) für m 0 A(m + 1, n + 1) = A(m, A(m + 1, n)) für m, n 0 Und ein paar Beispiele für m = 3: A(3, 0) = A(2, 1) = 5 BuK/WS 2017 VL-11: LOOP und WHILE Programme I 45/46

Ackermann Funktion: Beispiele (3) A(0, n) = n + 1 für n 0 A(m + 1, 0) = A(m, 1) für m 0 A(m + 1, n + 1) = A(m, A(m + 1, n)) für m, n 0 Und ein paar Beispiele für m = 3: A(3, 0) = A(2, 1) = 5 A(3, 1) = A(2, A(3, 0)) = 2 A(3, 0) + 3 = 13 BuK/WS 2017 VL-11: LOOP und WHILE Programme I 45/46

Ackermann Funktion: Beispiele (3) A(0, n) = n + 1 für n 0 A(m + 1, 0) = A(m, 1) für m 0 A(m + 1, n + 1) = A(m, A(m + 1, n)) für m, n 0 Und ein paar Beispiele für m = 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 BuK/WS 2017 VL-11: LOOP und WHILE Programme I 45/46

Ackermann Funktion: Beispiele (3) A(0, n) = n + 1 für n 0 A(m + 1, 0) = A(m, 1) für m 0 A(m + 1, n + 1) = A(m, A(m + 1, n)) für m, n 0 Und ein paar Beispiele für m = 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) = BuK/WS 2017 VL-11: LOOP und WHILE Programme I 45/46

Ackermann Funktion: Beispiele (3) A(0, n) = n + 1 für n 0 A(m + 1, 0) = A(m, 1) für m 0 A(m + 1, n + 1) = A(m, A(m + 1, n)) für m, n 0 Und ein paar Beispiele für m = 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) = 2 n+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... A(1, n) = n + 2 A(2, n) = 2n + 3 A(3, n) = 2 n+3 3 A(4, n) = 2 2 } 2 {{} 3 n + 3 viele Zweien Bereits der Wert A(4, 2) = 2 65536 3 ist grösser als die Anzahl aller Atome im Weltraum. BuK/WS 2017 VL-11: LOOP und WHILE Programme I 46/46