Epigram — это функциональный язык программирования с зависимыми типами и интегрированной средой разработки (IDE), обычно поставляемой вместе с языком. Система типов Epigram достаточно сильна, чтобы выражать спецификации программы . Целью является поддержка плавного перехода от обычного программирования к интегрированным программам и доказательствам, корректность которых может быть проверена и сертифицирована компилятором . Эпиграмма использует соответствие Карри-Ховарда , также называемое принципом предложений как типов , и основано на интуиционистской теории типов .
Прототип Epigram был реализован Конором МакБрайдом на основе совместной работы с Джеймсом МакКинной. Его развитие продолжают группы Epigram в Ноттингеме , Дареме , Сент-Эндрюсе и Ройял Холлоуэй, Лондонский университет в Соединенном Королевстве (Великобритания). Текущая экспериментальная реализация системы Epigram находится в свободном доступе вместе с руководством пользователя, учебным пособием и некоторыми справочными материалами. Система использовалась под Linux , Windows и macOS .
В настоящее время он не поддерживается, а версия 2, предназначенная для реализации теории наблюдательных типов, никогда официально не выпускалась, но существует на GitHub .
Epigram использует двумерный, естественный синтаксис стиля дедукции с версиями в LaTeX и ASCII . Вот несколько примеров из Учебника по эпиграммам :
Следующее объявление определяет натуральные числа :
( ! ( ! ( n : Nat ! data !---------! где !----------! ; !-----------! ! Nat : * ) ! ноль : Нэт ) ! успех н : Нэт )
В объявлении сказано, что Nat
это тип с видом *
(т. е. простой тип) и двумя конструкторами: zero
и suc
. Конструктор suc
принимает один Nat
аргумент и возвращает Nat
. Это эквивалентно объявлению Haskell " data Nat = Zero | Suc Nat
".
В LaTeX код отображается так:
Обозначение горизонтальной линии можно прочитать как «предполагая, что (то, что вверху) истинно, мы можем сделать вывод, что (то, что внизу) истинно». Например, «предполагается n
, что имеет тип Nat
, тогда suc n
имеет тип Nat
». Если сверху ничего нет, то нижнее утверждение всегда истинно: « zero
имеет тип Nat
(во всех случаях)».
... И в ASCII:
NatInd : все P : Nat -> * => P ноль -> ( все n : Nat => P n -> P ( suc n )) -> все n : Nat => P n NatInd P mz ms ноль => mz NatInd P mz ms ( suc n ) => ms n ( NatInd P mz ms n )
... И в ASCII:
плюс x y <= запись x { plus x y <= case x { плюс ноль y => y plus ( успех x ) y => успех ( плюс x y ) } }
Эпиграмма — это, по сути, типизированное лямбда-исчисление с обобщенными алгебраическими расширениями типов данных, за исключением двух расширений. Во-первых, типы — это сущности первого класса типа ; типы — это произвольные выражения типа , а эквивалентность типов определяется в терминах нормальных форм типов. Во-вторых, у него есть зависимый тип функции; вместо , , где привязано к значению, которое в конечном итоге принимает аргумент функции (типа ).
Полнозависимые типы, реализованные в Epigram, представляют собой мощную абстракцию. (В отличие от Dependent ML , зависимые значения могут иметь любой допустимый тип.) Пример новых возможностей формальной спецификации, которые предоставляют зависимые типы, можно найти в The Epigram Tutorial .