Berechnungsmodelle – LOOP , WHILE , GOTO , rekursive Funktionen

Werbung
Proseminar Theoretische Informatik - WS07/08 - Prof. Helmut Alt – 10.01.2008 - 1
( Handout zum Vortrag Nr.10 , Niels-Peter Hiss )
Berechnungsmodelle – LOOP , WHILE , GOTO , rekursive Funktionen
I. Einleitung (Berechenbarkeitsmodelle)
Die hier behandelten Berechenbarkeits-Ansätze dienen als Hilfsmittel zum Beweis,
ob bestimmte Probleme berechnet werden können, oder nicht.
Je mehr Hilfsmittel man hat, die sich in der Qualität der Beschreibung unterscheiden,
umso einfacher kann man Lösungen formulieren oder auch sogar finden.
Wir benutzen oft die Einschränkung einer Fragestellung auf natürliche Zahlen, dazu einfache
Konzepte darauf (Wiederholung, Schachtelung, Variablen, Wertemanipulation) -> “einfache”
Beweise für Machbarkeit sind möglich.
Problem -> Lösung findbar? Existiert überhaupt eine?
-> “Einfacher Nachweis”, wenn Lösung gefunden oder bewiesen ist, dass es eine gibt.
Kann man wissen, ob es eine Lösung gibt?
-> Eventuell reicht dieser Ansatz nicht aus, um grundsätzlich zu entscheiden (!), ob man eine
Lösung tatsächlich gefunden hat oder ob es überhaupt eine gibt.
II. LOOP , WHILE , GOTO

Definition der LOOP – Sprache:
Variablen: x0 , x1 , x2 , ... | Konstanten: 0 , 1 , 2 , ... | Trennsymbole: ( ; ) , ( := ) |
Operationszeichen: + - | Schlüsselwörter: LOOP , DO , END
induktive Definition der Syntax:
1. Eine Wertzuweisung der Form xi := xj ± c , wobei c eine Konstante ist,
ist ein LOOP-Programm.
2. Falls P1 und P2 LOOP-Programme sind, so ist auch P1 ; P2 ein LOOP-Programm.
3. LOOP xi DO P END , wobei P ein LOOP-Programm ist und xi eine Variable, ist ein LOOPProgramm.
Semantik:
Das Programm startet mit Eingabevariablen n1 , ... , nk aus N in den Variablen x1 , ... xk , während
alle anderen Variablen des Programms mit Null starten. Das Ergebnis der Berechnungen steht am
Ende in x0. Die Wirkweise der Semantik erschließt sich weitgehend intuitiv,
die Loop-Schleife allerdings benutzt den Wert von „xi“ vor dem Ausführen von „P“ und führt das
Programm so oft aus, d.h. Es gibt keine Kontrollmöglichkeit dynamischer Natur, die Zahl der
Wiederholungen kann nicht aus der Schleife selbst heraus beeinflußt werden.
•
Definition (LOOP-berechenbar):
Eine Funktion f : Nk -> N heißt LOOP-berechenbar, wenn es ein LOOP-Programm P gibt, dass für
alle x aus Nk als Eingabewert(e) mit f(x) in x0 stoppt.
•
Feststellungen:
– Alle LOOP-berechenbaren Funktionen sind total.
– Es gibt totale intuitiv berechenbare Funktionen, die nicht LOOP-berechenbar sind.
( vgl. Ackermannfunktion, letzter Vortrag )
Proseminar Theoretische Informatik - WS07/08 - Prof. Helmut Alt – 10.01.2008 - 2
Die WHILE – Sprache:
Die WHILE-Sprache erweitert die LOOP-Sprache um das Konzept der „WHILE-Schleife“:
– WHILE xi ≠ 0 DO P END
( Das WHILE-Programm P wird sooft ausgeführt, wie der Variablen-Wert xi nicht Null ist. )
Ansonsten sind alle Konzepte aus LOOP in WHILE übertragen.
( Die Folgerungen allerdings ändern sich, LOOP ... END wird eigentlich hinfällig. )
•
Definition ( WHILE-berechenbar ):
Eine Funktion f : Nk -> N heißt WHILE-berechenbar, falls es ein WHILE-Programm P gibt,
dass für alle x aus Nk als Eingabewert(e), für die f definiert ist, mit f(x) in x0 hält, und nicht hält
für alle x, für die f nicht definiert ist.
Endlosschleifen sind mit dem WHILE-Konstrukt offensichtlich möglich.
•
Satz:
Turingmaschinen können WHILE-Programme simulieren,
also ist jede WHILE-berechenbare Funktion auch Turing-berechenbar.
[ Beweis / eher nicht, keine Zeit dafür ]
 Die GOTO – Sprache:
