Ich fange an, mich mit abhängiger Programmierung zu beschäftigen, und habe festgestellt, dass die Sprachen Agda und Idris Haskell am nächsten kommen, also habe ich dort angefangen.
Meine Frage ist: Was sind die Hauptunterschiede zwischen ihnen? Sind die Typsysteme in beiden gleichermaßen ausdrucksstark? Es wäre großartig, einen umfassenden Vergleich und eine Diskussion über die Vorteile zu haben.
Ich konnte einige erkennen:
- Idris hat Typklassen à la Haskell, während Agda Instanzargumente verwendet
- Idris enthält eine monadische und eine anwendungsbezogene Notation
- Beide scheinen eine Art wiederbindbare Syntax zu haben, obwohl sie nicht wirklich sicher sind, ob sie gleich sind.
Bearbeiten : Auf der Reddit-Seite dieser Frage finden Sie weitere Antworten: http://www.reddit.com/r/dependent_types/comments/q8n2q/agda_vs_idris/
agda
type-theory
idris
Serras
quelle
quelle
Antworten:
Ich bin möglicherweise nicht die beste Person, um dies zu beantworten, da ich nach der Implementierung von Idris wahrscheinlich ein bisschen voreingenommen bin! Die FAQ - http://docs.idris-lang.org/en/latest/faq/faq.html - hat etwas zu sagen, aber um das ein wenig zu erweitern:
Idris wurde von Grund auf so konzipiert, dass es die Allzweckprogrammierung vor dem Beweis des Theorems unterstützt, und verfügt daher über Funktionen auf hoher Ebene wie Typklassen, Notation, Redewendungen, Listenverständnis, Überladung usw. Idris stellt die Programmierung auf hoher Ebene vor den interaktiven Beweisen. Da Idris auf einem taktikbasierten Entwickler basiert, gibt es eine Schnittstelle zu einem taktikbasierten interaktiven Theorembeweiser (ein bisschen wie Coq, aber noch nicht so fortgeschritten, zumindest noch nicht).
Eine andere Sache, die Idris gut unterstützen möchte, ist die Implementierung von Embedded DSL. Mit Haskell können Sie mit der Do-Notation einen langen Weg zurücklegen, und mit Idris auch, aber Sie können bei Bedarf auch andere Konstrukte wie Anwendung und Variablenbindung neu binden. Weitere Details hierzu finden Sie im Tutorial oder ausführliche Informationen in diesem Dokument: http://eb.host.cs.st-andrews.ac.uk/drafts/dsl-idris.pdf
Ein weiterer Unterschied besteht in der Zusammenstellung. Agda geht hauptsächlich über Haskell, Idris über C. Es gibt ein experimentelles Backend für Agda, das das gleiche Backend wie Idris über C verwendet. Ich weiß nicht, wie gut es gewartet wird. Ein primäres Ziel von Idris wird es immer sein, effizienten Code zu generieren - wir können viel besser als derzeit, aber wir arbeiten daran.
Die Typsysteme in Agda und Idris sind in vielen wichtigen Punkten ziemlich ähnlich. Ich denke, der Hauptunterschied liegt im Umgang mit Universen. Agda hat Universumspolymorphismus, Idris hat Kumulativität (und Sie können
Set : Set
in beiden haben, wenn Sie dies zu restriktiv finden und nichts dagegen haben, dass Ihre Beweise möglicherweise nicht stimmen).quelle
Ein weiterer Unterschied zwischen Idris und Agda besteht darin, dass die Satzgleichheit von Idris heterogen ist, während die von Agda homogen ist.
Mit anderen Worten, die mutmaßliche Definition von Gleichheit in Idris wäre:
in Agda ist es
Das l in der Agda-Definition kann ignoriert werden, da es mit dem Universumspolymorphismus zu tun hat, den Edwin in seiner Antwort erwähnt.
Der wichtige Unterschied besteht darin, dass der Gleichheitstyp in Agda zwei Elemente von A als Argumente verwendet, während er in Idris zwei Werte mit möglicherweise unterschiedlichen Typen annehmen kann .
Mit anderen Worten, in Idris kann man behaupten, dass zwei Dinge mit unterschiedlichen Typen gleich sind (auch wenn es sich um eine unbeweisbare Behauptung handelt), während in Agda die Aussage Unsinn ist.
Dies hat wichtige und weitreichende Konsequenzen für die Typentheorie, insbesondere hinsichtlich der Machbarkeit der Arbeit mit der Homotopietypentheorie. Aus diesem Grund funktioniert heterogene Gleichheit einfach nicht, da ein Axiom erforderlich ist, das nicht mit HoTT übereinstimmt. Andererseits ist es möglich, nützliche Theoreme mit heterogener Gleichheit zu formulieren, die mit homogener Gleichheit nicht einfach ausgedrückt werden können.
Das vielleicht einfachste Beispiel ist die Assoziativität der Vektorkettung. Gegebene längenindizierte Listen, sogenannte Vektoren, definiert wie folgt:
und Verkettung mit dem folgenden Typ:
wir möchten vielleicht beweisen, dass:
Diese Aussage ist Unsinn unter homogener Gleichheit, weil die linke Seite der Gleichheit Typ
Vect (n + (m + o)) a
und die rechte Seite Typ hatVect ((n + m) + o) a
. Es ist eine absolut vernünftige Aussage mit heterogener Gleichheit.quelle
(n + (m + o))
und((n + m) + o)
sind gleich judgmentally von Assoziativität+
aufℕ
(aus dem Induktionsprinzip abgeleitet). Dementsprechend hat jede Seite der Gleichheit den gleichen Typ. Der Unterschied zwischen den Arten der Gleichheit ist wichtig, aber ich sehe nicht, wie dies ein Beispiel dafür ist.