In den drei Artikeln zum Z3-Theorembeweiser
(1,
2,
3)
haben wir uns mit der Korrektheit des
Bresenham-Linienzeichen-Algorithmus befasst. Wer Korrektheit sagt,
muss auch Spezifikation sagen, denn korrekt kann ein Algorithmus immer
nur im Bezug auf eine eindeutige Beschreibung des gewünschten
Verhaltens sein. Als Spezifikation hatten wir in SMT-LIB2 (der Sprache
von Z3) einen simplen (aber langsamen) Referenzalgorithmus
beschrieben. Wir haben dann den komplexen (aber effizienten)
Bresenham-Algorithmus implementiert und bewiesen, dass dieser dasselbe
Verhalten aufweist wie der simple Algorithmus. Referenzalgorithmen als
Werkzeuge zur Formulierung von Korrektheitsaussagen haben den Vorteil,
dass sie oft einfach zu finden sind. Der Spezifikationsaufwand hält
sich so in Grenzen. Es geht aber auch anders. Mit mehr Aufwand findet
man manchmal elegantere Spezifikationen, die beispielsweise flexibler
sind (d.h. standhafter im Angesicht von Anforderungsänderungen) oder
den Beweisaufwand signifikant verringern.
In diesem Artikel wollen wir uns das Thema Linienzeichnen noch einmal
vornehmenen und uns dabei einzig und allein auf die Spezifikation
konzentrieren. Mit SMT-LIB2 stoßen wir dabei allerdings schnell an die
Grenzen der Ausdrucksfähigkeit. Wir verwenden deshalb für diesen
Artikel den Theorembeweiser bzw. die Programmiersprache Agda, die auf
diesem Blog schon eingeführt
wurde.
Wir werden die wichtigen Merkmale von abhängigen Typen (Dependent
Types) – dem wesentlichen Feature von Agda – in diesem Artikel so
einführen, dass man aber auch ohne Vorerfahrung folgen kann. Aber
Vorsicht: Vom Umgang mit abhängigen Typen wird man manchmal selbst
süchtig.
Weiterlesen...