阿格达和伊德里斯之间的区别


164

我开始研究依赖类型的编程,并且发现Agda和Idris语言是最接近Haskell的语言,因此我从这里开始。

我的问题是:它们之间的主要区别是什么?两种类型的系统都同样富有表现力吗?进行全面的比较并就收益进行讨论将是很棒的。

我已经发现了一些:

  • Idris具有类型类àla Haskell,而Agda带有实例参数
  • Idris包含单字和适用记号
  • 它们虽然都不确定是否相同,但似乎都具有某种可重新绑定的语法。

编辑:此问题的Reddit页面中还有更多答案:http : //www.reddit.com/r/dependent_types/comments/q8n2q/agda_vs_idris/


1
您可能想看看coq aswel,其语法距离haskell不到一百万英里,并且具有易于使用的类型类:)

4
记录:阿格达(Agda)如今也有单字和应用符号。
gallais

Answers:


189

我可能不是回答这个问题的最佳人选,因为实施Idris可能会使我有些偏颇!FAQ- http://docs.idris-lang.org/zh-CN/latest/faq/faq.html-上面有话要说,但要扩大一点:

Idris是从头开始设计的,可在定理证明之前支持通用编程,因此具有高级功能,例如类型类,符号表示法,成语括号,列表理解,重载等。Idris将高级编程置于交互式证明之前,尽管Idris基于基于战术的详细说明程序构建,所以存在基于接口的交互式定理证明器的接口(有点像Coq,但还不那么先进,至少现在还没有)。

Idris旨在更好地支持的另一件事是嵌入式DSL实现。使用Haskell,您可以在不使用符号的方式上走很长的路,也可以使用Idris,但是如果需要,还可以重新绑定其他结构,例如应用程序和变量绑定。您可以在本教程中找到更多详细信息,或者在本文中找到完整的详细信息:http : //eb.host.cs.st-andrews.ac.uk/drafts/dsl-idris.pdf

另一个区别在于编译。Agda主要通过Haskell,Idris通过C。Agda有一个实验性后端,它通过C与Idris使用相同的后端。我不知道它的维护程度如何。Idris的主要目标始终是生成高效的代码-我们可以做的比现在好得多,但我们正在努力。

Agda和Idris中的类型系统在许多重要方面都非常相似。我认为主要区别在于处理宇宙。阿格达(Agda)具有宇宙多态性,伊德里斯(Idris)具有累积性Set : Set如果您发现两者的限制过于严格并且不介意您的证明不正确,那么您可以同时拥有这两种特性)。


48
您是什么意思,“……不是最佳人选……”?您是最容易回答的人之一,因为您与Idris十分熟识。现在我们也只需要NAD来答复,就可以了。:)感谢您抽出宝贵的时间来答复。
亚历克斯R

9
在哪里可以阅读更多有关累积率的信息?我以前从未听说过……
serras,2012年


8
如果简明扼要,HoTT书的第一章也相当清楚地描述了它。
David Christiansen

50

伊德里斯与阿格达之间的另一个区别是,伊德里斯的命题平等是异质的,而阿格达的主张平等是同质的。

换句话说,伊德里斯对平等的推定定义是:

data (=) : {a, b : Type} -> a -> b -> Type where
  refl : x = x

而在阿格达

data _≡_ {l} {A : Set l} (x : A) : A → Set a where
    refl : x ≡ x

阿格达定义中的l可以忽略不计,因为它与埃德温在回答中提到的宇宙多态性有关。

重要的区别在于,Agda中的相等类型将A的两个元素作为参数,而在Idris中,它可以采用两个可能具有不同类型的值。

换句话说,在伊德里斯,人们可以断言具有不同类型的两件事是相等的(即使最终结果是无法证明的断言),而在阿格达,这种说法是胡说八道。

这对类型理论具有重要而广泛的影响,尤其是在同伦类型理论上工作的可行性方面。为此,异构相等只是行不通,因为它需要与HoTT不一致的公理。另一方面,可以用异构等式陈述有用的定理,而这些等式不能用同类等式直接说明。

也许最简单的例子是向量级联的关联性。给定的长度索引列表称为向量,因此定义为:

data Vect : Nat -> Type -> Type where
  Nil : Vect 0 a
  (::) : a -> Vect n a -> Vect (S n) a 

并串联以下类型:

(++) : Vect n a -> Vect m a -> Vect (n + m) a

我们可能想证明:

concatAssoc : (xs : Vect n a) -> (ys : Vect m a) -> (zs : Vect o a) ->
              xs ++ (ys ++ zs) = (xs ++ ys) ++ zs

该语句在齐次相等下是无意义的,因为相等的左侧为type Vect (n + (m + o)) a,右侧为type Vect ((n + m) + o) a。这是一个非常明智的声明,具有不同的相等性。


26
您似乎对Agda标准库的评论比对Agda的基础理论的评论要多,但即使标准库也包含同质和异质相等(cse.chalmers.se/~nad/listings/lib/…)。人们只会在可能的情况下更频繁地使用前者。后者等效于一种声明,即类型相等,后跟一个有关值的声明。在类型相等性很奇怪(HoTT)的世界中,那么heteq是一个奇怪的陈述。
神秘的丹

6
我不明白在同质平等下,这种说法是无稽之谈。除非我弄错了,(n + (m + o))并且((n + m) + o)根据+on 的关联性(从归纳原理得出)在判断上是相等的。因此,等式的每一侧确实具有相同的类型。平等类型之间的区别很重要,但我不认为这是一个例子。

5
@Abhishek判决平等与定义平等不一样吗?我认为您的意思是说(n +(m + o))和((n + m)+ o)在命题上相等,但在定义/判断上不相等。
汤姆·克罗基特

3
对。当我说审判平等时,我指的是命题平等。抱歉。这是更正后的注释:(n +(m + o))和((n + m)+ o)在命题上相等,但在定义上不相等。如果您具有a:A,则只有当A和B在定义上相等时,a:B才成立。为了确定类型检查,必须确定定义相等性。在扩展类型理论中,定义相等与命题相等同时发生,因此类型检查是不确定的。在Coq中,定义相等仅包括计算,alpha相等,定义展开。
Abhishek Anand
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.