Відмінності між Агдою та Ідрісом


165

Я починаю занурюватися в залежно від типового програмування і виявив, що мови Agda та Idris найближчі до Haskell, тому я почав саме там.

Моє запитання: які основні відмінності між ними? Чи однаково виражені системи типів в обох? Було б чудово провести всебічне порівняння та обговорення переваг.

Мені вдалося помітити декілька:

  • Idris має класи типу à la Haskell, тоді як Agda має аргументи екземпляра
  • Ідріс включає монадійні та додаткові позначення
  • Вони, схоже, мають якийсь синтаксис, що перезаписується, хоча не дуже впевнені, чи однакові вони.

Редагувати : на цю сторінку Reddit є ще кілька відповідей на це питання: http://www.reddit.com/r/dependent_types/comments/q8n2q/agda_vs_idris/


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

4
Для запису: Агда також має монадичні та застосовні позначення.
gallais

Відповіді:


190

Я, мабуть, не найкраща людина, щоб відповісти на це, оскільки я реалізував Ідріс, я, мабуть, трохи упереджений! У FAQ - http://docs.idris-lang.org/en/latest/faq/faq.html - є про що сказати, але трохи розширити:

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

Інша річ, яку Idris має на меті добре підтримати - це вбудована реалізація DSL. За допомогою Haskell ви можете пройти довгий шлях з позначенням do, і ви можете також з Idris, але ви можете також відновити інші конструкції, такі як додаток і прив'язка змінних, якщо вам потрібно. Більш детальну інформацію про це ви можете знайти в підручнику, або повну інформацію в цьому документі: http://eb.host.cs.st-andrews.ac.uk/drafts/dsl-idris.pdf

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

Системи типів в Агді та Ідрісі у багатьох важливих аспектах досить схожі. Я думаю, що головна відмінність полягає в керуванні всесвітами. У Агди є поліморфізм всесвіту, у Ідріса є кумулятивність (і ви можете мати Set : Setі те, і інше, якщо ви вважаєте це занадто обмежуючим і не заперечуєте, що ваші докази можуть бути недостовірними).


49
Що ви маєте на увазі, "... не найкраща людина, яка відповість ..."? Ви один з найкращих людей, котрий відповів, оскільки ви добре знаєте Ідріса. Тепер нам просто потрібен НАД для відповіді, і ми маємо всю картину :) Дякуємо, що знайшли час для відповіді.
Alex R

9
Чи є якесь місце, де я можу прочитати більше про кумулятивність? Я ніколи про це не чув ...
serras

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

Визначення Аґда можна ігнорувати, як це стосується поліморфізму Всесвіту, про який згадує Едвін у своїй відповіді.

Важлива відмінність полягає в тому, що тип рівності в Агді бере два аргументи А як аргументи, тоді як в 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: B має місце лише в тому випадку, якщо A і B - це однозначно рівні типи. Для вирішуваності перевірки типів, визначальну рівність слід вирішувати. У теоріях розширеного типу визначена рівність збігається з пропозицією рівності, а отже, перевірка типу не підлягає визначенню. У Coq, визначена рівність включає лише обчислення, альфа-рівність, остаточне розгортання.
Абхішек Ананд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.