Различия между Агда и Идрис

Я начинаю погружаться в зависимо-типизированное программирование и обнаружил, что языки Agda и Idris ближе всего к Haskell, поэтому я начал там.

мой вопрос: каковы основные различия между ними? Системы типа одинаково expresive в обоих из них? Было бы здорово провести всестороннее сопоставление и обсуждение преимуществ.

Я смог заметить некоторые:

  • Idris имеет классы типов à la Haskell, в то время как Agda идет с аргументами экземпляра
  • Idris включает монадические и прикладные обозначения
  • оба они, похоже, имеют какой-то переориентируемый синтаксис, хотя и не совсем уверены, что они одинаковы.

редактировать: есть еще несколько ответов на странице Reddit этого вопроса:http://www.reddit.com/r/dependent_types/comments/q8n2q/agda_vs_idris/

2 ответов


Я не могу быть лучшим человеком, чтобы ответить на это, так как реализовав Idris, я, вероятно, немного предвзят! FAQ -http://docs.idris-lang.org/en/latest/faq/faq.html - есть что сказать по этому поводу, но немного расширить это:

Idris был разработан с нуля для поддержки программирования общего назначения перед доказательством теоремы, и как таковой имеет функции высокого уровня, такие как классы типов, обозначения, идиомы скобки, список понимания, перегрузки и так далее на. Идрис ставит Программирование высокого уровня впереди интерактивного доказательства, хотя, поскольку Идрис построен на разработчике, основанном на тактике, есть интерфейс для интерактивного доказательства теоремы на основе тактики (немного похожий на Coq, но не такой продвинутый, по крайней мере, пока).

другое дело цели Идрис для поддержки встроенных реализации ДСЛ. С Haskell вы можете получить длинный путь с нотацией do, и Вы можете с Idris тоже, но вы также можете повторно связать другие конструкции, такие как application и variable привязка, если нужно. Вы можете найти более подробную информацию об этом в учебнике или полную информацию в этой статье:http://www.cs.st-andrews.ac.uk / ~eb / drafts / dsl-idris.pdf

другое отличие заключается в компиляции. Agda идет в основном через Haskell, Idris через C. существует экспериментальный задний конец для Agda, который использует тот же задний конец, что и Idris, через C. Я не знаю, насколько хорошо он поддерживается. Основной целью Idris всегда будет создание эффективного кода - мы можем сделать намного лучше чем мы сейчас занимаемся, но мы работаем над этим.

системы типов в Agda и Idris довольно похожи во многих важных отношениях. Я думаю, что главное различие заключается в управлении вселенными. Agda имеет Вселенский полиморфизм, Idris имеет cumulativity (и вы можете иметь Set : Set в обоих случаях, если вы считаете это слишком ограничительным и не возражаете, что ваши доказательства могут быть необоснованными).


еще одно различие между Идрисом и Агда заключается в том, что пропозициональное равенство Идриса неоднородно, в то время как Агда однородно.

другими словами, предполагаемое определение равенства в Идрисе было бы:

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

в то время как в Agda, это

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

l в определении Agda можно игнорировать, так как это связано с полиморфизмом Вселенной, который Эдвин упоминает в своем ответе.

важным отличием является то, что тип равенства в Agda принимает два элемента a в качестве аргументов, а в Idris может принимать два значения с потенциально разные типы.

это имеет важные и широкие последствия для теории типов, особенно в отношении возможности работы с теорией гомотопического типа. Для этого гетерогенное равенство просто не будет работать, потому что оно требует аксиомы, несовместимой с Хоттом. С другой стороны, можно сформулировать полезные теоремы с гетерогенным равенством, которые не могут быть прямо сформулированы с однородным равенством.

возможно, самый простой пример-ассоциативность векторной конкатенации. Заданные индексированные по длине списки называются векторами, определенными таким образом:

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

это утверждение бессмысленно при однородном равенстве, потому что левая сторона равенства имеет тип Vect (n + (m + o)) a и правая сторона имеет тип Vect ((n + m) + o) a. Это совершенно разумное утверждение с неоднородным равенством.