Vorbemerkung:

Die folgenden Themenvorschläge sind unvollständig und naturgemäß oft nicht ganz aktuell! Weitere Themen auch aus anderen Gebieten sind möglich. Kontaktieren Sie bei Interesse daher auf jeden Fall Michael Hanus bzw. die jeweils ausgeführte Kontaktperson.


Implementierung einer Striktheits-Analyse für Curry

Von: Kai-Oliver Prott

Bei der Optimierung von funktionalen Haskell-Programmen ist es häufig nützlich zu wissen, ob bestimmte Argumente einer Funktion garantiert ausgewertet werden müssen. Auch in der funktional-logischen Programmiersprache Curry können solche Informationen bei der Optimierung eines Programms helfen. Einer der Anwendungsfälle wird gerade in einem verwandten Projekt ([1]) betrachtet.

In dieser Arbeit soll eine einfache Analyse von vereinfachtem FlatCurry Code implementiert werden. Dabei soll mit einer einfachen Implementierung begonnen werden, welche bei Bedarf beliebig um die Erzeugung detaillierterer Informationen erweitert werden kann. Die Implementierung soll sich dabei an der von Haskell ([2]) orientieren, darf aber weniger komplexe/gute Ergebnisse liefern.

Eignung: Bachelorarbeit

[1] Siehe unten “Optimierung von monadischem Code via Striktheits-Analyse” [2] https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/using-optimisation.html#ghc-flag--fstrictness

Universelle Instrumentierung von Zwischenprogrammen (in Bearbeitung)

Von: Michael Hanus

In vielen Anwendungsszenarien möchte man Informationen über den Ablauf eines Programms erhalten, z.B. beim Tracen/Debuggen, Profiling, Kontexte fehlschlagender Berechnungen u.ä. Häufig werden für diese Aufgaben spezielle Erweiterungen im Laufzeitsystem einer Implementierung vorgenommen, die schwierig auf andere Implementierungen übertragen werden können. Aus diesem Grund soll in dieser Arbeit ein Konzept entwickelt werden, wie man auf Zwischenprogrammebene Transformationen programmieren kann, die dann mit verschiedenen Backends für diese Zwischensprache implementierbar sind.

Konkret soll hier die Quellsprache Curry und die Zwischensprache FlatCurry betrachtet werden, da hier schon viele Tools vorhanden sind. Für FlatCurry sind verschiedene Backends (z.B. in Prolog, Haskell, Go, Julia) vorhanden, sodass eine geeignete Testumgebung vorhanden ist. Weiterhin wurden schon für einige dieser Backends spezielle Instrumentierungswerkzeuge implementiert, welcher mit dem Konzept dieser Arbeit verallgemeinert und somit für mehrere Implementierungen angeboten werden können. Das genaue Konzept soll durch die Analyse der vorhandenen Tools entwickelt werden. Ein mögliches Vorgehen wäre:

  1. Entwicklung einer API für Transformationen von FlatCurry-Programmen (Fragestellung: welche Arten von Transformationen sind ausreichend, welche Kontextinformation benötigen diese?)
  2. Festlegung von Basis-APIs für das jeweilige Tool, die die transformierten Programme verwenden (z.B. Operationen zur Trace-Ausgabe, Sammeln von Profiling-Daten, etc)

Mit Hilfe dieses Konzepts sollen prototypisch die in einigen Curry-Systemen vorhandenen Werkzeuge, wie Tracer/Debugger, Anzeige fehlschlagender Berechnungen [1], strikte Debugger für lazy Berechnungen [2] [3], Profiling [4], umgesetzt werden, oder auch neue Werkzeuge zur Überdeckungsanalyse ausgetestet werden.

Eignung: Masterarbeit

[1] https://doi.org/10.1016/j.entcs.2007.01.002 [2] http://www-ps.informatik.uni-kiel.de/currywiki/tools/oracle_debugger [3] https://doi.org/10.1145/1291151.1291193 [4] https://doi.org/10.1007/11506676_12

Automatische Prüfung nicht fehlschlagender Programme

Von: Michael Hanus

