stringtranslate.com

Идрис (язык программирования)

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

Система типов Idris аналогична системе Agda , а доказательства аналогичны системе Coq , включая тактику ( функции/процедуры доказательства теорем ) посредством отражения разработчика. [6] По сравнению с Agda и Coq, Idris отдает приоритет управлению побочными эффектами и поддержке встроенных предметно-ориентированных языков . Idris компилируется в C (полагаясь на специальный копирующий сборщик мусора с использованием алгоритма Чейни ) и JavaScript (как на основе браузера, так и на основе Node.js ). Существуют сторонние генераторы кода для других платформ, включая виртуальную машину Java (JVM), Common Intermediate Language (CIL) и LLVM . [7]

Идрис назван в честь поющего дракона из британской детской телепрограммы 1970-х годов « Паровозик Айвор» . [8]

Функции

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

Функциональное программирование

Синтаксис Idris имеет много общего с синтаксисом Haskell. Программа hello world в Идрисе может выглядеть так:

модуль Главный main : IO ()
main = putStrLn "Привет, Мир!"      

Единственные различия между этой программой и ее эквивалентом на Haskell — это одиночное (вместо двойного) двоеточие в сигнатуре типа основной функции и отсутствие слова « where» в объявлении модуля . [9]

Индуктивные и параметрические типы данных

Idris поддерживает индуктивно определяемые типы данных и параметрический полиморфизм . Такие типы могут быть определены как в традиционном синтаксисе, подобном Haskell 98 :

Дерево данных a = Узел ( Дерево a ) ( Дерево a ) | Лист а           

или в более общем синтаксисе, подобном обобщенному алгебраическому типу данных (GADT):

Дерево данных : Тип -> Тип , где Узел : Дерево a -> Дерево a -> Дерево a Лист : a -> Дерево a                      

Зависимые типы

При использовании зависимых типов значения могут появляться в типах; по сути, любые вычисления на уровне значений могут быть выполнены во время проверки типа . Ниже определяется тип списков, длина которых известна до запуска программы, традиционно называемых векторами :

data Vect : Nat -> Type -> Type где Nil : Vect 0 a (::) : ( x : a ) -> ( xs : Vect n a ) -> Vect ( n + 1 ) a                              

Этот тип можно использовать следующим образом:

всего добавить : Vect n a -> Vect m a -> Vect ( n + m ) a              добавить ноль ys = ys    добавить ( x :: xs ) ys = x :: добавить xs ys          

Функция appendдобавляет вектор mэлементов типа aк вектору nэлементов типа a. Поскольку точные типы входных векторов зависят от значения, во время компиляции можно быть уверенным, что результирующий вектор будет содержать ровно ( n+ m) элементы типа a. Слово " total" вызывает средство проверки целостности , которое сообщит об ошибке, если функция не охватывает все возможные случаи или невозможно (автоматически) доказать, что она не входит в бесконечный цикл .

Другой распространенный пример — попарное сложение двух векторов, параметризованных по их длине:

общая параAdd : Num a => Vect n a -> Vect n a -> Vect n a               ПараДобавить Nil Nil = Ноль
параДобавить ( x :: xs ) ( y :: ys ) = x + y :: pairAdd xs ys                  

Numa означает, что тип a принадлежит классу типов Num . Обратите внимание, что эта функция по-прежнему успешно проверяет тип в целом, даже несмотря на то, что Nilв одном векторе и числе в другом нет совпадения регистра . Поскольку система типов может доказать, что векторы имеют одинаковую длину, мы можем быть уверены во время компиляции, что этот случай не произойдет, и нет необходимости включать этот случай в определение функции.

Функции помощника по проверке доказательств

Зависимые типы достаточно мощны, чтобы кодировать большинство свойств программ, а программа Idris может проверять инварианты во время компиляции. Это превращает Идриса в помощника по доказательству.

Существует два стандартных способа взаимодействия с помощниками по доказательству: написание серии тактических вызовов (стиль Coq) или интерактивная разработка термина доказательства ( стиль Эпиграмма -Агда). Идрис поддерживает оба режима взаимодействия, хотя набор доступных тактик пока не такой полезный, как у Coq. [ нечеткий ]

Генерация кода

Поскольку в Idris есть помощник по доказательству, можно написать программы Idris для передачи доказательств. Если относиться к ним наивно, такие доказательства останутся во время выполнения. Идрис стремится избежать этой ловушки, агрессивно удаляя неиспользуемые термины. [10] [11]

По умолчанию Идрис генерирует собственный код через C. Другой официально поддерживаемый бэкэнд генерирует JavaScript .

Идрис 2

Idris 2 — это новая автономная версия языка, в которой глубоко интегрирована система линейных типов , основанная на количественной теории типов. В настоящее время он компилируется в Scheme и C. [12]

Смотрите также

Рекомендации

  1. Брэди, Эдвин (12 декабря 2007 г.). «Индекс /~eb/darcs/Idris». Школа компьютерных наук Сент-Эндрюсского университета . Архивировано из оригинала 20 марта 2008 г.
  2. ^ «Выпуск 1.3.4». Гитхаб . Проверено 31 декабря 2022 г.
  3. ^ «Выпущена Идрис 2 версия 0.6.0» . www.idris-lang.org . Проверено 31 декабря 2022 г.
  4. ^ ab «Типы уникальности». Идрис 1.3.1 Документация . Проверено 26 сентября 2019 г.
  5. ^ abc «Идрис, язык с зависимыми типами» . Проверено 26 октября 2014 г.
  6. ^ «Размышление разработчика - документация Idris 1.3.2» . Проверено 27 апреля 2020 г.
  7. ^ «Цели генерации кода - Последняя документация Идриса» . docs.idris-lang.org .
  8. ^ «Часто задаваемые вопросы» . Проверено 19 июля 2015 г.
  9. ^ «Руководство по синтаксису - документация Idris 1.3.2» . Проверено 27 апреля 2020 г.
  10. ^ «Анализ стирания по использованию - последняя документация Идриса» . idris.readthedocs.org .
  11. ^ «Результаты сравнительного анализа» . ziman.functor.sk .
  12. ^ "Идрис-ланг/Идрис2". Гитхаб . Проверено 11 апреля 2021 г.

Внешние ссылки