Modul Deklarative Programmierung

Wintersemester 2023/24

Arbeitsgruppe Programmiersprachen und Übersetzerkonstruktion

Nr. Art Termine Raum Veranstalter
080038 V4 Mo 12:15 - 13:45 CAP3 - Hörsaal 2 Hanus
    Mi 12:15 - 13:45 CAP3 - Hörsaal 2  
080037 Ü2 Mi 14-16, Do 8-10, 10-12   Prott, Bunkenburg

Organisatorisches

Die Vorlesung beginnt am Mittwoch, 25.10.2023(!), 12:15 Uhr. Die Übungen beginnen auch am Mittwoch, 25.10.2023. Hierzu kann man sich auf der Moodle-Lernplattform ab Montag, 23.10.2023, 16 Uhr anmelden. Die Vorlesungen werden vier Stunden pro Woche gehalten und enden entsprechend einige Wochen vor Vorlesungsende. In der Zeit nach den Vorlesungen wird in den Übungen ein größeres Projekt bearbeitet.

Alle Teilnehmer müssen dieses Modul in der StudiDB belegen, damit sie nachher eine Prüfung ablegen können.

Zielgruppe

Studierende im 1-Fach-Bachelorstudiengang Informatik, im 2-Fach-Masterstudiengang Informatik, im Masterstudiengang Wirtschaftsinformatik sowie Studierende mit Nebenfach Informatik

Voraussetzungen

Grundlegende Programmierkenntnisse, wie sie beispielsweise in den Modulen Einführung in die Informatik oder Einführung in die Algorithmik erworben werden können.

Inhalt

In dieser Vorlesung werden deklarative Programmierkonzepte vorgestellt. Dabei wird anhand verschiedener Programmiersprachen der Umgang mit den Konzepten deklarativer Programmierparadigmen gezeigt und der Unterschied zur imperativen Programmierung aufgezeigt. Moderne funktionale Programmierungtechniken werden am Beispiel der Sprache Haskell gezeigt. Logische und Constraint-orientierte Programmierung wird in der Sprache Prolog vermittelt.

Funktionale Programmierung in der Praxis

Ein Schwerpunkt der Vorlesung bildet die funktionale Programmierung. Dies liegt daran, dass funktionale Programmiertechniken und Sprachkonstrukte zu besser strukturierten Programmen führen und daher auch in zum Teil eingeschränkter Form in vielen modernen Programmiersprachen zu finden sind. Dies ist in einem kürzlich erschienen Artikel in der Zeitschrift CACM genauer erläutert. Allgemein gilt, dass die Verwendung funktionaler Programmierkonzepte zu kürzeren, besser strukturierten Programmen und insbesondere durch fortgeschrittene Typkonzepte zu zuverlässigeren Softwaresystemen führt.

Funktionale Programmiersprachen sind nicht nur vom akademischen Interesse, sondern sie werden auch in der Praxis immer stärker eingesetzt. Zum Beispiel verwendet Jane Street Capital, eine Finanzhandelsfirma mit Vertretungen in New York, London und Hong Kong, die funktionale Sprache OCaml für ihre Anwendungen (dazu gibt es auch einen Blog). Die Firma Galois mit Hauptsitz in Portland (Oregon, USA) verwendet funktionale Programmiersprachen und -konzepte zur Entwicklung sicherheitskritischer Systeme.

Die logische Programmiersprache Prolog wurde im KI-System Watson eingesetzt, das im Februar 2011 in der Quizsendung Jeopardy gegen zwei menschliche Spieler gewonnen hat. Hierbei wurde in Watson die Sprachverarbeitung mit Prolog implementiert.

Warum gerade im Finanzbereich funktionale Programmierung eingesetzt wird, liegt auch daran, dass Fehler in einer Software existenzielle Probleme verursachen kann, wie man am Fall von Fall Knight Capital sehen kann.

Hier sind noch ein paar weitere Berichte über den industriellen Einsatz funktionaler Programmierung:

Forscher bei Microsoft fordern in einem Artikel der Zeitschrift CACM, dass Informatikstudierende so früh wie möglich funktionale Programmiersprachen erlernen sollten.

Modulprüfung

Am Ende der Vorlesung findet eine schriftliche Abschlussprüfung statt. Voraussetzung zur Zulassung zur Klausur ist die regelmäßige Bearbeitung der Übungsaufgaben (s.u.).

Die erste Modulprüfung finden am Mittwoch, 21. Februar 2024, von 14:00 bis 17:00 Uhr im CAP2 - Frederik-Paulsen-Hörsaal statt. Zur Teilnahme ist eine vorherige Anmeldung in der StudiDB erforderlich.

Die zweite Modulprüfung findet am Mittwoch, 3. April 2024, von 16:00 bis 19:00 Uhr im CAP2 - Frederik-Paulsen-Hörsaal --> statt. Zur Teilnahme ist eine vorherige Anmeldung in der StudiDB erforderlich.

Ergänzende Materialien zur Vorlesung

Es gibt ein Skript zur Vorlesung (im PDF-Format, nur innerhalb der CAU Kiel zugreifbar!), welches parallel zur Vorlesung überarbeitet wird. Dieses Skript ist kein Lehrbuch, aber es beinhaltet den ungefähren Vorlesungsverlauf. Daher sollte neben dem Lesen des Skripts auch immer die Vorlesung besucht werden, um über den aktuellen Stand informiert zu sein!