Ein GOTO-Programm besteht aus einer Folge von Anweisungen, die jeweils einer eigenen Marke
zugeordnet sind: M1 : A1 ; M2 : A2 ; ... ; Mk : Ak
Für A1..k sind folgende Anweisungen möglich: Wertzuweisungen: xi := xj ± c ( c ist Konstante )
unbedingter Sprung: GOTO Mi | bedingter Sprung: IF xi = c THEN GOTO Mj |
Stopanweisung: HALT
Die Semantik erschließt sich intuitiv, das Programm startet mit A1 , bei einem Sprung wird an der
entsprechenden Marke fortgefahren, ohne Sprung an der nächsten. HALT beendet das Programm.
Endlosschleifen sind offensichtlich möglich.
•
Definition ( GOTO-berechenbar ):
[ analog zu WHILE-berechenbar ]
•
Satz:
Jedes WHILE-Programm kann durch ein GOTO-Programm simuliert werden.
D.h., Jede WHILE-berechenbare Funktion ist auch GOTO-berechenbar.
•
Satz:
Jedes GOTO-Programm kann durch ein WHILE-Programm simuliert werden.
D.h., Jede GOTO-berechenbare Funktion ist auch WHILE-berechenbar (mit einer Schleife).
•
Satz ( Kleenesche Normalform für WHILE-Programme ):
Jede WHILE-berechenbare Funktion kann durch ein WHILE-Programm mit nur einer WHILESchleife berechnet werden. [ Beweis , nach vorherigem Beweis WHILE->GOTO->WHILE]
•
Satz:
GOTO-Programme können Turingmaschinen simulieren.
Damit ist jede Turing-berechenbare Funktion auch GOTO-berechenbar.

[ Beweis (mit Simulation von 2-Zähler Maschine, vgl. Vortrag “2 Zähler sind universell”) ]

Fazit:
–
Die Klassen der GOTO- / WHILE- / Turing-berechenbaren Funktionen sind gleich.
–
Die Klasse der (totalen) WHILE-berechenbaren Funktionen enthält die Klasse der LOOPberechenbaren Funktionen als echte Teilmenge.
Proseminar Theoretische Informatik - WS07/08 - Prof. Helmut Alt – 10.01.2008 - 3
III. Rekursive Funktionen
Induktive Definition der Klasse der primitiv rekursiven Funktionen:
(1) Alle Konstanten Funktionen sind primitiv Rekursiv.
(2) Alle identischen Abbildungen (Projektionen) sind primitiv rekursiv.
(3) Die Nachfolgerfunktion s(n) = n + 1 auf den natürlichen Zahlen ist primitiv rekursiv.
(4) Funktionen, die durch Einsetzung (Komposition) von primitiv rekursiven Funktionen
entstehen, sind primitiv rekursiv.
(5) Funktionen die durch “primitive Rekursion” aus primitiv rekursiven Funktionen entstehen,
sind primitiv rekursiv.
D.h. So eine Funktion f erfüllt das Gleichungssystem:
f( 0 , ... ) = g ( ... ) und f( n + 1 , ... ) = h( f( n , ... ) , ... ) wobei g und h primitiv rekursiv sind.
Hier geht also generell um Funktionen von Nk nach N.
Die Funktionen unter 1. bis 3. werden Basisfunktionen genannt.
Feststellungen:
– Addition , Multiplikation und modifizierte Subtraktion sind primitiv rekursiv (siehe Vorlesung).
– Primitiv rekursive Funktionen sind total.
•
Satz:
Die Klasse der primitiv rekursiven Funktion stimmt genau mit der Klasse der LOOPberechenbaren Funktion überein.
•
Natürliche Zahlen (Hilfsmittel für Beweis):
Wir benutzen eine Funktion, die zwei natürliche Zahlen bijektiv auf eine abbildet (Cantor).
c( x , y ) = ( x + y + 1 ) * ( x + y ) / 2 + x
- c ist primitiv rekursiv ( Addition , Multiplikation ).
Dieses ermöglicht uns sofort beliebig viele natürliche Zahlen in einer zu kodieren:
< n0 , n1 , ... , nk > := c( n0 , c( n1 , ... , c( nk , 0 ) ... ) )
Da c bijektiv ist, können wir unter der Bedingung, dass c(x,y) = n gelte,
die Umkehrfunktionen e und f zu c benutzen: e( n ) = x und f( n ) = y, also c( e(n) , f(n) ) = n.
Und damit auch die Umkehrfunktionen d0, ..., dk für ein n = < n0 , n1 , ... , nk > angeben, die uns
die Komponenten liefern: d0(n) = e( n ) = n0 und d1(n) = e( f(n) ) = n1 und dk(n) = e( fk(n) ) = nk
(!) Diese Kodierung hat die Folge, dass man k-stellige Funktionen als einstellige Funktion
darstellen kann, so dass es überhaupt erst sinnvoll ist Berechenbarkeit allgemein mit Funktionen
auf den Natürlichen Zahlen beschreiben zu wollen.
Wichtige Feststellung:
Die Umkehrfunktionen von c ist auch primitiv rekursiv! Daher auch di !
[ Beweis zum Satz oben: induktiv mit Funktion, die Wirkung d. Schleife auf Variablen angibt. ]