Programme sollten nicht abstürzen, aber sie tun es häufig trotzdem, z.B. auf Grund der Ausführungsumgebung (z.B. Zugriff auf nicht vorhandenen Dateien) oder wegen logischer Fehler (z.B. Zugriff auf das erste Element einer leeren Liste). Während man den ersten Fehlertyp nicht zur Compilezeit prüfen kann und daher z.B. mit Exception Handlern löst, können logische Fehler zur Compilezeit geprüft werden. Obwohl das Auftreten solcher Fehler im Allgemeinen unentscheidbar ist, kann man durch hinreichende Approximationen sicher stellen, dass solche Fehler nicht auftreten. Hierzu wurde in [1] ein Konzept entwickelt, das darauf basiert, bei unvollständigen Funktionen Bedingungen anzugeben, unter denen diese Funktionen nicht fehlschlagen und damit prüft, ob jeder Aufruf solcher Funktionen diese Bedingungen erfüllt. Damit kann entweder nachweisen, dass ein Programm keinen Fehlschlag zur Laufzeit produziert oder, falls dies nicht möglich ist, den Fehlschlag durch Kapselung zur Laufzeit abfängt. Zur Prüfung wurde in [1] ein SMT-Löser verwendet, um auch komplexere arithmetische Funktionen zu prüfen.

In dieser Arbeit sollen diese Ideen zu einem Werkzeug weiterentwickelt werden, um reale Anwendungen als fehlerfrei nachzuweisen. Hierzu kann das existierende Werkzeug verwendet werden, es soll aber auch weiterentwickelt werden:

[1] http://dx.doi.org/10.1145/3236950.3236957

Kompakte Repräsentation von Datentermen

Von: Michael Hanus

Viele Daten werden häufig in Baum- oder Termstrukturen dargestellt, um diese z.B. zwischen verschiedenen Systemen auszutauschen, wie z.B. die populären Austauschformate JSON und XML zeigen. Auch bei deklarativen Sprachen dienen Datenterme als Schnittstellen zwischen verschiedenen Programmkomponenten. Z.B. transformieren Compiler Quellprogramme in abstrakte Syntaxbäume oder Zwischencode, Programmanalysatoren stellen Analyseergebnisse als Termstrukturen dar u.v.m. Zur dauerhaften Speicherung dieser Daten oder zum Austausch dieser zwischen unterschiedlich implementierten Programmkomponenten werden diese Daten in einer einfach lesbaren textuellen Darstellung verarbeitet. Das Schreiben und Lesen dieser Daten kann bei großen Datenmengen oder Quellprogrammen viel Zeit kosten. Aus diesem Grund soll in dieser Arbeit eine kompakte Datenrepräsentation entwickelt werden, wodurch viele darauf basierenden Werkzeuge (Compiler, Analysatoren, etc) deutlich beschleunigt werden können.

Zur einfachen Nutzung dieser kompakten Datenrepräsentation für in Curry implementierte Programme soll ein Werkzeug entwickelt werden, das aus gegebenen Curry-Programmen mit Datendefinitionen automatisch Operationen zum Schreiben und Lesen der kompakten Darstellung generiert. Erste manuelle Test zeigen, dass damit die Geschwindigkeit um den Faktor 100 bis 200 gesteigert werden kann. In dieser Arbeit sollen verschiedene Möglichkeiten realisiert und praktisch evaluiert werden. Hierbei kann auf existierende Werkzeuge zur Verarbeitung von Curry-Programmen, wie z.B. AbstractCurry [1] aufgesetzt werden.

Eignung: Bachelorarbeit

[1] https://www-ps.informatik.uni-kiel.de/~cpm/pkgs/abstract-curry.html

Übersicht über Erweiterungen von Haskells Typsystem mit deren Eigenschaften

Von: Kai Prott

Der GHC ist die de-facto Standardimplementierung von Haskell und ist in den letzten Jahren immer um einige Features erweitert worden. Dabei sind einige dieser Erweiterungen für das Typsystem von Haskell gedacht. Während im Typsystem vom 2010er Haskell Standard immer* ein allgemeinster Typ inferiert werden kann, gilt dies mit einigen Erweiterungen jedoch nicht. Auch Andere Eigenschaften wie Entscheidbarkeit und Terminierung gehen bei manchen Spracherweiterungen verloren. In dieser Arbeit soll ein zusammenfassender Überblick über die Typsystem Erweiterungen in Haskell mit ihren Eigenschaften gegeben werden. Dabei sollen auch einige Beweise geführt werden, wobei viele dieser Eigenschaften an verschiedenen Stellen schon bewiesen wurden. Eine neue Eigenschaft zu beweisen ist für eine Bachelorarbeit nicht unbedingt erforderlich

Eignung: Bachelorarbeit/Masterarbeit

*: Außer bei polymorpher Rekursion.

Experimentelle Evaluation eines GHC-Plugins für die Erstellung von DSLs

Von: Kai Prott

