DAP 1 Datenstrukturen, Algorithmen und Programmierung Bernhard Steffen Lehrstuhl für Programmiersysteme B. Steffen 1
Was ist Informatik? Informatik ist die Wissenschaft von der Informationsverarbeitung. Auffallend ist, daß in dieser Definition das Wort Computer nicht vorkommt. Im Vordergrund stehen prinzipielle Fragen wie: B. Steffen 2
Wo liegen die Grenzen des (automatisch) Berechenbaren? Wie können komplexe Probleme zuverlässig behandelt werden? Warum ist eine Programmier-, Modellierungs- oder Spezifikationssprache so und nicht anders entworfen worden? (formales Sprachdesign) Welche Maschinenarchitekturen sind zur Realisierung spezieller Problemklassen am besten geeignet? (abstrakte Maschinen- und Berechnungsmodelle, verteilte Systeme und parallele Algorithmen) Was sind die wesentlichen Charakteristika eines Problems in Hinblick auf eine abstrakte Modellierung (Problemanalyse, Requirements Engineering)? Wann läßt sich ein gegebenes Verfahren einsetzen (Anwendungsprofile)? Wer sind die zukünftigen Interessenten und Anwender (Relevanzanalyse)? B. Steffen 3
Wissenschaftliche Einordnung geisteswissenschaftliche Natur ingenieurwissenschaftlicher Charakter mathematischer Charakter B. Steffen 4
Mathematische Wurzeln Algebra Logik Statistik Zahlentheorie Operations Research Informationstheorie Codierungstheorie Modelltheorie Kryptographie Topologie Geometrie Kontrolltheorie Kybernetik B. Steffen 5
Auseinandersetzung mit Abstrakten Strukturen Programmstrukturen, Sprachstrukturen, Datenstrukturen, Rechnerstrukturen,... Strukturwissenschaft B. Steffen 6
Historie bis Ende der 80er B. Steffen 7
Anfänge des Rechnens Jahr Entwicklungsschritt 1700 v. Chr. Älteste schriftliche Rechenaufgabe, auf Papyrus in Ägypten 300 v. Chr. Euklidischer Algorithmus 5. Jh. n. Chr. Benutzung von Dezimalzahlen in Indien 820 n. Chr. Mukhammad ibn Musa Al-Chowarizmi (etwa 780-850), persischer Mathematiker und Astronom, Buch über Algebra 1202 Liber abaci (erste systematische Einführung in Rechnen mit Dezimalzahlen) von Leonardo von Pisa, genannt Fibonacci (etwa 1180-1240), italienischer Mathematiker 1524 Rechenbuch von Adam Riese (1492-1559) B. Steffen 8
Erste Ansätze zu Rechenmaschinen Jahr Entwicklungsschritt 1623 Mechanische Rechenmaschine für vier Grundrechenarten von Wilhelm Schickard (1592-1635) 1641 Maschine zur Addition von sechsstelligen Zahlen, konstruiert von Blaise Pascal (1623-1662) 1673 Gottfried Wilhelm Leibniz (1646-1716) konstruiert Rechenmaschinen mit Staffelwalzen für vier Grundrechenarten, befasst sich auch mit dualem Zahlensystem 1774 Erste zuverlässig arbeitende mechanische Rechenmaschine, in Serie hergestellt von Philipp Matthäus Hahn (1739-1790) B. Steffen 9
Erste Ansätze zu Rechenmaschinen Jahr um 1800 Entwicklungsschritt Mittels Lochkarten gesteuerter automatischer Webstuhl von Joseph-Marie Jacquard (1752-1834) 1833 Analytical Engine von Charles Babbage (1792-1871); Lady Augusta Ada Byron (1815-1852), Countess of Lovelace, entwickelt dazu die erste Programmiersprache 1886 Erfindung der Lochkarte von Hermann Hollerith (1860-1929); Entwicklung verschiedener elektrischer Lochkartenmaschinen (u.a. Einsatz zur Volkszählung); Programmierung mittels Steckkarten B. Steffen 10
Erste Meilensteine der Computerentwicklung Jahr Entwicklungsschritt 1934 Konrad Zuse (1910-1995) beginnt mit Planung einer programmgesteuerten Rechenmaschine auf Basis des dualen Zahlensystems und Gleitkomma-Zahlendarstellung 1939 Alan M. Turing (1912-1954) entwickelt ein nach ihm benanntes Maschinenmodell, das als Grundlage der Berechenbarkeitstheorie dient 1941 Z3 von Zuse fertiggestellt; sie ist die erste funktionsfähige programmgesteuerte Rechenmaschine; (Telefon-) Relais als Schaltelemente; Programmierung mithilfe von Lochstreifen (Filmrollen), die bei Bedarf zu Schleifen zusammengeklebt werden konnten; Multiplikationszeit: ca. 3 s 1944 Howard Hathaway Aiken (1900-1973) erbaut Mark I, Rechenautomat auf Basis von Dezimalzahlen B. Steffen 11
Erste Meilensteine der Computerentwicklung Jahr Entwicklungsschritt 1946 ENIAC: Erster elektronischer Rechner (18000 Elektronenröhren, 1500 Relais), gebaut von John Presper Eckert (1919*) und John William Mauchly (1907-1980) Multiplikationszeit: ca. 3 ms; John von Neumann (1903-1957) erfindet den Programmspeicher 1949 EDSAC: Erster universeller Digitalrechner mit gespeichertem Programm von Maurice Vincent Wilkes (1913*) 1950 Erster russischer Rechner von S.A. Lebedev fertiggestellt (MESM, mit Röhren als Schaltelementen) ab 1950 Industrielle Serienproduktion von elektronischen Rechenanlagen B. Steffen 12
Hauptquelle: D. Roller Informatik - Grundlagen. Mit einer Einführung in PASCAL. Springer-Verlag, Heidelberg, 1994. Weiterführende Literatur: J.A.N. Lee: Computer Pioneers. IEEE Computer Society Press, 1995. (80 SR 800 L478) K. Zuse. Der Computer - mein Lebenswerk. Springer-Verlag, Heidelberg, 1984. (80 SR 800 Z96(2)) F.L. Bauer. Konrad Zuse - Fakten und Legenden. Informatik Spektrum, Band 19, Heft 6, Dezember 1996, 299-302 R. Rojas. Die Architektur der Rechenmaschinen Z1 und Z3 von Konrad Zuse. Informatik Spektrum, Band 19, Heft 6, Dezember 1996, 302-315 K. Ganzhorn, W. Walter. Die geschichtlicheentwicklung der Datenverarbeitung. IBM Deutschland GmbH, Böblingen, 1975 B. Steffen 13
Computereinteilung in Generationen Generation Merkmale 1 Bis Ende der 50er Jahre Hardware: Elektronenröhren (Schaltzeit 1 ms; störanfällig) und Relais (Schaltzeit 0,1 s; relativ zuverlässig) als Schaltelemente; Drucker und Magnetbänder als Peripheriegeräte Software: Praktisch keine (System-) Software; Programmierung in Maschinencode (Zahlenkolonnen) 2 ab 1957 bis Ende der 60er Jahre Hardware: Transistoren (Schaltzeit 10 µs) als Schaltelemente; Ferritkern-, Band-, Trommel-, Plattenspeicher; Lochstreifen als neues Peripheriegerät Software: Erste Betriebssysteme für Stapelverarbeitung (Batch-Betrieb); erste problemorientierte Programmiersprachen (COBOL, FORTRAN, ALGOL, LISP) B. Steffen 14
Computereinteilung in Generationen Generation Merkmale 3 ab Mitte der 60er Jahre Hardware: Mikromodultechnik (integrierte Schaltkreise): ca. 20 Schaltelemente pro cm 2 (Schaltzeit ca. 10 ns); Kanäle, Magnetplatten und Bildschirme (Terminals) statt Teletypes als typischeperipheriegeräte Software: Betriebssysteme mit Dialogbetrieb, Datenbanken, Programmiersprache ALGOL 68 4 ab Anfang der 70er Jahre Hardware: Überwiegend hochintegrierte Schaltkreise (LSI); kompletter Prozessor auf einem Chip; PCs und Workstations; 8-BitArchitektur Software: Strukturierte Programmierung, Software-Engineering, imperative Programmiersprachen PASCAL, C; funktionale Programmiersprache ML, Betriebssysteme mit Mehrbenutzerbetrieb (Time-sharing) und lokale Netzwerke; Microcomputer und erstes portables Betriebssystem (UNIX) B. Steffen 15
Computereinteilung in Generationen Generation Merkmale 5 seit Anfang der 80er Jahre Hardware: Höchstintegrierte Schaltkreise (VLSI): mehrere Prozessoren auf einem Chip; Homecomputer, PCs und Workstations; 16- und 32-Bit-Architektur Software: Graphik; globale Vernetzung; Künstliche Intelligenz (KI) Logikorientierte Programmiersprachen (PROLOG); objektorientierte Programmiersprachen (Smalltalk) 6 seit Anfang der 90er Jahre Hardware: Hochprogrammierbare Bausteine (Field Programmable Gate Arrays); Embedded Systems Software: Ereignisorientierte Programmierung; Internetprogrammierung, Middleware, Integrationsframeworks. Programmiersprachen: JAVA, Delphi, Erlang und Modellierurng in UML B. Steffen 16
Computereinteilung in Generationen Generation Merkmale 7 seit Anfang 2000 Hardware: SoCs (Systems on a Chip, MEMSs (Micro-electro-mechanical systems) Software: Heterogene, sich dynamisch entwickelnde Netzwerke von Systemen und Endgeräten. Programmiertechnologie zunehmend Model Driven Design. Hauptquelle der historischen Angaben: D. Roller Informatik - Grundlagen. Mit einer Einführung in PASCAL. Springer-Verlag, Heidelberg, 1994. B. Steffen 17
Einteilung der Informatik Theoretische Informatik Theorie der Berechenbarkeit Praktische Informatik Algorithmen und Datenstrukturen Technische Informatik Entwicklung von Hardwarekomponenten (Schaltkreise, -netze, -werke) Angewandte Informatik Automatisierungs- Technik in Konstruktion und Produktion Komplexitätstheorie Programmiersprachen und Übersetzer Rechnerorganisation und -architektur Computergraphik und Simulation Theorie der formalen Sprachen, Automatentheorie Programmiermethoden und -werkzeuge Periphere Geräte und Rechnernetze Kaufmännische Datenverarbeitung u. Büroautomatisation Formale Semantik, Programmverifikation Betriebssysteme, Informationssysteme............ Quelle: D. Roller Informatik - Grundlagen. Mit einer Einführung in PASCAL. Springer-Verlag, Heidelberg, 1994. B. Steffen 18
Inhaltliche Übersicht 1. Motivation 2. Programmieren im Kleinen / Großen 3. Struktur und Invarianz 4. Das WHILE-Fragment von Java 5. Algorithmen, Datenstrukturen und Rekursion 6. Objektorientierte Erweiterungen B. Steffen 19
Programmieren im Großen B. Steffen 20
Programmentwicklungsphasen 1. Analyse 2. Modellierung 3. Design 4. Implementierung 5. Test Organisiert in einem iterativen Prozess B. Steffen 21
Abstraktion & Kompositionalität Modelle Architekturen Konzepte Problemorientiert Problem Plattformorientiert Prozesse getestete Produkte Implementierungen Algorithmen & Datenstrukturen B. Steffen 22
getestete Produkte Implementierungen Algorithmen & Datenstrukturen B. Steffen 23
Programm-Strukturen Schleifen x = n; y = 1; while (x > 1) { y = y x; x = x-1; } Rekursion Fak(n) = if n = 1 then 1 else n Fak(n-1) Fak(n) = 1 2 3... n B. Steffen 24
Programm-Strukturen Schleifen, Rekursion Prozeduren, Module Prog Begin End Proc Fak. : Fak(n) B. Steffen 25
Problem getestete Produkte Implementierungen Algorithmen & Datenstrukturen B. Steffen 26
Analyse B. Steffen 27
Lehrer Schueler Elternteil B. Steffen 28
Modelle Implementierungen Problemorientiert Problem getestete Produkte Algorithmen & Datenstrukturen B. Steffen 29
Assoziation Geschäftsprozeß Szenario Statische Konzepte Dynamische Konzepte Vererbung Paket Botschaft Zustandsautomat Attribut Operation Statisches Modell Basiskonzepte Objekt Klasse Dynamisches Modell B. Steffen 30
Modellierung B. Steffen 31
B. Steffen 32
Modelle Architekturen Implementierungen Plattformorientiert Problem getestete Produkte Problemorientiert Algorithmen & Datenstrukturen B. Steffen 33
Architektur-Design B. Steffen 34
Modelle Architekturen Problemorientiert Problem Plattformorientiert Prozesse getestete Produkte Implementierungen Algorithmen & Datenstrukturen B. Steffen 35
SW-Management 1 Grundlagen SW-Entwicklung 1 Die Planungsphase SW-Qualitätssicherung 1 Grundlagen 2 Planung 2 Die Definitionsphase 2 Qualitätssicherung 3 Organisation 3 Die Entwurfssphase 3 Manuelle Prüf methoden 4 Personal 4 Die Implementierungsphase 4 Prozeßqualität 5 Leitung 5 Die Abnahme und Einführungsphase 5 Produktqualität -Komponenten 6 Kontrolle 6 Die Wartungs- und Pflegephase 6 Produktqualität -Systeme B. Steffen 36
Modelle Architekturen Konzepte Problemorientiert Problem Plattformorientiert Prozesse getestete Produkte Implementierungen Algorithmen & Datenstrukturen B. Steffen 37
Konzeptuelle Strukturen 1 (Sprach-Design) x = 1 x = x + 1 x = x + 1 x =? Granularität? Java: X += ++X + X++? B. Steffen 38
Konzeptuelle Strukturen 2 (Sprach-Design) M M M K T K T Wer entscheidet? B. Steffen 39
Abstraktion & Kompositionalität Modelle Architekturen Konzepte Problemorientiert Problem Plattformorientiert Prozesse getestete Produkte Implementierungen Algorithmen & Datenstrukturen B. Steffen 40
Abstraktion und Kompositionalität Konzentration auf das Wesentliche Konzentration auf spezielle Aspekte Konzentration auf Entscheidbares Ersetzen von Gleichem durch Gleiches Hierarchische (Programm-)Entwicklung Bibliothekskonzepte B. Steffen 41
Inhaltliche Übersicht 1. Motivation 2. Programmieren im Kleinen / Großen 3. Struktur und Invarianz 4. Das WHILE-Fragment von Java 5. Algorithmen, Datenstrukturen und Rekursion 6. Objektorientierte Erweiterungen B. Steffen 42
Programmieren im Kleinem B. Steffen 43
Phasen der Programmentwicklung im Kleinen reale Welt abstrakte Objekte informationsverarb. System Abstraktion Darstellung Realisierung Problem Algorithmus Programm Problemanalyse, funktionale Spezifikation, Algorithmenentwurf Darstellung in formalisierter Sprache zur Ausführung durch Rechner Umsetzung in Elementarschritte einer Maschine Maschine B. Steffen 44
Schlüsselkriterien Korrektheit Effizienz Algorithmik Skalierbarkeit Implementierung Integration B. Steffen 45
Vorgehen bei der Programmentwicklung im Kleinen 1. Problemformulierung 2. Problemanalyse, Problemabstraktion und -formalisierung, Problemspezifikation 3. Algorithmenentwurf 4. Korrektheitsnachweis (Semantikanalyse) 5. Aufwandsanalyse (Komplexitätsanalyse) 6. Programmkonstruktion 7. Verifikation und Test B. Steffen 46
Vorgehen bei der Programmentwicklung im Grossen 1. Analyse 2. Modellierung 3. Design 4. Implementierung 5. Test Organisiert in einem iterativen Prozess B. Steffen 47
Problemformulierung/Analyse 1. Finden einer Zahl in einer Zahlenmenge. 2. Algorithmische Idee: Das Telefonbuchprinzip: Vorsortieren Intervallschachtelung B. Steffen 48
Algorithmenentwurf Umsetzen der algorithmischen Idee in eine abstrakte, eindeutig interpretierbare Beschreibungsform. Klassisch sind die Flußdiagramme. Festlegen konzeptuell günstiger Datenstrukturen, hier sortierte Listen natürlicher Zahlen. Verwenden von Variablen L und R zur Charakterisierung des aktuellen Suchintervalls. B. Steffen 49
Flußdiagramme Start Stop z = 0 Wende Formel (3) an ja nein a<b a>b a==b? Vergleiche a und b a==b Lies x ein Gib x aus B. Steffen 50
Start Flußdiagramm zum Binären Suchen lies x ein L=1 R=n found=false L<=R && found==false? nein gib found aus gib Index m aus ja m=(l+r) / 2 End a[m]==x? ja found=true nein a[m]<x? ja L=m+1 nein vgl. vgl. DAP1-Skript DAP1-Skript Seite Seite6-10 R=m-1 B. Steffen 51
x {n 1, n 2,..., n k }? n 1 n k 1 1 n + 2 n k-1 n k n k + 1 2 2 L Instruktionen: n m = x? nein n m < x? nein! R := m-1 m Hilfsvariablen: L = 1 R = k Found = FALSE m = (k + 1) DIV 2 R B. Steffen 52
x {n 1, n 2,..., n k }? n 1 n k 1 1 n + 2 n k-1 n k n k + 1 2 2 L R m Hilfsvariablen: L = 1 R = m - 1 Found = FALSE m = (k + 1) DIV 2 B. Steffen 53
x {n 1, n 2,..., n k }? n k + 1 2 n 1 n 2 1 n k + 1 2 L R m Instruktionen: m := ( L+ R) DIV 2 Hilfsvariablen: L = 1 R = k Found = FALSE m = (k + 1) DIV 2 B. Steffen 54
x {n 1, n 2,..., n k }? n k + 1 2 n 1 n 2 1 n k + 1 2 L m R Instruktionen: n m = x? nein n m < x? ja! L:= m+1 Hilfsvariablen: L = 1 R = k Found = FALSE m = ( L+ R) DIV 2 B. Steffen 55
x {n 1, n 2,..., n k }? n k + 1 2 n 1 n 2 1 n k + 1 2 m L R Instruktionen: m := ( L+ R) DIV 2 Hilfsvariablen: L = m+1 R = k Found = FALSE m = ( L+ R) DIV 2 B. Steffen 56
x {n 1, n 2,..., n k }? n k + 1 2 n 1 n 2 1 n k + 1 2 L m R Und so weiter... Hilfsvariablen: L = m+1 R = k Found = FALSE m = ( L+ R) DIV 2 B. Steffen 57
10 {1,3,4,7,8,10,11,12,15,16,19,23,33,35,55}? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 3 4 7 8 10 11 12 15 16 19 23 33 35 55 L m R Instruktionen: 12 = 10? nein 12 < 10? nein! R := 7 Hilfsvariablen: L = 1 R = 15 Found = FALSE m = 8 B. Steffen 58
10 {1,3,4,7,8,10,11,12,15,16,19,23,33,35,55}? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 3 4 7 8 10 11 12 15 16 19 23 33 35 55 L R m Instruktionen: m:= 4 Hilfsvariablen: L = 1 R = 7 Found = FALSE m = 8 B. Steffen 59
10 {1,3,4,7,8,10,11,12,15,16,19,23,33,35,55}? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 3 4 7 8 10 11 12 15 16 19 23 33 35 55 L m R Instruktionen: 7 = 10? nein 7 < 10? ja! L:= 5 Hilfsvariablen: L = 1 R = 7 Found = FALSE m = 4 B. Steffen 60
10 {1,3,4,7,8,10,11,12,15,16,19,23,33,35,55}? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 3 4 7 8 10 11 12 15 16 19 23 33 35 55 m L R Instruktionen: m:= 6 Hilfsvariablen: L = 5 R = 7 Found = FALSE m = 4 B. Steffen 61
10 {1,3,4,7,8,10,11,12,15,16,19,23,33,35,55}? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 3 4 7 8 10 11 12 15 16 19 23 33 35 55 L m R Instruktionen: 10 = 10? ja! Found := TRUE Hilfsvariablen: L = 5 R = 7 Found = FALSE m = 6 B. Steffen 62
10 {1,3,4,7,8,10,11,12,15,16,19,23,33,35,55}? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 3 4 7 8 10 11 12 15 16 19 23 33 35 55 L m R Hilfsvariablen: L = 5 R = 7 Found = TRUE m = 6 B. Steffen 63
Korrektheitsnachweis 1. Symbolische Ausführung des Beschreibung 2. Analyse der Randfälle, z.b. R =1 oder L= R 3. Mathematischer Korrektheitsbeweis vgl. vgl. DAP1-Skript DAP1-Skript Seite Seite10-11 B. Steffen 64
Aufwandsanalyse Hierarchische Untersuchung des Aufwandswachstums bei wachsenden Inputparamtern von Elementaroperationen Schleifen- oder Rekursionsrümpfen vgl. vgl. DAP1-Skript DAP1-Skript Seite Seite12-13 Iterationskonstrukten: Wie oft werden sie durchlaufen? Beim binären Suchen beobachten wir bzgl. des Parameters n: Elementaroperationen/Rümpfe haben konstanten Aufwand Die Schleife wird maximal log 2 (n)+1-mal durchlaufen. Man sagt, der Algorithmus hat logarithmische Komplexität. B. Steffen 65
Programmkonstruktion 1. Automatisch, z.b. durch Compilation 2. Halbautomatisch über formale Transformationsregeln 3. Manuell, durch freie Programmierung 4. Gemischt, durch gezielte Computerunterstützung: Extraktion von Schnittstellencode Erzeugung von Klassenstrukturen Generierung von Datenstrukturen vgl. vgl. DAP1-Skript DAP1-Skript Seite Seite13-14 B. Steffen 66
L = 1; R = n; found = false; while (( L<=R) && (found = = false)) { m = (L+R) / 2; if (a[m] = = x) {found = true;} else { if (a[m] < x) {L = m+1;} else { R = m-1; } } } B. Steffen 67
Programmanalyse und Verifikation Verifikation á la Floyd und Hoare Programm- und Datenflußanalyse Type- und Rangechecking Modelchecking B. Steffen 68
Testmethoden Komponententest Integrationstest Funktionale Tests Regressionstest Performancetests B. Steffen 69
Inhaltliche Übersicht 1. Motivation 2. Programmieren im Kleinen / Großen 3. Struktur und Invarianz 4. Das WHILE-Fragment von Java 5. Algorithmen, Datenstrukturen und Rekursion 6. Objektorientierte Erweiterungen B. Steffen 70
Struktur und Invarianz B. Steffen 71
Abstraktionsebenen Objekte der realen Welt Begriffsbildung Abstraktion Verstehen Begreifen Begriffe, Information Darstellung Interpretation Repräsentationen B. Steffen 72
Eine Beispielinstanz ein konkreter Apfel Abstraktion (nicht alle Äpfel sind gleich) Verstehen (sich einen Apfel vorstellen) Begriffe: Apfel, pomme, apple, Boskop Darstellung Interpretation Repräsentationen: Apfel oder A p f e l B. Steffen 73
Semantikschemata Definition (Semantikschemata) Ein Semantikschema ist ein TupelR, I,. mit R: Menge der Repräsentationen oder Nachrichten I: Menge der Begriffe oder Informationen. R I: Semantik(-Relation) oder Interpretation. vgl. vgl. DAP1-Skript DAP1-Skript Seite Seite16-19 B. Steffen 74
Numerierungssysteme 25, 98 Abstraktion (Zahl, statt Objekt) Verstehen fünfundzwanzig, Begriffe: quatrevingtdixhuit, Darstellung Interpretation Repräsentationen:, (Babylonische Notation) XXV, LXXXXVIII oder XCVIII (Römische Notation) B. Steffen 75
Konvention Fallsr, i., so ist i eine Information zur Repräsentation r. Im folgenden schreiben wir oft i r anstelle von r, i.. Also r = df { i I r, i. } Ist r einelementig, so schreiben wir auch i = r. B. Steffen 76
Unärdarstellung natürlicher Zahlen R u = df {,,,...}, I u = df = df {1, 2,...} Natürliche Zahlen (als Begriffe bzw. Informationen, nicht als ihre Darstellung im Dezimalsystem! Siehe auch nächstes Beispiel),. u = df {..., k k }. k Die Semantik einer Nachricht aus k Strichen ist also die natürliche Zahl k. B. Steffen 77
Dezimaldarstellung natürlicher Zahlen R N = df {1, 2,..} Dezimalrepräsentation der natürlichen Zahlen, I N = df = df {1,2,...} Natürliche Zahlen (als Begriffe bzw. Informationen, nicht als ihre Notation im Dezimalsystem!),. N = df { (1,1), (2,2), (3,3),...}. B. Steffen 78
Binärdarstellung natürlicher Zahlen R B = df {(d i ) i n d i {0, 1}, n 0 }. I B = df 0 = df {0,1, 2,...} Natürliche Zahlen (wieder als Begriffe bzw. Informationen, nicht als ihre Notation im Dezimalsystem), n. B = df {(d i ) i n, d i *2 n - i n 0 } i=0 B. Steffen 79
Kardinalzahlen in MODULA-2 R K = df {0,1,...,2 B -1}, I K = df 0 = df {0, 1, 2,...} Natürliche Zahlen (wieder als Begriffe bzw. Informationen, nicht als ihre Notation im Dezimalsystem),. K = df {k, k k R K }. B. Steffen 80
Vervollständigte Kardinalzahlen Achtung: Folie verändert! R uo = df R k {underflow, overflow}, I uo = df, r uo = df {i i > 2 B -1}, falls r = overflow {i i < 0}, falls r = underflow r K, sonst B. Steffen 81
Formale Eigenschaften Ein Semantikschema R, I,. heißt total, falls r R. r. eindeutig gdw.. eine totale Funktion ist, d.h. falls r R. {i r,i. } = 1. Falls. eindeutig ist, so heisst. injektiv gdw.. injektiv ist, d.h. falls r 1,r 2 R. r 1 = r 2 r 1 = r 2. surjektiv gdw.. surjektiv ist, d.h. falls vgl. vgl. DAP1-Skript DAP1-Skript Seite Seite19 19 i I.r R. r = i. B. Steffen 82
Kodierung Äquivalenztransformation r R. r = f (r) 1 2 f R 1 R 2 1 2 Kongruenztransformation I r, r' R. r = r' f (r) = f (r') 1 1 2 2 B. Steffen 83
Kodierung Äquivalenztransformation r R. r = f (r) 1 2 Kongruenztransformation r,r' R. r = r' f (r) = f (r') 1 1 2 2 Zusammenhang vgl. vgl. DAP1-Skript DAP1-Skript Seite Seite19-21 f (r) =r = r' =f (r') 2 1 1 2 qed B. Steffen 84
Kodierung succ mod 2 mod 2 {0,1} Äquivalenztransformation? n. n mod 2 succ(n) mod 2 Insbesondere: 1 mod 2 = 1 0 = 2 mod 2 = succ(1) mod 2 B. Steffen 85
Kodierung succ mod 2 mod 2 {0,1} Kongruenztransformation? n, m. n mod 2 = m mod 2 succ(n) mod 2 = succ(m) mod 2 B. Steffen 86
Kodierung succ mod k mod k {0,,k-1} Kongruenztransformation? n,m. n mod k = m mod k succ(n) mod k = succ(m) mod k B. Steffen 87
Inhaltliche Übersicht 1. Motivation 2. Programmieren im Kleinen 3. Struktur und Invarianz (induktives Vorgehen) 4. Das WHILE-Fragment von Java 5. Algorithmen, Datenstrukturen und Rekursion 6. Objektorientierte Erweiterungen B. Steffen 88
Induktives Definieren Die induktive Definition einer Menge erfolgt durch Angabe 1. einer Menge elementarer Grundobjekte oder atomarer Bausteine und 2. einer Menge von Operatoren, die es erlauben, kleinere Bausteine entsprechend einer Konstruktionsvorschrift zu größeren Einheiten zusammenzusetzen. B. Steffen 89
Syntax Boolescher Terme Sei ID eine Menge von Identifikatoren (Variablen). Die Menge BT aller Booleschen Terme über ID ist wie folgt definiert: 1. true, false und Identifikatoren id aus ID sind Boolesche Terme, sogenannte atomare Boolesche Terme oder kurz Atome. 2. Sind t 1 und t 2 Boolesche Terme, so sind auch ( t 1 ), die Negation von t 1, (t 1 t 2 ), die Konjunktion von t 1 und t 2 und (t 1 t 2 ), die Disjunktion von t 1 und t 2 Boolesche Terme. 3. Weitere Boolesche Terme gibt es nicht. vgl. vgl. DAP1-Skript DAP1-Skript Seite Seite24 24 B. Steffen 90
Backus-Naur-Form (BNF) linke Seite ::= rechte Seite N (N T ) * T die Menge der atomaren syntaktischen Objekte der Sprache, die durch die BNF beschrieben wird (T: Terminale ), N eine Menge von Regelbezeichnern (N: Nichtterminale ), `* der sequentielle Iterator. Solche Beschreibungen nennt man auch kontextfreie Grammatiken. B. Steffen 91
Konvention Man schreibt statt LS ::= RS 1, LS ::= RS 2,... LS ::= RS n oft kurz: LS ::= RS 1... RS n B. Steffen 92
Syntax Boolescher Terme in BNF ABT ::= true false id, BT ::= ABT ( BT) (BT BT) (BT BT) mit id ID, oder alternativ kurz BT ::= true false id ( BT) (BT BT) (BT BT) vgl. vgl. DAP1-Skript DAP1-Skript Seite Seite24 24 B. Steffen 93
BNF als Generatorbeschreibung Erweiterung von ::= N x (N T )* auf Worte durch: (N T )* x (N T )* mit w 1 A w 2 w 1 w w 2 gdw. A ::= w ist BNF-Produktion BT ::= true false id ( BT) (BT BT) (BT BT) Beispiel: ((x y) z) vgl. vgl. DAP1-Skript DAP1-Skript Seite Seite21-22 BT (BT BT) ((BT BT) BT) ((x BT) BT) ((x y) BT) ((x y) z) B. Steffen 94
BNF als Akzeptor durch Reduktion BT ::= true false id ( BT) (BT BT) (BT BT) Beispiel: ( ( x y ) z ) BT BT BT BT vgl. vgl. DAP1-Skript DAP1-Skript Seite Seite21-22 BT B. Steffen 95
Axiomatische Begründung: die Peano-Axiome P1 1 ist eine natürliche Zahl: 1 P2 Jede natürliche Zahl besitzt eine eindeutig bestimmte natürliche Zahl als Nachfolger: n. m. m = succ(n) ( m'. m' = succ(n)m= m') P3 1 ist nicht Nachfolger einer natürlichen Zahl: n. 1 = succ(n) P4 Verschiedene natürliche Zahlen haben verschiedene Nachfolger: m,n. n m succ(n) succ(m) B. Steffen 96
Axiomatische Begründung: die Peano-Axiome P5 Axiom der vollständigen Induktion: Ist eine Aussage über natürliche Zahlen für 1 wahr und läßt sich ihre Gültigkeit für jede größere natürliche Zahl aus der Gültigkeit der Aussage für ihren Vorgänger ableiten, dann ist sie für jede natürliche Zahl wahr. ( A(1) ( n. (A(n) A(succ(n)))) ) n. A(n) Eine Aussage ist eine totale Funktion A : vgl. vgl. DAP1-Skript DAP1-Skript Seite Seite22-24 B. Steffen 97
1. n i= 1 i = n ( n + 1), 2 Summe der ersten n natürlichen Zahlen. 2. n i= 1 2 (2i 1) = n, Summe der ersten n ungeraden Zahlen. 3. n i= 1 2 i = n ( n + 1), Summe der ersten n geraden Zahlen. 4. n i= 1 i 2 = n ( n + 1) (2n + 1), 6 Summe der ersten n Quadratzahlen. B. Steffen 98
5. n i= 1 i 3 = n ( n + 1), 4 2 2 Summe der ersten n Kubikzahlen. 6. Es gibt n! Permutationen über n Objekten. 7. Es gibt 2 n Teilmengen von n-elementigen Mengen. 8. Es gibt 2 n Binärworte der Länge n. B. Steffen 99
Beispielbeweis Beh.: n. {0,1} n = 2 n Beweis durch vollständige Induktion nach n. IA: (n=1): {0,1} 1 = {0,1} = 2 = 2 1 IV: Die Behauptung gelte für n: {0,1} n = 2 n IS: (nn+1): {0,1} n+1 = {w0 w {0,1} n } {w1 w {0,1} n } = 2 n + 2 n = 2 n+1 B. Steffen 100
Kaninchenpopulation B. Steffen 101
B. Steffen 102
Adäquatheit Fibonacci-Funktion fib : 0 fib(0) = fib(1) = 1; fib(n) = fib(n-2) + fib(n-1). Fakt: n 0. fib(n) 2 n. (A(1) ( n. (A(n) A(n + 1))) ) n. A(n) Und nun? B. Steffen 103
Verallgemeinertes Induktionsprinzip Satz Läßt sich eine Aussage über natürliche Zahlen für jede natürliche Zahl aus der Gültigkeit der Aussage für alle kleineren natürlichen Zahlen ableiten, dann ist sie für jede natürliche Zahl wahr. ( n. ( m < n. A(m)) A(n) ) n. A(n) vgl. vgl. DAP1-Skript DAP1-Skript Seite Seite24-25 B. Steffen 104
Überblick Beweisverpflichtungen A'(1) n. ( A'(n) A'(n+1) ) n. A'(n) n. ( m < n. A(m) A(n) ) n. A (n) A'(n) ist definiert durch m < n. A(m) B. Steffen 105
Rückführung verallgemeinerter auf vollständige Induktion vollständige Induktion A'(n) = df ( m < n. A(m)) trans A(n) n. A'(n) adapt n. A(n) verallgemeinerte Induktion B. Steffen 106
Adäquatheit Fibonacci-Funktion fib(0) = fib(1) = 1; fib(n) = fib(n -2) + fib(n-1). Fakt: n 0. fib(n) 2 n. (A(1) ( n. (A(n) A(n + 1))) ) n. A(n) ( n. ( m < n. A(m)) A(n) ) n. A(n) B. Steffen 107
Beh.: n 0. fib(n) 2 n Beweis durch verallgemeinerte Induktion nach n. Sei n 0 und es gelte: ) m < n. fib(m) 2 m zu zeigen: fib(n) 2 n Fallunterscheidung: 1) n=0: fib(0) = 1 2 0 2) n=1: fib(1) = 1 2 1 3) n 2: fib(n) = fib(n-2) + fib(n-1) (nach ) 2 n-2 + 2 n-1 2 n qed. B. Steffen 108
Bäume Ein (endlicher) Baum ist ein Tripel (V, E, r) bestehend aus einer endlichen Knotenmenge V einer endlichen Kantenmenge E VV und einem ausgezeichneten Element r, der Wurzel wobei: B. Steffen 109
Tiefe eines Knotens innerhalb eines Baumes jeder Knoten v V\{r} genau einen Vorgänger hat, d.h. es gibt genau eine Kante, die v als rechte Komponente hat. r keinen Vorgänger hat, d.h. es gibt keine Kante, die r als rechte Komponente hat jeder Knoten v V von r aus erreichbar ist, d.h. es gibt eine Folge von Kanten (einen Weg) der Form (r,v 1 ), (v 1,v 2 ),...,(v k-1,v k ), (v k,v) die Länge des eindeutigen Weges von r nach v nennt man die Tiefe von v. B. Steffen 110
Beispiele von Bäumen Binärer Baum Syntaxbaum Strukturbaum und viele mehr... B. Steffen 111
binärer Baum Tiefe 0 1 2 3 4 B. Steffen 112
Syntax- Baum Tiefe + 0 + * 1 * - + + 2 a b + y x a 5 3 7 b 4 ((a b) + (-(7+b))) + ((y+x) (a+5)) B. Steffen 113
Syntax- Baum Tiefe IN + 0 succ(succ(succ(succ(0)))) + * 1 succ(succ(succ(0))) * - + + 2 succ(succ(0)) a b + y x a 5 3 succ(0) 7 b 4 0 B. Steffen 114
Tiefe eines Baumes Die Tiefe eines Baumes ist die Länge seines längsten Weges. Dieser Weg geht offenbar immer von r zu einem Blatt, d.h. einem Knoten ohne Nachfolger. Wir bezeichnen die Tiefe eines Baumes mit tiefe. B. Steffen 115
Syntax- Baum tiefe IN + + - * * + + + 4 3 2 1 succ(succ(succ(succ(0)))) succ(succ(succ(0))) succ(succ(0)) succ(0) a b 7 b y x a 5 0 0 ((a b) + (-(7+b))) + ((y+x) (a+5)) B. Steffen 116
Strukturelle Induktion Satz vgl. vgl. DAP1-Skript DAP1-Skript Seite Seite27-29 Läßt sich eine Aussage für jedes Element einer induktiv definierten Menge S aus der Gültigkeit der Aussage für alle kleineren Bausteine ableiten, dann ist sie für jedes Element von S wahr. ( s S. ( s' Komp (s). A(s')) A(s)) s S. A(s). Komponenten Komp entsprechen den (echten) Teilstrukturen (Teilbäumen) einer induktiv definierten Baumstruktur. B. Steffen 117
Überblick Beweisverpflichtungen ( n. m < n. A'(m)) A'(n) ) n. A'(n) ( s S. ( s' Komp(s). A(s')) A(s) ) s S. A(s) n. A'(n) = df s S. tiefe(s) = n A(s) B. Steffen 118
Rückführung struktureller auf verallgemeinerte Induktion verallgemeinerte Induktion A'(n) = df l(s) na(s) trans A(s) n. A'(n) adapt s S. A(s) strukturelle Induktion B. Steffen 119
Strukturelle Definition von Funktionen und Eigenschaften Die strukturelle Definition einer Funktion f mit induktiv definiertem Definitionsbereich erfolgt (im elementaren Fall) durch 1. Festlegung von f für die atomaren Bausteine des Definitionsbereichs und 2. Angabe einer Vorschrift, wie sich die Funktionswerte komplexer Bausteine relativ zu den Funktionswerten ihrer Komponenten berechnen. f (s) =df g cons (f (s 1 ),.., f(s k )) Falls s ein durch Konstruktor cons zusammengesetztes Objekt der Form s = cons(s 1,..,s k ), (k0) ist und g cons eine auf dem Wertebereich bekannte Funktion ist. B. Steffen 120
Beispiel: Semantikfuntional. : BT (ENV ) Definition (Wahrheitswert, Belegung, Umgebung) = {tt, ff} Menge der Booleschen Wahrheitswerte β : ID, Belegung oder Umgebung ENV, die Menge der Belegungen Definition neg conj tt ff tt ff tt tt ff ff tt ff ff ff disj tt ff tt tt tt ff tt ff B. Steffen 121