Mathematische Maschinen Ziel: Entwicklung eines allgemeinen Schemas zur Beschreibung von (mathematischen) Maschinen zur Ausführung von Algorithmen (hier: (partiellen) Berechnungsverfahren).
Mathematische Maschine = Basismaschine + Programm Basismaschine: Ein-/Ausgabemechanismus Speicherstruktur Endlicher Satz von Speicheroperationen Endlicher Satz von Speichertests Programm: Festlegung der auszuführenden Folge von Operationen und Tests
Basismaschine B = (I, O, S, in, out, OP ER, T EST ) I Eingabenmenge; O Ausgabenmenge S Speicher = Menge der Speicherbelegungen in : I S (totale) Eingabefunktion out : S O (totale) Ausgabefunktion OP ER = {f 1,..., f m } endliche Menge der Operationen Operation = totale Funktion f : S S T EST = {t 1,..., t n } endliche Menge der Tests Test = totale Funktion f : S {0, 1}
Anmerkungen: Die Eingabefunktion in : I S liest die Eingabe ein und stellt diese geeignet im Speicher dar. In jedem Rechenschritt wird entweder eine Operation (=Speichertransformation) oder ein Test (= Überprüfung der Speicherbelegung bzgl. eines Kriteriums) durchgeführt. Die Ausgabefunktion out : S O entnimmt der (abschliessenden) Speicherbelegung die Ausgabe.
BEISPIEL: Eine Basismaschine B = (I, O, S, in, out, OP ER, T EST ), die zur Berechnung von 2-stelligen Funktionen f über den natürlichen Zahlen dienen soll (d.h. f : N N N): Eingabemenge: I = N N Ausgabemenge: O = N Speicher: S = N 4 (1. und 2. Komponente für Eingabe, 3. Komponente für Ausgabe, 4. Komponente zusätzlicher Speicher für eine Hilfszahl) Eingabefunktion: in : I S mit in(x 1, x 2 ) = (x 1, x 2, 0, 0) Ausgabefunktion: out : S O mit out(x 1, x 2, x 3, x 4 ) = x 3 Operationen: OP ER = {a 1,..., a 4, s 1,..., s 4 } mit a 1 (x 1, x 2, x 3, x 4 ) = (x 1 +1, x 2, x 3, x 4 ) und s 1 (x 1, x 2, x 3, x 4 ) = (x 1 1, x 2, x 3, x 4 ) etc., wobei x y = x y für x > y und x y = 0 für x y Tests: T EST = {t 1,..., t 4 } mit t i (x 1,..., x 4 ) = 1 g.d.w. x i > 0
Die Steuerung von B erfolgt durch ein B-Programm. Zur Definition von B-Programmen führen wir zunächst B-Instruktionen ein: I = (i, f, j) Operationsinstruktion i N Adresse von I f OP ER auszuführende Operation j N Nachfolgeadresse von I I = (i, t, j, k) Testinstruktion i N Adresse von I t T EST auszuführender Test j, k N mögliche Nachfolgeadressen von I j Nachfolgeadresse bei negativem Testausgang (t(s) = 0) k Nachfolgeadresse bei positivem Testausgang (t(s) = 1)
Anmerkungen: Adressen nennen wir auch (Programm-)Zustände. Anschauliche Interpretation der Instruktionen: Befindet sich die Rechnung im Zustand i wird als nächstes die Instruktion I mit Adresse i ausgeführt. Ist I = (i, f, j) eine Operationsinstruktion wird die aktuelle Speicherbelegung s in f(s) transformiert und der neue Programmzustand j angenommen. Ist I = (i, t, j, k) eine Testinstruktion wird der Test t auf die aktuelle Speicherbelegung s angewandt. Geht der Test negativ aus (t(s) = 0) ist der neue Programmzustand j, sonst k. Damit die Rechnung eindeutig ist, darf es für jeden Programmzustand i höchstens eine Instruktion mit Adresse i geben.
B-Programm P : P = I 0,..., I n ist eine endliche Folge von Instruktionen I i, wobei verschiedene Instruktionen verschiedene Adressen besitzen. (Ohne die Zusatzbedingung spricht man von nichtdeterministischen Programmen.) Ein Zustand von P ist die Adresse, Nachfolgeadresse oder mögliche Nachfolgeadresse einer Instruktion von P. Die Menge der Zustände von P wird mit Z P bezeichnet. Ein Zustand der keine Adresse ist, ist ein Stoppzustand. Weiter wird eine der Adressen als Startzustand ausgezeichnet. O.B.d.A. gehen wir im Folgenden davon aus, dass die Adresse von I 0 der Startzustand 0 ist. (In einem deterministischen Programm können wir weiter O.B.d.A. annehmen, dass stets i die Adresse von I i ist.) (Interpretation: Die Rechnung beginnt im Startzustand, d.h. die Instruktion I 0 wird als erste ausgeführt. Wird ein Stoppzustand erreicht, so kann keine Instruktion angewendet werden und die Rechnung wird beendet.) Bemerkung: Programme lassen sich graphisch durch Flussdiagramme darstellen.
BEISPIEL: Ein B-Programm P zur Berechnung der Addition für die zuvor eingeführte Basismaschine B. Idee. Zähle die erste Speicherkomponente x 1 herunter auf 0 und gleichzeitig die 0 in der dritten Komponente hoch auf x 1. Dann zähle die zweite Komponente x 2 herunter auf 0 und gleichzeitig die dritte Komponente hoch von x 1 auf x 1 + x 2. (Die 4. Komponente wird hier nicht benötigt.) (0, t 1, 3, 1) (1, s 1, 2) (2, a 3, 0) (3, t 2, 6, 4) (4, s 2, 5) (5, a 3, 3) Zugehöriges Flussdiagramm: s. Tafel
Wir können nun zusammenfassend mathematische Maschinen definieren. Eine mathematische Maschine M = (B, P ) ist eine Basismaschine B zusammen mit einem B-Programm P. Eine nichtdeterministische (nd.) mathematische Maschine M = (B, P ) ist eine Basismaschine B zusammen mit einem nichtdeterministischen B-Programm P. Bem.: Im Folgenden sind Maschinen und Programme nur dann nd., wenn dies explizit gesagt wird.
Um die Arbeitsweise einer (nd.) mathematischen Maschine M = (B, P ) formal zu beschreiben führen wir zunächst Umformungssysteme ein, darauf aufbauend Rechensysteme, und ordnen schließlich M ein Rechensystem zu. Umformungssystem: schematische Beschreibung der internen Rechnung von M Rechensystem: Erweiterung um Ein- und Ausgabeeinheit
Umformungssystem U = (KON, ) KON Menge der Konfigurationen KON KON Einschritt- oder Übergangsrelation Schreib- und Sprechweise: Statt (c, c ) schreiben wir c c und sagen c ist Nachfolgekonfiguration von c. Besitzt c keine Nachfolgekonfiguration, so heisst c Stoppkonfiguration. U ist ein deterministisches Umformungssystem, wenn jede Konfiguration höchstens eine Nachfolgekonfiguration besitzt.
Eine endliche U-Rechnung (der Länge n) ist eine Konfigurationenfolge c 0,..., c n mit c i c i+1 (i = 0,..., n 1) Ist c n eine Stoppkonfiguration, so heisst die Rechnung terminal. Eine unendliche U-Rechnung ist eine unendliche Konfigurationenfolge c 0, c 1, c 2,... mit c i c i+1 (für alle i 0) Eine U-Rechnung ist maximal, wenn sie terminal oder unendlich ist. Wir schreiben c c (c n c ), wenn es eine endliche mit c beginnende und c endende U-Rechnung (der Länge n) gibt.
Beobachtungen: Für deterministisches U gilt: Für jedes n und jede Konfiguration c gibt es höchstens eine mit c beginnende U-Rechnung der Länge n. Für jede Konfiguration c gibt es genau eine mit c beginnende maximale U-Rechnung.
Rechensystem R = (I, O, KON, In, Out, ) I Eingabemenge O Ausgabemenge In : I KON (totale) Eingabefunktion Out : KON O (totale) Ausgabefunktion U R := (KON, ) zugehöriges Umformungssystem R ist deterministisch, falls U R deterministisch ist. Die Resultatsrelation Res R I O von R is definiert durch: (x, y) Res R c(in(x) c & c Stoppkonfig. & Out(c) = y)
Für deterministisches R ist Res R rechtseindeutig, d.h. zu jeder Eingabe x gibt es höchstens eine Ausgabe y mit (x, y) Res R. Hier kann also Res R als partielle Funktion res R : I O aufgefasst werden. (Resultatsfunktion von R) Als nächstes ordnen wir nun jeder (deterministischen oder nichtdeterministischen) Mathematischen Maschine M = (B, P ) ein Rechensystem R(M) und damit eine Resultatsrelation zu. Für deterministisches M wird R(M) ebenfalls deterministisch sein, also eine partielle Resultatsfunktion liefern. Diese werden wir die von M berechnete (partielle) Funktion nennen.
Sei M = (B, P ) eine (det. oder nd.) mathematische Maschine mit B = (I, O, S, in, out, OP ER, T EST ) und P = {I i : i n}. Zu M gehörendes Rechensystem R(M): R(M) = (I, O, KON M, In, Out, M ) wobei KON M = Z P S 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 (j, f(s)) falls (i, f, j) P (i, s) M (j, s) falls (i, t, j, k) P & t(s) = 0 (k, s) falls (i, t, j, k) P & t(s) = 1
Ist M deterministisch, so ist das zugehörige Umformungssystem U M = (KON M, M ) und damit auch das zugehörige Rechensystem R(M) deterministisch, d.h. definiert eine (partielle) Resultatsfunktion res R(M) : I O. Wir nennen diese die von M berechnete (partielle) Funktion und bezeichnen diese mit ϕ M. (Im nd. Fall nennen wir entsprechend RES R(M) die von M berechnete Relation.) Statt von U M -Rechnungen sprechen wir auch von M-Rechnungen. Die M- Rechnung bei Eingabe x ist die (eindeutig bestimmte) maximale mit In(x) beginnende U M -Rechnung. Ist diese endlich, so sagen wir, dass M bei Eingabe x terminiert oder konvergiert (andernfalls divergiert M). M ist total, falls M bei jeder Eingabe terminiert. ϕ M (x) ist genau dann definiert, wenn M bei Eingabe x definiert, d.h. die Rechnung von M bei Eingabe x endlich ist. In diesem Fall gilt ϕ M (x) = Out(i, s), wobei (i, s) die letzte Konfiguration der Rechnung ist.
B-Berechenbarkeit Jede Basismaschine B = (I, O, S, in, out, OPER, TEST) (mit {0, 1} O) definiert einen Berechenbarkeits-, Entscheidbarkeits- und Aufzählbarkeitsbegriff: Eine (partielle) Funktion ϕ : I O ist (partiell) B-berechenbar, wenn es ein B-Programm P gibt, sodass ϕ = ϕ M für M = (B, P ) gilt. Eine Teilmenge A von I ist B-entscheidbar, falls die charakteristische Funktion c A von A B-berechenbar ist. Eine Teilmenge A von I ist B-aufzählbar, falls die partielle charakteristische Funktion χ A von A partiell B-berechenbar ist.
Entsprechend definiert jede Familie B von Basismaschinen einen Berechenbarkeitsbegriff. Z.B. ist eine partielle Funktion ϕ genau dann partiell B-berechenbar, wenn es eine Basismaschine B B gibt, sodass ϕ partiell B-berechenbar ist. WARNUNG: B-Berechenbarkeit impliziert i.a. nicht Berechenbarkeit im intuitiven Sinn. Hierzu muss zusätzlich sichergestellt sein, dass die Grundfunktionen von B (d.h. Ein- und Ausgabefunktion sowie die elementaren Operationen und Tests) berechenbar sind!
Notation: F (B) = {ϕ : ϕ partiell B-berechenbar} F T ot (B) = {f : f (total) B-berechenbar} F (B) und F T ot (B) sind entsprechend für Familien B von Basismaschinen definiert. Zwei Maschinen M und M sind äquivalent, wenn sie dieselbe partielle Funktion berechnen, d.h. wenn ϕ M = ϕ M gilt. Entsprechend heissen zwei Basismaschinen B und B äquivalent, wenn F (B) = F (B ) gilt, und zwei Familien von Basismaschinen B und B sind äquivalent, wenn F (B) = F (B ) gilt.