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


165

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

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

Я был в состоянии заметить некоторые:

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

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


1
Возможно, вы захотите взглянуть на coq aswel, синтаксис которого не за миллион миль от haskell, и в нем легко использовать классы типов :)

4
Для справки: Агда также имеет монадические и аппликативные обозначения в наше время.
Gallais

Ответы:


190

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

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

Еще одна вещь, которую Idris стремится поддерживать хорошо, - это реализация Embedded DSL. С Haskell вы можете проделать длинный путь с помощью нотации do, и вы можете сделать это с Idris, но вы также можете перепривязать другие конструкции, такие как привязка приложения и переменной, если вам нужно. Вы можете найти более подробную информацию об этом в руководстве, или полную информацию в этом документе: http://eb.host.cs.st-andrews.ac.uk/drafts/dsl-idris.pdf

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

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


49
Что вы имеете в виду, "... не самый лучший человек, чтобы ответить ..."? Вы один из лучших людей, чтобы ответить, так как вы знаете Идрис близко. Теперь нам просто нужен NAD, чтобы ответить, и у нас есть вся картина :) Спасибо, что нашли время ответить.
Alex R

9
Есть ли место, где я могу прочитать больше о совокупности? Я никогда не слышал об этом раньше ...
Серрас

13
Книга Адама Члипалы, пожалуй, лучшее место:
Эдвин Брэди,

8
Первая глава книги HoTT также описывает это довольно ясно, если кратко.
Дэвид Кристиансен

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

Л в определении Агды можно игнорировать, так как он имеет отношение к полиморфизму вселенной, который Эдвин упоминает в своем ответе.

Важным отличием является то, что тип равенства в 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

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


26
Похоже, вы комментируете больше стандартной библиотеки Agda, чем основополагающую теорию Agda, но даже стандартная библиотека содержит как гомогенное, так и гетерогенное равенство ( cse.chalmers.se/~nad/listings/lib/… ). Люди просто чаще используют первое, где это возможно. Последнее эквивалентно утверждению о том, что типы равны, а затем о значениях. В мире, где равенство типов странно (HoTT), тогда heteq - более странное утверждение.
Таинственный Дан

6
Я не понимаю, как это утверждение бессмысленно при однородном равенстве. Если я не ошибаюсь, (n + (m + o))и ((n + m) + o)по суждению равны по ассоциативности +по (выведено из принципа индукции). Соответственно, каждая сторона равенства имеет один и тот же тип. Разница между типами равенства важна, но я не вижу, как это является примером этого.

5
@Abhishek не равенство суждений такое же, как равенство определений? Я думаю, что вы хотите сказать, что (n + (m + o)) и ((n + m) + o) пропозиционально равны, но не равны по определению / суждению.
Том Крокетт

3
право. Я имел в виду пропозициональное равенство, когда говорил судейское равенство. Сожалею. Вот исправленный комментарий: (n + (m + o)) и ((n + m) + o) пропозиционально равны, но не равны по определению. Если у вас есть a: A, a: B выполняется, только если A и B являются определенно равными типами. Для решимости проверки типов определение равенства должно быть решаемым. В теориях экстенсионального типа равенство определений совпадает с равенством высказываний, и поэтому проверка типов неразрешима. В Coq равенство определений включает только вычисления, альфа-равенство, развертывание определений.
Абхишек Ананд
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.