Agda和Idris之间的差异

ser*_*ras 158 type-theory agda idris

我开始深入研究依赖类型的编程,并发现Agda和Idris语言最接近Haskell,所以我从那里开始.

我的问题是:它们之间的主要区别是什么?类型系统在两者中是否同样具有表现力?能够进行全面的比较和关于利益的讨论会很棒.

我已经能够发现一些:

  • Idris有类型类la Haskell,而Agda有实例参数
  • 伊德里斯包括monadic和applicative符号
  • 它们似乎都有某种可重新绑定的语法,虽然不确定它们是否相同.

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

Edw*_*ady 179

我可能不是回答这个问题的最佳人选,因为实施伊德里斯我可能有点偏颇!常见问题解答 - http://docs.idris-lang.org/en/latest/faq/faq.html - 有话要说,但要稍微扩展一下:

Idris的设计是为了在定理证明之前支持通用编程,因此具有高级功能,如类型类,符号,成语括号,列表推导,重载等.Idris将高级编程放在交互式证明之前,尽管因为Idris建立在基于策略的阐述者之上,因此有一个基于策略的交互式定理证明器的接口(有点像Coq,但不是那么先进,至少还没有).

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

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

Agda和Idris中的类型系统在许多重要方面非常相似.我认为主要区别在于宇宙的处理.阿格达具有宇宙多态性,伊德里斯具有累积性(Set : Set如果您发现这种限制性过于严重并且不介意您的证据可能不健全,那么您可以使用它们).

  • 你是什​​么意思,"......不是最好的回答......"?你是最好的人之一,因为你非常了解伊德里斯.现在我们只需要NAD回复,我们全面了:)感谢您抽出宝贵时间回复. (43认同)
  • [Adam Chlipala的书](http://adam.chlipala.net/cpdt/html/Universes.html)可能是最好的地方: (12认同)
  • 我有什么地方可以阅读更多关于累积性的内容吗?我以前从未听说过...... (7认同)
  • 如果简明扼要,HoTT书的第一章也相当清楚地描述了它. (7认同)
  • 目前已断开DSL论文的链接:( (2认同)

Dav*_*sen 49

Idris和Agda之间的另一个区别是Idris的命题平等是异质的,而Agda是同质的.

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

data (=) : {a, b : Type} -> a -> b -> Type where
  refl : x = x
Run Code Online (Sandbox Code Playgroud)

而在阿格达,它是

data _?_ {l} {A : Set l} (x : A) : A ? Set a where
    refl : x ? x
Run Code Online (Sandbox Code Playgroud)

阿格达定义中的l可以被忽略,因为它与埃德温在他的答案中提到的宇宙多态性有关.

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

换句话说,在伊德里斯,人们可以声称两种不同类型的东西是相等的(即使它最终是一种无法证明的主张),而在阿格达,这句话是无稽之谈.

这对于类型理论具有重要且广泛的影响,特别是关于使用同伦型理论的可行性.为此,异构平等不会起作用,因为它需要一个与HoTT不一致的公理.另一方面,可以陈述具有异构相等性的有用定理,这些定理不能用均匀相等直接说明.

也许最简单的例子是矢量连接的相关性.给定长度索引列表称为向量:

data Vect : Nat -> Type -> Type where
  Nil : Vect 0 a
  (::) : a -> Vect n a -> Vect (S n) a 
Run Code Online (Sandbox Code Playgroud)

和以下类型的连接:

(++) : Vect n a -> Vect m a -> Vect (n + m) a
Run Code Online (Sandbox Code Playgroud)

我们可能想要证明:

concatAssoc : (xs : Vect n a) -> (ys : Vect m a) -> (zs : Vect o a) ->
              xs ++ (ys ++ zs) = (xs ++ ys) ++ zs
Run Code Online (Sandbox Code Playgroud)

这个陈述在齐次等式下是无意义的,因为等式的左边有类型Vect (n + (m + o)) a而右边有类型Vect ((n + m) + o) a.这是异质平等的完美明智的陈述.

  • 您似乎更多地评论Agda标准库而不是Agda的基础理论,但即使是标准库也包含同构和异构平等(http://www.cse.chalmers.se/~nad/listings/lib/Relation.Binary .HeterogeneousEquality.html#1).人们倾向于在可能的情况下更频繁地使用前者.后者等同于声明类型相等,后跟一个关于值的声明.在类型相等很奇怪的世界(HoTT)中,heteq是一个更奇怪的陈述. (26认同)
  • 我不明白这种说法在同质平等下是多么无稽之谈.除非我弄错了,`(n +(m + o))`和`((n + m)+ o)`在判断上是相同的`+`对```(从归纳原理导出).因此,等式的每一面都具有相同的类型.平等类型之间的差异很重要,但我不知道这是一个例子. (6认同)
  • @Abhishek与定义平等一样不是判断性平等吗?我认为你的意思是说(n +(m + o))和((n + m)+ o)在命题上是相等的但在定义上/判断上并不相等. (5认同)
  • 对.当我说判断平等时,我的意思是命题平等.抱歉.以下是更正后的注释:(n +(m + o))和((n + m)+ o)在命题上相等但在定义上不相等.如果你有:A,a:B仅在A和B在定义上相等的类型时才成立.对于类型检查的可判定性,定义相等必须是可判定的.在扩展类型理论中,定义平等与命题相等一致,因此类型检查是不可判定的.在Coq中,定义相等只包括计算,alpha相等,定义展开. (3认同)