Modul Deklarative Programmiersprachen

Wintersemester 2020/21

Arbeitsgruppe Programmiersprachen und Übersetzerkonstruktion

Nr. Art Termine Raum Veranstalter
080039 V4 Mo 16:15 - 17:45 Online Hanus
    Di 12:15 - 13:45 Online  
080000 Ü2 Do 8:15 - 9:45 Online Hanus, Teegen

Organisatorisches

Die Vorlesung beginnt am Montag, 2.11.2020, 16:15 Uhr. Wegen der Corona-Krise wird die Vorlesung virtuell stattfinden. Die erste Vorlesung wird live als Videokonferenz stattfinden. Die Zugangsdaten erhalten alle Teilnehmer per Email. Dazu ist es notwendig, dass alle Teilnehmer dieses Modul in der StudiDB bis zum 31.10.2020 belegen! Für alle weiteren Vorlesungen werden rechtzeitig zu jeder Vorlesungsstunde Videos zum jeweiligen Vorlesungsinhalt bereitgestellt werden (s.u.). Die Übung findet dagegen zum Übungstermin interaktiv als Videokonferenz statt. Die Zugangsdaten werden den Teilnehmern per Email mitgeteilt.

Alle Teilnehmer müssen dieses Modul in der StudiDB belegen, damit sie nachher eine Prüfung ablegen können. Außerdem sollten sich alle Teilnehmer dieses Moduls auch im iLearn anmelden (erst nach der ersten Vorlesungsstunde!). Weitere Informationen hierzu werden zur ersten Vorlesungsstunde bereit gestellt. Eine frühere Anmeldung ist nicht erforderlich. Für Rückfragen, Anmerkungen, Verbesserungsvorschläge u.ä. können die Veranstalter gerne per Email kontaktiert werden.

Vorlesungen

Nachfolgend sind Verweise zu den Videos (im mp4-Format), Skriptteile (als PDF) und weitere Materialen (Folien, Programme) der jeweiligen Vorlesung zu finden. Das gesamte Skript in der aktuellen Fassung (es wird während der Vorlesung fortlaufend überarbeitet) ist weiter unten zu finden.

Datum Videos Skriptteile Folien, Programme
2.11.2020 Einleitung Kapitel 1 Einführungsfolien Anwendungen (PDF) Email-Suche in Webseiten (Curry) Su Doku-Löser ( Web-Interface)
3.11.2020 Funktionen Datentypen Kapitel 2.1/2.2 Einfache Haskell-Funktionen Wurzelberechnung (Haskell) Datentypen
9.11.2020 Pattern Matching Kapitel 2.3 Pattern Matching in Haskell
10.11.2020 Typsysteme Kapitel 2.51
16.11.2020 Typkorrektheit Typinferenz Kapitel 2.52
17.11.2020 Typinferenz Lazy Evaluation Kapitel 2.6 Typinferenz Lazy Evaluation
23.11.2020 Reduktionssysteme Termersetzungssysteme Kapitel 3.1 Kapitel 3.2a
24.11.2020 Kritische Paare Berechnungsstrategien Berechnungsstrategien
30.11.2020 Induktiv-sequenzielle TES Induktiv-sequenzielle TES
1.12.2020 Einführung logisch-funktionale Programmierung Einführung FLP Verwandtschaftsbeispiel (Haskell) Verwandtschaftsbeispiel (Curry) Extravariablen, Listen (Curry) Spiel 24 (Curry)
7.12.2020 Beispiel: Reguläre Ausdrücke Narrowing Narrowing Reguläre Ausdrücke (Curry)
8.12.2020 FLP und Logikprogrammierung FLP und Logikprogrammierung Vorfahr-Relation (Curry) Landkarte färben (Curry) Haus vom Nikolaus (Curry)
14.12.2020 Strikte Narrowingstrategien Strikte Narrowingstrategien
15.12.2020 Lazy Narrowingstrategien Lazy Narrowingstrategien
4.1.2021 Nichtdeterministische Operationen Narrowing und nichtdeterministische Operationen Nichtdeterministische Operationen (Curry)
5.1.2021 Residuation Residuation Curry-Auswertungsstrategie: Beispiele (Curry)
11.1.2021 Gleichheit und Äquivalenz Gleichheit und Äquivalenz Beispiele zur strikten Gleichheit (Curry)
12.1.2021 Erweiterungen Erweiterungen Bankkonto (Curry) Hypothekenberechnung (Curry) Constraint-Löser für SEND+MORE=MONEY (Curry) Su Doku-Löser (Curry)
18.1.2021 Eingekapselte Suche Eingekapselte Suche Eingekapselte Suche (Curry)
19.1.2021 Suchanwendungen / Funktionale Muster Suchanwendungen / Funktionale Muster Kürzeste Wegesuche (Curry) n-Damen-Problem (Curry) Variationen über last (Curry)
25.1.2021 Funktionale Muster Funktionale Muster Anwendungen funktionaler Musterr (Curry) Arithmetische Ausdrucksverarbeitung (Curry)
26.1.2021 Deklarative GUI-Programmierung Deklarative GUI-Programmierung Counter GUI (Curry) GUI mit Temperaturkonverter (Curry) Tischrechner-GUI (Curry)
1.2.2021 HTML, Access Control, XML Zugangskontrollen, XML-Dokumente Dynamische Webseite (Curry) Analyse von IT-Sicherheitsregeln (Curry) XML-Dokumente in Curry
2.2.2021 Deklarative XML-Verarbeitung Deklarative XML-Verarbeitung XML-Verarbeitung mit funktionalen Mustern (Curry)

