Ist es möglich, einen einfachen syntaktischen Begriff der Gleichheit zu definieren (ähnlich dem, was GHC automatisch als Eq
-Instanz für einen Haskell 98-Typ ableitet), ohne entweder explizit jeden Datenkonstruktor nachzuweisen ist injektiv oder macht etwas Analoges, wie zum Beispiel die Retraktion jedes Konstruktors definieren und cong
verwenden?
Mit anderen Worten, ist es möglich, die Injektivität von Datenkonstruktoren direkter zu nutzen, anstatt pro Konstruktor eine Hilfsfunktion einzuführen?
Im Folgenden werden die natürlichen Zahlen als Beispiel verwendet.
%Vor% Man könnte suc-injective
durch cong (λ { zero → zero ; (suc x) → x })
ersetzen, dh indem man eine Funktion definiert, die suc
invertiert, aber immer noch eine eigene Hilfsfunktion pro Konstruktor benötigt, und solche Funktionen sind wegen der Notwendigkeit etwas unschön zu definieren sei total.
(Gewöhnliche Vorbehalte gegen etwas Offensichtliches gelten.)
Ulf Norells Auftakt für Agda enthält einen Mechanismus für automatische Ableitung der entscheidbaren Gleichheit für einen gegebenen Datentyp. Der Code basiert auf dem Reflektionsmechanismus von Agda und generiert automatisch erweiterte Lambdas für den Nachweis der Injektivität von Konstruktoren. Ich empfehle einen Blick auf den Code, obwohl es nicht immer so einfach ist wie es sein könnte.
Tags und Links equality agda algebraic-data-types