•
•
Der μ-Operator und die Klasse der μ-rekursiven Funktionen
Sei f eine k+1-stellige Funktion. Der μ-Operator bildet f auf eine k-stellige Funktion g ab:
g( x1 , ... , xk ) = min{ n | f( n , x1 , ... , xk ) = 0 und f.a. m<n ist f( m , x1 , ... , xk ) definiert }
Zusätzlich soll min Ø als undefiniert gesetzt sein.
Damit können echte partielle Funktionen entstehen! (Beispiel: Konstante Funktionen ≠ 0 )
Definition ( Klasse der μ-rekursiven Funktionen ):
Die Klasse der μ-rekursiven Funktionen ist die kleinste Klasse von Funktionen,
die die Basisfunktionen ( konstante Funktionen , Projektionen , Nachfolgerfunktion ) enthält
und abgeschlossen ist unter Einsetzung, primitiver Rekursion und Anwendung des μ-Operators.
Satz:
Die Klasse der μ-rekursiven Funktionen stimmt genau mit der Klasse der WHILEberechenbaren Funktionen überein ( damit auch mit GOTO- , Turing- ).
Proseminar Theoretische Informatik - WS07/08 - Prof. Helmut Alt – 10.01.2008 - 4
•
[ der Beweis funktioniert analog zum Beweis für LOOP-Berechenbarkeit gegenüber primitiver
Rekursivität, und führt daher nur das Konzept für die WHILE-Schleife und den μ-Operator vor.]
Satz (Kleene):
Für jede n-stellige μ-rekursive Funktion f gibt es zwei (n+1)-stellige, primitiv rekursive
Funktionen p und q, so dass sich f darstellen lässt als:
f( x1 , ... , xn ) = p( x1 , ... , xn , μq( x1 , ... , xn ) )
[ μq ist die n-stellige, durch Anwenden des Operators auf q entstandene Funktion. ]
IV. Die Ackermannfunktion
Vereinfachte Form der Definition:
a( 0 , y ) = y + 1 , a( x , 0 ) = a( x - 1 , 1 ) , a( x , y ) = a( x – 1 , a( x , y -1 ) )
Die Idee war, eine Folge zu kreieren, die wächst, wie etwa: a+b , a*b , ab , ... (...?).
a( 4 , 4 ) ist größer als die Zahl der Atome im ganzen Universum (wie war sie noch?).
Feststellungen:
•
Die Ackermannfunktion ist total.
•
Lemma A: y < a( x , y )
•
Lemma B: a( x , y ) < a( x , y + 1 )
•
Lemma C: a( x , y + 1 ) ≤ a( x + 1 , y )
•
Lemma D: a( x , y ) < a( x + 1 , y )
•
Allgemeine Monotonie-Eigenschaft: Für x, x´, y, y´ mit x≤x´ und y≤y´ gilt: a( x , y ) ≤ a( x´, y´)
•
Definition:
Wir ordnen jedem LOOP-Programm P eine Funktion fP zu,
so dass gilt: fP : N -> N , f(n) = max{ ∑i( n´i ) | ∑i( ni ) } , i durchläuft die Indizes der in P
vorkommenden Variablen. fP(n) berechnet die maximal mögliche Summe der im Programm
vorkommenden Variablen nach Ausführung, für alle Eingabevarianten, für die die Summe der
Eingabevariablen kleiner oder gleich n ist.
•
Lemma E:
Für jedes LOOP-Programm P gibt es eine Konstante k ,so dass für alle n gilt: fP(n) < a( k , n )
•
Satz:
Die Ackermannfunktion ist nicht LOOP-berechenbar.
[ Beweiskonzept: annehmen a sei LOOP-berechenbar, P berechne g(n) := a(n,n)...
LEMMA E: g(n) ≤ fP(n) < a(k,n) => g(k) ≤ fP(k) < a(k,k) = g(k) Widerspruch.]
•
Satz:
Es gibt totale, WHILE-berechenbare Funktionen, die nicht LOOP-berechenbar sind.
[ Beweis benutzt Pseudocode mit WHILE/GOTO/prim rekursiven Konstrukten und zeigt,
dass die Ackermannfunktion WHILE-berechenbar ist.]
•
Ausblick:
Es gibt Funktionen, die man nicht einfach mit diesen Modellen erschlagen kann,
z.B. Den fleißigen Biber ( Maximale Zahl der Einsen, die eine Turingmaschine über { 0 , 1 } mit n
Zuständen schreiben kann und auch anhält).

Quellen:
1. Uwe Schöning
Theoretische Informatik-kurzgefaßt
Spektrum Akad. Verlag 1995, 2. Auflage und 4.Auflage 2003 ( korrigierter Nachdruck )
2. http://www.wikipedia.org ( aktuell , 10.01.2008 )
3. Vorlesungsmitschriften aus “Grundlagen der Theoretischen Informatik” SoSe 2007.
4. Vorträge aus der laufenden Veranstaltung, siehe Homepage der Veranstaltung.
Herunterladen