Zielgruppe

Studierende in den Bachelor- oder Masterstudiengängen Informatik und Wirtschaftsinformatik sowie Studierende mit Nebenfach Informatik

Voraussetzungen

Grundstudium (1.-4. Semester) in Informatik, insbesondere Modul Fortgeschrittene Programmierung (das Skript zu dieser Vorlesung ist als PDF innerhalb der CAU zugreifbar)

Inhalt

Aufgrund der Komplexität heutiger Software-Systeme ist die Verwendung von Programmiersprachen mit einem hohen Abstraktionsniveau notwendig. Deklarative Sprachen bieten hierzu wichtige Lösungsansätze. Aufgrund ihrer deklarativen Struktur sind die Programme leichter wartbar und verifizierbar (man denke an die immer wichtiger werdenden Sicherheitsaspekte wie z.B. im Internet). In dieser Vorlesung werden Konzepte moderner deklarativer Programmiersprachen vorgestellt.

Ausgehend von dem aus dem Grundstudium bekannten Konzept der funktionalen Programmierung, das kurz wiederholt und eingehender erläutert wird, werden funktionale Sprachen um logische Anteile erweitert, um die Konzepte der funktionalen, logischen und integrierten logisch-funktionalen Sprachen in einem einheitlichen Rahmen darzustellen. Außerdem werden die Grundlagen der funktionalen und logischen Programmierung vorgestellt.

Deklarative Programmierung in der Praxis

Deklarative Programmiertechniken und Sprachkonstrukte führen zu besser strukturierten Programmen führen und sind daher auch in zum Teil eingeschränkter Form in vielen modernen Programmiersprachen zu finden. Deklarative 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. Und es gibt natürlich auch Jobs für funktionale Programmierer.

Modulprüfung

Am Ende der Vorlesung findet eine mündliche Abschlussprüfung statt. Die Zeiten werden später individuell vereinbart.

Ergänzende Materialien zur Vorlesung

Es gibt kein ausführliches Lehrbuch oder Skript zur Vorlesung, aber einige Notizen zur Vorlesung im PDF-Format (nur innerhalb der CAU Kiel zugreifbar!), die im Verlauf des Semesters aktualisiert werden. Dieses Skript ist kein Ersatz für die Vorlesungsteilnahme, es beinhaltet aber den ungefähren Vorlesungsverlauf und ist hoffentlich eine gute Unterstützung. Wer darin keine Fehler entdeckt, hat bestimmt nicht ordentlich gelesen. Es wäre es schön, wenn Fehler an Michael Hanus mitgeteilt werden.

Folien und Programme:

Übungen

In den begleitenden Übungen werden für praktische Programmieraufgaben die Sprachen Haskell und Curry eingesetzt, für die es frei verfügbare Implementierungen für Unix- und Linux-Systeme gibt.
Die Abgabe der Übungen soll vornehmlich über das iLearn Übungssystem erfolgen. Daher sollte man sich zur Teilnahme an diesem Modul auch im iLearn anmelden.

Literatur

  • G. Hutton: Programming in Haskell, 2nd Ed., Cambridge University Press, 2016
  • R.. Bird: Introduction to Functional Programming using Haskell, Prentice Hall, 1998
  • S. Thompson: Haskell - The Craft of Functional Programming, Addison-Wesley, 1996
  • L. Sterling, E. Shapiro: The Art of Prolog, 2nd Ed., MIT Press, 1994
  • M. Hanus: Functional Logic Programming: From Theory to Curry, Programming Logics - Essays in Memory of Harald Ganzinger, Springer LNCS 7797, pp. 123-168, 2013
  • S. Antoy, M. Hanus: Functional Logic Programming, Communications of the ACM, Vol. 53, No. 4, pp. 74-85, 2010
Weitere Literatur wird in der Vorlesung bekanntgegeben.