Kürzlich wurde auf Basis eines GHC-Plugins prototypisch ein Compiler für die funktional-logische Programmiersprache Curry erstellt. [1] Dieses Plugin wurde dann für andere monadisch modellierbare Sprachen verallgemeinert. Im Zuge dieser Arbeit soll eine “domain specific language” (DSL) mithilfe des Plugins entwickelt werden. Die Semantik der DSL ist noch nicht festgelegt und kann bei Bedarf abgesprochen werden. Interessant ist dabei auch, herauszufinden an welchen Stellen im Plugin eventuelle Änderungen gemacht werden müssen, um die Nutzbarkeit für andere DSLs zu verbessern.

Eignung: Bachelorarbeit/Masterarbeit

[1] https://www.informatik.uni-kiel.de/~mh/lehre/abschlussarbeiten/msc/Prott.pdf

Eigenschaftsbasiertes Testen von Programmeigenschaften

Von: Michael Hanus

Mit CurryCheck [1] steht ein Werkzeug zur Verfügung, mit dessen Hilfe nicht nur Unit-Tests, sondern auch komplexere Programmeigenschaften der deklarativen Programmiersprache Curry automatisiert getestet werden können. Es wird verwendet, um täglich die Korrektheit von Curry-Distributionen und den zur Verfügung stehenden Paketen [2] zu testen. Inbesondere werden auch komplexere Eigenschaften, wie Vor- und Nachbedingungen automatisiert getestet. In dieser Arbeit soll der automatisierte Test weiterer Eigenschaften, wie z.B. Klassengesetze, umgesetzt werden, um die Zuverlässigkeit der zur Verfügung stehenden Pakete zu erhöhen.

Eignung: Bachelorarbeit

[1] https://www.informatik.uni-kiel.de/~mh/papers/LOPSTR16.html [2] https://www-ps.informatik.uni-kiel.de/~cpm/

Implementierung eines einfachen 3D-Druck-Slicers mittels deklarativer Techniken

Von: Niels

Slicer wie PrusaSlicer [1] oder Cura [2] übersetzen ein 3D-Modell in Maschinenanweisungen, ähnlich einem Compiler, der ein Programm in Maschinenanweisungen übersetzt. In dieser Arbeit soll ein einfacher Slicer mittels deklarativer Techniken implementiert werden und daraufhin untersucht werden, ob sich gängige (Optimierungs-)Techniken aus dem Übersetzerbau auf die Erzeugung von Maschinenanweisungen für 3D-Drucker übertragen lassen.

Eignung: Bachelorarbeit/Masterarbeit

[1] https://github.com/prusa3d/PrusaSlicer [2] https://github.com/Ultimaker/Cura

Refactoring-Tool für Curry

Von: Michael Hanus

Beinhaltet:

Eignung: Masterarbeit

Web-Baukasten für Curry

Von: Michael Hanus

Beinhaltet:

Eignung: Bachelorarbeit

Curr(y)gle 2.0

Von: Kai

Curr(y)gle ist eine Suchmaschine für Curry-Bibliotheken und deren Definitionen nach dem Vorbild von Hoogle [1], eine Suchmaschine aus der Haskell-Community.

Eignung: Bachelorarbeit

[1] https://www.haskell.org/hoogle/

Verbesserung der Arithmetik für KiCS2

Von: Michael Hanus

Beinhaltet:

Eignung: Masterarbeit

[1] http://doi.acm.org/10.1145/2505879.2505881

Visualisierung von Rewriting/Narrowing-Berechnungen

Von: Michael Hanus

Beinhaltet:

Eignung: Bachelorarbeit (oder mit weiteren Themen evtl. Masterarbeit)

[1] http://www.purescript.org/

Debugging mittels CooSy / BIO für KiCS2

Von: Michael Hanus

Beinhaltet:

Eignung: Masterarbeit

[1] http://www-ps.informatik.uni-kiel.de/currywiki/tools/oracle_debugger

Übersetzung FD-Constraints nach SAT

Von: Michael Hanus

Beinhaltet:

Eignung: Masterarbeit

[1] https://www.informatik.uni-kiel.de/~mh/lehre/abschlussarbeiten/msc/hueser.pdf

Terminierungsanalyse für Curry

Von: Michael Hanus

Beinhaltet:

Eignung: Bachelorarbeit (oder mit Erweiterungen auch Masterarbeit)

[1] http://www2.tcs.ifi.lmu.de/~abel/foetus.pdf [1] http://www.cs.mcgill.ca/~dthibo1/papers/termination.pdf

Übersetzung von Curry-Programmen nach Coq, Why3

Von: Michael Hanus

Beinhaltet:

Eignung: Bachelorarbeit/Masterarbeit


Weitere Abschlussarbeiten:

Abschlussarbeiten mit anderen Kooperationspartnern sind (auch auf eigene Initiative) möglich. Hierzu sollte man Michael Hanus kontaktieren.