Folien und Programme:

25.10.2023: Einführung (PDF) Diskriminierungsfreies IfI (PDF) Warum deklarative Programmierung? Einfache Haskell-Funktionen
30.10.2023: Lokale Deklarationen Datentypdeklarationen
1.11.2023: Listen von Zahlen Polymorphe Daten und Funktionen
6.11.2023: Testen mit QuickCheck Pattern Matching
8.11.2023: Funktionen höherer Ordnung
13.11.2023: Strukturen und Kombinatoren höherer Ordnung Funktionen höherer Ordnung in Python Map in Java Feld von Funktionen in Java Map in JavaScript
15.11.2023: Typklassen Lazy Evaluation und unendliche Strukturen
20.11.2023: Unendliche Datenstrukturen, Sequenzen und List Comprehensions
22.11.2023: I/O-Aktionen Funktion "lines"
27.11.2023: Numerieren von Zeilen Ein Modul Nats-Modul Main Hauptmodul Functor-Struktur Applicative-Struktur (Einführung)
29.11.2023: Functor-Instanz für Either Applicative-Struktur Monadische Strukturen
4.12.2023: Mehr Testen mit QuickCheck Fallstudie: Peano-Arithmetik
6.12.2023: Verwandtschaftsbeispiel in Haskell Verwandtschaftsbeispiel in Prolog Element einer Liste in Prolog
11.12.2023: Landkartenfärbung Sortieren Listenoperationen Peano-Zahlen
13.12.2023: Beispiele zur Resolution
18.12.2023: Prolog Suchstrategie Verwandtschaftsbeispiel mit Negation Cut-Operator Fakultät
20.12.2023: Schaltkreisanalyse Hypotheken SEND+MORE=MONEY n-Damen-Problem
8.1.2024: Prädikate höherer Ordnung Verwandschaftsbeispiel mit Kapselung Meta-Interpretierer für Prolog Verwandschaftsbeispiel mit Ein/Ausgabe
10.1.2024: Meta-Interpretierer mit Tracing Differenzlisten Grammatiken in Prolog Verwandtschaft in Curry Curry-Beispiele Peano-Arithmetik in Curry

Literatur

  • G. Hutton: Programming in Haskell, 2nd Ed., Cambridge University Press, 2016
  • R. Bird: Thinking Functionally with Haskell, Cambridge University Press, 2015
  • S. Thompson: Haskell - The Craft of Functional Programming, 3rd Ed., Addison Wesley, 2012
  • L. Sterling, E. Shapiro: The Art of Prolog, 2nd Ed., MIT Press, 1994
  • T. Frühwirth, S. Abdennadher: Constraint-Programmierung, Springer, 1997

Übungen

In den Übungen werden selbstständig kleinere Programme entwickelt. In den letzten Übungsserien nach Ende des Vorlesungsteils wird ein größeres Projekt bearbeitet.

Zur Teilnahme an der Modulprüfung müssen die Übungsaufgaben regelmäßig und sinnvoll bearbeitet werden. Hierzu wird für jede Aufgabe festgehalten, ob diese sinnvoll bearbeitet wurde ("Sinnpunkte"). Für eine Zulassung zur Klausur müssen in den beiden Bereichen funktionale Programmierung sowie logische Programmierung/Übungsprojekt mindestens 50% der Sinnpunkte erreicht werden.

Die Abgabe der Übungen erfolgt über die Moodle-Lernplattform.

Die in der Vorlesung behandelten Programmiersprachen sind auf den Institutsrechnern installiert und auch im Internet sind freie Implementierungen von Haskell und Prolog verfügbar.

Anmerkung zur Verwendung von Prolog: Zur Lösung der Übungsaufgaben kann man das frei verfügbare SWI-Prolog-System verwenden. Um einen leichteren Einstieg in Prolog zu haben, sollte man in dieser Vorlesung zunächst eine Erweiterung für SWI-Prolog verwenden, die eine bessere Suchstrategie implementiert. Hierzu gibt es zwei Möglichkeiten (unter der Voraussetzung, das SWI-Prolog installiert ist und durch den Aufruf "swipl" gestartet werden kann):

  • Für Unix/Linux: Man kopiere dieses Bash-Skript in ein bin-Verzeichnis, das im eigenen Pfad liegt. Dann kann man durch das Kommando fortprog-swipl das erweiterte SWI-Prolog-System aufrufen. Alternativ kann man das Bash-Skript auch in das Verzeichnis legen, wo die Prolog-Programme sind, und dann das SWI-Prolog-System mit dem Kommando ./fortprog-swipl aufrufen.
  • Für andere Systeme: Man kopiere dieses Prolog-Programm in das Verzeichnis, wo sich die Prolog-Programme befinden, und starte das SWI-Prolog-System mit dem Kommando swipl -q -s fortprog.

Nach diesem Start von SWI-Prolog kann man wie üblich mit [myprog]. sein eigenes Programm laden und ausprobieren. Zu beachten ist, dass bei Benutzung dieser Erweiterung die Prolog-Programme keine Negation oder Cuts enthalten und auch keine anderen Module importieren, was aber am Anfang sowieso nicht verwendet wird.