Herbert Klaeren, Michael Sperber Die Macht der Abstraktion Einführung in die Programmierung Teubner Inhaltsverzeichnis 1 Was ist Informatik? 5 2 Elemente des Programmierens 2.1 Handwerkszeug für das Programmieren 2.2 Bausteine für Programme 2.3 Sorten und Verträge 2.4 Testfälle 2.5 Probleme und Teilprobleme 2.6 Das Substitutionsmodell 2.7 Lexikalische Bindung 9 9 11 15 17 18 20 22 3 Fallunterscheidungen und Verzweigungen 3.1 Fallunterscheidungen und boolesche Ausdrücke 3.2 Binäre Verzweigungen 3.3 Weitere boolesche Operatoren 27 27 30 31 4 Zusammengesetzte und gemischte Daten 4.1 Schokokekse im Computer 4.2 Record-Definitionen 4.3 Prozeduren, die Records konsumieren 4.4 Prozeduren, die Records herstellen 4.5 Ein erweitertes Beispiel für zusammengesetzte Daten 4.6 Gemischte Daten 37 37 40 42 44 45 49 5 Induktive Definitionen 5.1 Natürliche Zahlen 5.2 Endliche Folgen 5.3 Terme 5.4 Darstellung von Termen 5.5 Strukturelle Induktion 5.6 Algebren 55 55 58 59 61 62 63 6 Rekursion 6.1 Funktionen auf endlichen Folgen 6.2 Listen in Scheme 6.3 Rekursion über Zahlen 67 67 69 73 vj Inhaltsverzeichnis 6.4 6.5 6.6 6.7 6.8 Rekursion ohne Ende Induktionsbeweise über rekursive Funktionen Rekursive Scheme-Programme beweisen Endrekursion und Iteration Invarianten 77 78 79 81 84 7 Praktische Programme mit Listen 7.1 Eingebaute Listen 7.2 Mehr Prozeduren auf Listen 7.3 Die Türme von Hanoi 7.4 Zwischenergebnisse benennen 7.5 Audio-Kassetten optimal bespielen 87 87 87 90 97 99 8 Higher-Order-Programmierung 8.1 Higher-Order-Prozeduren auf Listen 8.2 Listen zusammenfalten 8.3 Anonyme Prozeduren 8.4 Prozedurfabriken 8.5 Der Schönfinkel-Isomorphismus 107 107 111 113 115 116 9 Zeitabhängige Modelle 9.1 Das Teachpack image. ss 9.2 Modelle und Ansichten 9.3 Bewegung und Zustand 9.4 Andere Welten 121 121 124 126 128 10 Abstrakte Datentypen 10.1 ADTs, Signaturen und Datentypen 10.2 Zähler 10.3 Gleichungsdefinierte Datentypen 10.4 Konstruktoren und wohlgeformte ADTs 10.5 Listen 10.6 ADTs und Implementierung 10.7 Suchen in endlichen Mengen 10.8 Parametrisierte Implementierung 133 133 135 137 140 142 143 147 150 11 Binäre Bäume 11.1 Binärbäume 11.2 Suchbäume 11.3 Huffman-Bäume 153 153 158 163 12 Zuweisungen und Zustand 12.1 Zustandsvariablen 12.2 Zustand kapseln 12.3 Erweitertes Beispiel ' 175 175 178 181 Inhaltsverzeichnis 12.4 12.5 12.6 12.7 12.8 Zuweisungen und das Substitutionsmodell Das Umgebungsmodell für die Programmauswertung Gekapselter Zustand mit Closures Sharing und Identität Zeiger vii 186 189 194 197 199 13 Objektorientiertes Programmieren 13.1 Message-Passing-Style 13.2 OOP = MPS +Zustand + s e i f + Vererbung 13.3 Vererbung und s e i f 13.4 Mehrfachvererbung 13.5 Abstraktion über Klassen 203 203 205 212 216 219 14 Logische Kalküle 14.1 Wahrheit und Beweisbarkeit 14.2 Ein Kalkül für die Aussagenlogik 14.3 Modelle für die Aussagenlogik 14.4 Korrektheit, Konsistenz und Vollständigkeit 14.5 Der Reduktionskalkül RCi 225 225 226 228 229 230 15 DerX-Kalkül 15.1 Sprache und Reduktionssemantik 15.2 Normalformen 15.3 Der Ä,-Kalkül als Programmiersprache 15.4 Auswertungsstrategien 15.5 Die Auswertungsstrategie von Scheme 15.6 Übungsaufgaben 237 237 242 243 248 250 250 16 Interpretation von Scheme 16.1 Quote und Symbole 16.2 Mini-Scheme: eine Untermenge von Scheme 16.3 Repräsentation von Werten 16.4 Repräsentation von Umgebungen und Frames 16.5 Auswertung und Anwendung 16.6 Programme ausführen 253 253 257 265 266 273 280 A Geschichte der Informatik A.l Automatisierung des Denkens A.2 Programmierbare Maschinen A.3 Programme, Berechnungen und Algorithmen 287 287 288 290 B Mathematische Grundlagen B. 1 Aussagenlogik B.2 Mengen B.3 Prädikatenlogik 293 293 294 297 viii Inhaltsverzeichnis B.4 Multimengen B.5 Relationen und Abbildungen 298 298 B.6 Ordnungen 300 C Mantras zur Programmierung 303 D Konstruktionsanleitungen 305