Различия между Агдой и Идрисом - PullRequest
158 голосов
/ 28 февраля 2012

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

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

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

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

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

Ответы [ 2 ]

176 голосов
/ 28 февраля 2012

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

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

Еще одна вещь, которую Idris стремится хорошо поддерживать, это реализация Embedded DSL.С Haskell вы можете проделать длинный путь с помощью нотации do, и вы можете сделать это с 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 в обоих случаях, если вы находите это слишком ограничительным и не возражаете против того, что ваши доказательства могут быть необоснованными).

46 голосов
/ 08 января 2014

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

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

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 он может принимать два значения с потенциально различными типами.

Другими словами, в 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

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

...