3. Mathematische Maschinen Bei den Anforderungen an Algorithmen im letzten Paragraphen haben wir bemerkt, dass ein Algorithmus im Prinzip von einer Maschine ausgeführt werden kann. Umgekehrt kann solch eine Maschine als Darstellung des zugehörigen Algorithmus aufgefasst werden, weshalb eine formale Beschreibung von Maschinen zur Ausführung von Rechenvorschriften zugleich eine Formalisierung des Algorithmus-Begriffs liefert. Um hierbei zu einer mathematischen Beschreibung zu gelangen, betrachtet man keine realen physikalischen Maschinen, sondern nur deren logische Struktur, was zum Begriff der mathematischen Maschine führt. Wenn die einen Algorithmus ausführende Maschine auch spezifisch von diesem abhängt, so erlaubt doch die gemeinsame Grundstruktur aller Algorithmen auch eine gemeinsame Struktur für die auszuführenden Maschinen anzugeben. Einzelne Maschinen werden sich dann nur in der Wahl der einzelnen Moduln unterscheiden. Ziel dieses Abschnittes ist es, solch ein abstraktes Konzept einer mathematischen Maschine zu entwickeln. Später werden wir dann konkrete Beispiele mathematischer Maschinen betrachten und damit Formalisierungen des Algorithmenbegriffs vorschlagen können. Bei der Konzeption der mathematischen Maschinen genügt es wie im letzten Abschnitt gesehen Berechnungsverfahren zu betrachten. Die Entwicklung des Konzepts wird in mehreren Schritten erfolgen: Zunächst beschreiben wir das Ablaufschema der Rechnung mit Hilfe von Umformungssystemen, die dann durch Hinzunahme von Ein-/Ausgabefunktionen zu Rechensystemen erweitert werden. Im deterministischen Fall beschreibt solch ein System eine partielle Funktion. Im nächsten Schritt führen wir hiervon unabhängig Basismaschinen B ein, die über die notwendigen Bestandteile zur Ausführung der einzelnen Schritte der Rechenvorschrift verfügen. Schließlich wird durch ein B-Programm die Basismaschine so gesteuert, dass die einzelnen Schritte in der gewünschten Reihenfolge ausgeführt werden. Die mathematische Maschine wird dann gerade aus Basismaschine und Programm bestehen. Zur Beschreibung der Arbeitsweise dieser Maschinen werden wir dann auf den am Beginn eingeführten Begriff des Rechensystems zurückgreifen. Wie wir uns im letzten Paragraphen überlegt haben läuft ein (sequentieller, deterministischer) Algorithmus schrittweise ab, wobei in jedem Schritt die aktuelle Ausführungssituation durch eine elementare Operation verändert wird. Bei einem Berechnungsverfahren wird zusätzlich durch die Eingabe eine gewisse Ausgangssituation geschaffen und im Fall der Terminierung eine Ausgabe aus der Endsituation extrahiert. Gehen wir davon aus, dass jede Situation durch eine mögliche Konfiguration der ausführenden Maschine gekennzeichnet ist, so ergibt sich folgender schematische
3 MATHEMATISCHE MASCHINEN 19 Ablauf: Eingabe Konfiguration 0 Konfiguration 1 Konfiguration n Ausgabe Ignorieren wir zunächst die Ein-/Ausgabefunktion, so können wir die Konfigurationsübergänge durch ein Umformungssystem beschreiben. 3.1 DEFINITION. Ein Umformungssystem U KON besteht aus einer Menge KON und einer 2-stelligen Relation KON KON auf KON. Die Elemente von KON heißen die Konfigurationen, die Einschritt- oder Übergangsrelation von U. Ist der Graph einer partiellen Funktion ϕ : KON KON, so ist U ein deterministisches Umformungssystem. Wir benutzen die Infixschreibweise für, d.h. schreiben c c statt c c und sagen c ist eine Nachfolgekonfiguration von c. Eine Konfiguration c heißt Stoppkonfiguration, falls es kein c KON mit c c gibt, d.h. c keine Nachfolgekonfiguration besitzt. U-Rechnungen sind Konfigurationenfolgen, die mit Hilfe der Einschrittrelation gebildet werden: Die unendliche Folge c n n 0 ist eine unendliche U-Rechnung, falls c n c n 1 für alle n 0 gilt. Entsprechend ist c 0 c n eine U-Rechnung der c m 1 für m n gilt, und wir nennen diese Rechnung terminal, Länge n, falls c m falls c n Stoppkonfiguration ist. (Insbesondere legen wir fest, dass jedes c KON eine U-Rechnung der Länge 0 ist.) Eine U-Rechnung ist maximal, falls sie terminal oder unendlich ist. Wir schreiben c n c : Es gibt eine mit c beginnende und mit c endende U-Rechnung der Länge n c c : Es gibt eine mit c beginnende und mit c endende U-Rechnung ( ist also gerade der reflexive und transitive Abschluss von.) In einem deterministischen Umformungssystem ist die Rechnung durch die Anfangskonfiguration eindeutig bestimmt: 3.2 LEMMA. Sei U KON ein deterministisches Umformungssystem und sei c KON. (i) Für jedes n 0 gibt es höchstens eine mit c beginnende U-Rechnung der Länge n. (ii) Es gibt genau eine maximale U-Rechnung, die mit c beginnt.
3 MATHEMATISCHE MASCHINEN 20 BEWEIS. (i) zeigt man durch Induktion nach n, wobei man verwendet, dass in einem deterministischen Umformungssystem jede Nichtstoppkonfiguration genau eine Nachfolgekonfiguration besitzt. (ii) lässt sich leicht aus (i) ableiten. Durch Hinzunahme eines Ein- und Ausgabemechanismus erweitern wir ein Umformungssystem zu einem Rechensystem: 3.3 DEFINITION. Ein Rechensystem R I O KON In Out besteht aus einem Umformungssystem U R KON zusammen mit Mengen I (Eingabemenge) und O (Ausgabemenge) und totalen Funktionen In : I KON (Eingabefunktion) und Out : KON O (Ausgabefunktion). R ist deterministisch, falls das zugehörige Umformungssystem U R deterministisch ist. Für x I nennen wir In x die Startkonfiguration von R bei Eingabe x. Ein Rechensystem R beschreibt eine Relation RES R I O, die, wenn R deterministisch ist, der Graph einer partiellen Funktion res R : I O ist: Nämlich x y RES R gilt dann, wenn es eine mit der Startkonfiguration In x von R bei Eingabe x beginnende terminale U R -Rechnung gibt, deren Stoppkonfiguration von Out auf y abgebildet wird. 3.4 DEFINITION. Für ein Rechensystem R wie oben ist die Resultatsrelation RES R I O definiert durch x y Res R c KON In x c & c Stoppkonfiguration & Out c y 3.5 LEMMA. Für ein deterministisches Rechensystem R ist RES R der Graph einer partiellen Funktion res R : I O, die die Resultatsfunktion von R genannt wird. BEWEIS. Da In und Out Funktionen sind, folgt aus Lemma 3.2, dass es zu jedem x I höchstens ein y O mit x y! RES R gibt. Für die Definition abstrakter Maschinen fassen wir zunächst die Funktionseinheiten zusammen, über die eine Rechenmaschine verfügen muss: Die Maschine benötigt einen Speicher zum Ablegen von (Zwischen-) Ergebnissen. Der Zugriff auf den Speicher muss ermöglichen, die Daten dort zu verändern und zu lesen. Modellieren wir den Speicher abstrakt als Menge S aller möglichen Speicherbelegungen, so ist eine Speicheroperation (oder -transformation) eine totale Funktion f : S S. Eine Maschine wird dann über einen endlichen Satz OPER von solchen Transformationen verfügen. Das Lesen aus dem Speicher kann mit Hilfe von Tests erfolgen, formal von Abbildungen t : S Σ 2. (Hierbei bezeichnet t s 1 den positiven, t s 0 den negativen Ausgang des Tests.) Auch hier steht der Maschine wiederum eine endliche Menge TEST solcher Tests zur Verfügung. Im Speicher spielt sich die Rechnung der Maschine ab. Als Schnittstelle zur Außenwelt muss man also noch eine Ein- und Ausgabeeinheit hinzufügen, die die Eingabe in den Speicher einliest bzw. aus der terminalen Speicherbelegung die Ausgabe extrahiert. 3.6 DEFINITION. Eine Basismaschine B I O S in out OPER TEST besteht aus Mengen I (Eingabemenge), O (Ausgabemenge), S (Speicher, d.h. Menge der Speicherbelegungen), totalen Funktionen in : I S (Eingabefunktion) und out : S O (Ausgabefunktion), sowie endlichen Mengen OPER f 1 "# f m (Menge der (elementaren)
3 MATHEMATISCHE MASCHINEN 21 Operationen) und TEST $ t 1 % t n (Menge der (elementaren) Tests), wobei jede Operation eine totale Funktion f i : S S und jeder Test eine totale Funktion t j : S Σ 2 ist. Durch eine Basismaschine B werden die möglichen Einzelschritte der Rechnung festgelegt. Dass diese in der richtigen Reihenfolge ausgeführt werden, erfordert die Steuerung von B durch eine geeignete Kontrolleinheit. Hier realisieren wir diese mit Hilfe von Programmen. Ein Programm wird dabei eine Folge von Anweisungen (Instruktionen) sein. Jede Anweisung legt fest, welcher Speicherbefehl (d.h. Operation oder Test) als Nächstes auszuführen und welche Anweisung danach auszuführen ist. Letztere wird bei Tests vom Ausgang derselben abhängen. Zur Kennzeichnung von Anweisungen versieht man diese mit Adressen: 3.7 DEFINITION. Eine B-Instruktion I ist entweder ein Tripel I i f j (Operationsinstruktion) oder Quadrupel I & i t j k (Testinstruktion), wobei i j k (', f OPER und t TEST. Die 1. Komponente i heißt Adresse von I, j bzw. j k sind die Nachfolgeadresse bzw. möglichen Nachfolgeadressen von I. Statt Adressen sprechen wir auch von (Programm-)Zuständen. Im Zustand i kann die Instruktion I mit Adresse i ausgeführt werden. Handelt es sich dabei um die Operationsinstruktion i f j, wird f im Speicher ausgeführt und der neue Zustand j angenommen. Bei einer Testinstruktion i t j k wird der Test t durchgeführt und bei Ausgang 0 der Zustand j, bei Ausgang 1 der Zustand k angenommen. Damit die nächst auszuführende Anweisung eindeutig bestimmt ist, müssen verschiedene Anweisungen verschiedene Adressen haben. 3.8 DEFINITION. Ein (deterministisches) B-Programm P I i : i ) n ist eine endliche Folge von B-Instruktionen I i, wobei verschiedene Instruktionen verschiedene Adressen haben. (Wenn nicht anders festgelegt, ist stets i die Adresse von I i.) Eine beliebige endliche Folge von B-Instruktionen heißt nichtdeterministisches B-Programm. Damit die Abwicklung eines Programms eindeutig festgelegt ist, muss man bestimmen, welche Instruktion als erste auszuführen ist. Diese Startinstruktion soll hier immer die erste Instruktion I 0 sein. Die Ausführung des Programms stoppt, wenn ein Zustand erreicht wird, der nicht als Adresse einer Instruktion in P vorkommt. 3.9 DEFINITION. Ein Zustand eines B-Programmes P ist die Adresse, die Nachfolgeadresse oder eine mögliche Nachfolgeadresse einer Instruktion in P. Z P ist die Menge aller Zustände von P. Die Adresse von I 0 ist der Startzustand von P. Ein Zustand von P, der nicht als Adresse einer Instruktion von P vorkommt, heißt Stoppzustand von P. Den Ablauf eines Programms P I i : i ) n kann man durch ein Flussdiagramm (oder Syntaxdiagramm) veranschaulichen: Dieses ist ein markierter gerichteter Graph, dessen Knoten mit den Hauptteilen der Instruktionen markiert sind. Dabei werden Operationen üblicherweise in Rechtecken, Tests in Rauten geschrieben. Die ausgehenden Kanten führen zu den Knoten, die den durch die (möglichen) Nachfolgeadressen bezeichneten Instruktionen entsprechen, wobei die Ausgangskanten eines Tests entsprechend mit 0 und 1 markiert sind. Ist die Nachfolgeadresse ein Stoppzustand, so führt die Kante zu einem zusätzlichen Stoppknoten (Kreis). Entsprechend führt eine Kante von einem Startknoten zum Knoten der Instruktion I 0. (Siehe Beispiel 3.15 unten.) Wir können nun mathematische Maschinen definieren:
3 MATHEMATISCHE MASCHINEN 22 3.10 DEFINITION. Eine mathematische Maschine M * B P ist eine Basismaschine B zusammen mit einem B-Programm P. Die Maschine M ist (nicht-)deterministisch, wenn P (nicht-)deterministisch ist. Wenn nicht anders festgelegt, sind im folgenden Programme und Maschinen stets deterministisch. Zur Beschreibung der Arbeitsweise einer mathematischen Maschine ordnen wir dieser ein Rechensystem zu. Den einzelnen Schritten der Maschine entsprechen dabei die Übergänge des zugehörigen Umformungssystems. 3.11 DEFINITION. Sei M + B P eine (möglicherweise nichtdeterministische) mathematische Maschine, wobei B, I O S in out OPER TEST und P * I i : i ) n (und 0 die Adresse von I 0 sei). Das zu M gehörende Rechensystem R M ist wobei - KON M Z P S R M I O KON M In Out - In : I KON M mit In x & 0 in x - - Out : KON M O mit Out i s out s - M KON M KON M mit / i s. 0 1 j f s - falls i f j 2 P M j s falls i t j k 2 P &t s 0 k s falls i t j k 2 P &t s 1 Mit dieser Definition lassen sich die für Umformungs- und Rechensysteme entwickelten Begriffe auf mathematische Maschinen übertragen. Insbesondere können wir von M -Rechnungen und deren Länge sprechen. Unter einer M-Rechnung bei Eingabe x verstehen wir eine maximale (d.h. unendliche oder terminale) U M KON M M - Rechnung, die mit In x beginnt. Im deterministischen Fall ist diese eindeutig bestimmt (s.u.). Ist die M-Rechnung bei Eingabe x endlich, so sagen wir, dass M bei Eingabe x terminiert oder konvergiert (andernfalls divergiert M). Die Rechenzeit time M x von M bei Eingabe x ist die Länge der M-Rechnung bei Eingabe x. M ist total, wenn M bei jeder Eingabe terminiert. 3.12 LEMMA. Das zu einer deterministischen mathematischen Maschine M * B P gehörende Rechensystem R M ist deterministisch. BEWEIS. Da es zu jedem Zustand i höchstens eine Instruktion in P mit Adresse i gibt, ist M deterministisch. Nach Lemma 3.5 berechnet also jede mathematische Maschine eine partielle Funktion: 3.13 DEFINITION. Sei M eine mathematische Maschine wie oben. Die von M berechnete partielle Funktion ϕ M : I O ist die Resultatsfunktion res R3 M4 des zugehörigen Rechensystems R M. Entsprechend heißt für nichtdeterministisches M R M RES R3 M4 I O die von M berechnete Relation. M
3 MATHEMATISCHE MASCHINEN 23 Wir können diese Definition erweitern und Berechenbarkeit, Entscheidbarkeit und Aufzählbarkeit relativ zu einer Basismaschine wie folgt definieren. 3.14 DEFINITION. Eine partielle bzw. totale Funktion ϕ : I O heißt partiell bzw. (total) B-berechenbar, falls es ein B-Programm P gibt, sodass ϕ ϕ3 B5 P4 die von B P berechnete Funktion ist. Eine Teilmenge A I heißt B-entscheidbar, falls die charakteristische Funktion c A von A B-berechenbar ist und A heißt B-aufzählbar, falls die partielle charakteristische Funktion χ A von A partiell B-berechenbar ist. Hier erfolgt die Rückführung von B-Entscheidbarkeit und B-Aufzählbarkeit auf die (partielle) B-Berechenbarkeit in Entsprechung zu Satz 2.10 und Satz 2.12. Mit F B und F Tot B bezeichnen wir die Klasse der partiell B-berechenbaren bzw. total B-berechenbaren Funktionen. Wir erweitern Definition 3.14 sinngemäß zu Familien 67 7 B i von Basis-Maschinen. In der Regel werden hierbei gleichartige Basismaschinen zusammengefasst. Z.B. sind die Eingaben einer Basismaschine festgelegt, sodass alle B-berechenbaren Funktionen dieselbe Stelligkeit haben. Variable Stelligkeit erfordert also eine Familie von Basismaschinen. Wir sagen, dass zwei Maschinen M und M äquivalent sind, wenn sie dieselbe partielle Funktion berechnen. Entsprechend sind zwei Basismaschinen B und B äquivalent, wenn F B F B gilt. Wir erläutern nun die obigen Definitionen anhand von einigen Beispielen: 3.15 BEISPIEL. Wir geben eine mathematische Maschine M & B P zur Ausführung der Addition bzgl. der Unärdarstellung, d.h. zur Konkatenation zweier Unärwörter an. Hierzu speichern wir Paare von Unärwörtern und erlauben bei nichtleerer 1. Komponente diese um eine 1 zu kürzen und diese an die 2. Komponente anzuhängen. Iteration dieser Operation erlaubt das Paar v w in λ vw zu überführen. Weiter können wir testen, ob die erste Komponente leer ist (und wir das Verfahren abbrechen können). Die gerade aufgeführten Anforderungen führen zu der Basismaschine B & I O S in out OPER TEST, wobei I S Σ1 Σ1 O Σ1 in v w v w, out v w w, OPER f mit f v1 w + v w1 und f λ w $ λ w sowie TEST, t mit t v1 w 0 und t λ w 1. Das B-Programm P zur Berechnung der Konkatenation besteht dann aus folgenden beiden Instruktionen: P 78 0 t 1 2 9 1 f 0. Bei Eingabe 111 11 werden folgende Konfigurationen durchlaufen: 0 111 11 : M 1 111 11 M 0 11 111 M 1 11 111 M 0 1 1111 M 1 1 1111 M 0 λ 11111 M 2 λ 11111 Das Syntaxdiagramm für P hat die Gestalt
A A >? A A A A? 3 MATHEMATISCHE MASCHINEN 24 Start 0? x λ? A A 1 x ;<; y =<= Stop wobei x y die beiden Komponenten der aktuellen Speicherbelegung sind und x ;B; und y =C= das De- bzw. Inkrementieren der entsprechenden Komponenten bezeichnen. 3.16 BEISPIEL. Alternativ kann eine Maschine zur Berechnung von D : Σ1 Σ1 Σ1 angegeben werden, die die Konkatenation in einem Schritt berechnet. In der formalen Definition der Basismaschine ändern sich dann OPER und TEST wie folgt: OPER g, wobei g v w $ λ vw und TEST Programm. /0. P *8 0 g 1 ist hier das gewünschte 3.17 BEISPIEL. Sei f : I O eine beliebige totale Funktion. Eine Maschine M B P, die f berechnet, erhält man durch B * I O S in out OPER TEST wobei S I in x x, out x f x, OPER id mit id x x und TEST /0 und P E 0 id 1. Die Maschine M B P mit B & I OFGIH S in out OPER TEST, wobei S I J O FKIH, in x * x -H, out x y y, OPER & g mit g x y x f x 9 und TEST /0 und mit P E 0 g 1 berechnet ebenfalls die Funktion f. Beispiel 3.17 zeigt, dass es mathematische Maschinen gibt, die (im intuitiven Sinne) nichtberechenbare Funktionen berechnen. Nicht jede mathematische Maschine beschreibt also einen Algorithmus. Damit mathematische Maschinen tatsächlich Algorithmen beschreiben, müssen ihre Komponenten effektiv sein. (Für nichtberechenbares f wird dies im obigen Beispiel von der Ausgabefunktion out von M bzw. der Operation g von M verletzt.) In der Tat sollten die Einzelschritte in Algorithmen nicht nur effektiv, sondern sehr einfach, nämlich lokal sein. Das Additionsverfahren in Beispiel 3.15 wird dem gerecht: Fasst man hier eine Speicherbelegung v w als Wort über dem Alphabet 1 L 2 L auf, so erfordert die Ausführung der Operation nur das lokale Verschieben des Kommas um eine Stelle nach links ( v1 w geht über in v 1w ).
3 MATHEMATISCHE MASCHINEN 25 Die Operation in 3.16 ist ebenfalls effektiv, für die gerade betrachtete Speicherdarstellung aber nicht lokal, wenn man g v w λ vw wiederum durch Verschieben des Kommas nach links realisiert. Hier muss das Komma um M v M Buchstaben verschoben werden, der Aufwand zur Ausführung von g hängt also von der aktuellen Länge der ersten Komponente ab. Hier wird man daher entweder eine andere lokale Realisierung von g verlangen oder die Maschine verfeinern, indem man die Operation g durch eine Schrittfolge aus lokalen elementaren Verschiebeoperationen ersetzt, was im Wesentlichen zur Maschine aus Beispiel 3.15 führt. Die Beobachtung, dass sich jede effektive Operation derart zu einer Folge elementarer Zeichenmanipulationen reduzieren lässt, liegt unserer ersten Formalisierung des Algorithmenbegriffs zugrunde, die wir im nächsten Abschnitt betrachten werden. 1 1 Der Speicherinhalt einer Maschine, die einen Algorithmus beschreibt, ist zu jedem Zeitpunkt endlich, kann also durch ein Wort beschrieben werden. Eine lokale Operation entspricht dann der Ersetzung eines bestimmten Teilwortes an einer bestimmten Stelle. Umformungssysteme, die auf solchen Termersetzungen basieren, werden im Kapitel über Formale Sprachen (s. Definition 21.1) eingeführt und näher untersucht werden.