Эпиграмма (язык программирования)

редактировать
Функциональный язык программирования
Эпиграмма
Парадигма Функциональный
Разработано Конором Макбрайд. Джеймс МакКинна
Разработчик Без обслуживания
Впервые появился2004; 16 лет назад (2004 г.)
Стабильный выпуск 1/11 октября 2006 г.; 14 лет назад (11.10.2006)
Дисциплина ввода сильная, статическая, зависимая
OS Кросс-платформенная : Linux, Windows, macOS
Лицензия MIT
Веб-сайтe-pig.org
Под влиянием
ALF
Под влиянием
Agda, Idris

Epigram - это язык функционального программирования с зависимыми типами и интегрированной средой разработки (IDE) обычно поставляется вместе с языком. Система типов эпиграммы достаточно сильна, чтобы выразить спецификации программы. Цель состоит в том, чтобы поддерживать плавный переход от обычного программирования к интегрированным программам и доказательствам, правильность которых может быть проверена и подтверждена компилятором . Epigram использует соответствие Карри – Ховарда, также называемое принципами предложений как принципа типов, и основывается на интуиционистской теории типов.

Прототип Epigram был реализован Конором МакБрайдом на основе о совместной работе с Джеймсом МакКинной. Его развитие продолжается группой Epigram в Ноттингеме, Дареме, Сент-Эндрюс и Ройал Холлоуэй, Лондонский университет в Соединенное Королевство (Великобритания). Текущая экспериментальная реализация системы Epigram находится в свободном доступе вместе с руководством пользователя, учебным пособием и некоторыми справочными материалами. Система использовалась в Linux, Windows и macOS.

. В настоящее время она не обслуживается, а версия 2, предназначенная для реализации теории наблюдательного типа, никогда не использовалась. официально выпущен, но существует в GitHub. Дизайн Epigram и Epigram 2 вдохновил на разработку Agda, Idris и Coq.

Содержание
  • 1 Синтаксис
    • 1.1 Примеры
      • 1.1.1 Натуральные числа
      • 1.1.2 Рекурсия по натуральным числам
      • 1.1.3 Сложение
  • 2 Зависимые типы
  • 3 См. Также
  • 4 Дополнительная литература
  • 5 Внешние ссылки
  • 6 Ссылки
Синтаксис

Эпиграмма использует двумерный синтаксис в стиле естественного вывода с версиями в LaTeX и ASCII. Вот несколько примеров из The Epigram Tutorial:

Примеры

Натуральные числа

Следующее объявление определяет натуральные числа :

(! (! (N : Nat! Data! ---------! Где! ----------!;! -----------!! Nat: *)! Zero: Nat)! Suc n: Nat)

В объявлении говорится, что Nat- это тип с kind *(т.е. это простой тип) и двумя конструкторами: нольи успех. Конструктор suпринимает единственный аргумент Natи возвращает Nat. Это эквивалентно объявлению Haskell «data Nat = Zero | Suc Nat».

В LaTeX код отображается как:

d a t a _ (N a t: ⋆) w h e r e _ (z e r o: N a t); (n: N atsucn: N at) {\ displaystyle {\ underline {\ mathrm {data}}} \; \ left ({\ frac {} {{\ mathsf {Nat}}: \ star}} \ right) \ ; {\ underline {\ mathrm {where}}} \; \ left ({\ frac {} {{\ mathsf {zero}}: {\ mathsf {Nat}}}} \ right) \ ;; \; \ left ({\ frac {n: {\ mathsf {Nat}}} {{\ mathsf {success}} \ n: {\ mathsf {Nat}}}} \ right)}{ \ underline {\ mathrm {data}}} \; \ left ({\ frac {} {{\ mathsf {Nat}}: \ star}} \ right) \; {\ underline {\ mathrm {where}}} \ ; \ left ({\ frac {} {{\ mathsf {zero}}: {\ mathsf {Nat}}}} \ right) \ ;; \; \ left ({\ frac {n: {\ mathsf {Nat}) }} {{\ mathsf {success}} \ n: {\ mathsf {Nat}}}} \ right)

Обозначение горизонтальной линии можно читать как «предполагая (то, что вверху) верно, мы можем сделать вывод, что (то, что внизу) верно». Например, «предположим, что nимеет тип Nat, тогда suc nимеет тип Nat». Если наверху ничего нет, то нижнее утверждение всегда верно: «нольимеет тип Nat(во всех случаях)».

Рекурсия по натуральным числам

N на I nd: ∀ P: N at → ⋆ ⇒ P zero → (∀ n: N at ⇒ P n → P (sucn)) → ∀ n: N at ⇒ P n {\ displaystyle {\ mathsf {NatInd}}: {\ begin {matrix} \ forall P: {\ mathsf {Nat}} \ rightarrow \ star \ Rightarrow P \ {\ mathsf {zero}} \ rightarrow \\ ( \ forall n: {\ mathsf {Nat}} \ Rightarrow P \ n \ rightarrow P \ ({\ mathsf {su}} \ n)) \ rightarrow \\\ forall n: {\ mathsf {Nat}} \ Rightarrow P \ n \ end {matrix}}}{\ mathsf {NatInd}}: {\ begin {matrix} \ forall P: {\ mathsf {Nat}} \ rightarrow \ star \ Rightarrow P \ {\ mathsf {zero}} \ rightarrow \\ (\ forall n: {\ mathsf {Nat}} \ Rightarrow P \ n \ rightarrow P \ ({\ mathsf {su }} \ n)) \ rightarrow \\\ forall n: {\ mathsf {N at}} \ Rightarrow P \ n \ end {matrix}}
N в точке I nd P mzmszero ≡ mz {\ displaystyle {\ mathsf {NatInd}} \ P \ mz \ ms \ {\ mathsf {zero}} \ Equiv mz}{\ mathsf { NatInd}} \ P \ mz \ ms \ {\ mathsf {zero}} \ Equiv mz
N при I nd P mzms (sucn) ≡ msn (N at I nd P mzmsn) {\ displaystyle {\ mathsf {NatInd}} \ P \ mz \ ms \ ({\ mathsf {su}} \ n) \ эквив ms \ n \ (NatInd \ P \ mz \ ms \ n)}{\ mathsf {NatInd}} \ P \ mz \ ms \ ({\ mathsf {suc}} \ n) \ Equiv ms \ n \ (NatInd \ P \ mz \ ms \ n)

... И в ASCII:

NatInd: все P: Nat ->* =>P ноль ->(все n : Nat =>P n ->P (Suc n)) ->all n: Nat =>P n NatInd P mz ms zero =>mz NatInd P mz ms (suc n) =>ms n (NatInd P mz ms n)

Сложение

plusxy ⇐ rec _ x {{\ displaystyle {\ mathsf {plus}} \ x \ y \ Left стрелка {\ underline {\ mathrm {rec}}} \ x \ \ {}{\ mathsf {plus}} \ x \ y \ Leftarrow {\ underline {\ mathrm {rec}}} \ x \ \ {
plusxy ⇐ case _ x {{\ displaystyle {\ mathsf {plus}} \ x \ y \ Leftarrow {\ underline {\ mathrm { case}}} \ x \ \ {}{\ mathsf {plus}} \ x \ y \ Leftarrow {\ underline {\ mathrm {case}}} \ x \ \ {
pluszeroy ⇒ y {\ displaystyle {\ mathsf {plus \ zero}} \ y \ Rightarrow y}{\ mathsf {plus \ zero}} \ y \ Rightarrow y
plus (suxx) y ⇒ success (plusxy)}} { \ Displaystyle \ quad \ quad {\ mathsf {плюс}} \ ({\ mathsf {suc}} \ x) \ y \ Rightarrow {\ mathsf {suc}} ({\ mathsf {plus}} \ x \ y) \ \} \ \}}{\ displaystyle \ quad \ quad {\ mathsf {plus}} \ ({\ mathsf {success}} \ x) \ y \ Rightarrow {\ mathsf { success}} ({\ mathsf {plus}} \ x \ y) \ \} \ \}}

... И в ASCII:

плюс xy <= rec x { plus x y <= case x { plus zero y =>y plus (success x) y =>success (плюс xy)}}
зависимый типы

Эпиграмма - это, по сути, типизированное лямбда-исчисление с расширениями обобщенного алгебраического типа данных, за исключением двух расширений. Во-первых, это первоклассные сущности типа ⋆ {\ displaystyle \ star}\ star ; типы - это произвольные выражения типа ⋆ {\ displaystyle \ star}\ star , а эквивалентность типов определяется в терминах нормальных форм типов. Во-вторых, у него есть зависимый тип функции; вместо P → Q {\ displaystyle P \ rightarrow Q}P \ rightarrow Q , ∀ x: P ⇒ Q {\ displaystyle \ forall x: P \ Rightarrow Q}\ forall x: P \ Rightarrow Q , где x { \ displaystyle x}x привязан в Q {\ displaystyle Q}Q к значению, которое аргумент функции (типа P {\ displaystyle P}P ) в конце концов берет.

Полностью зависимые типы, реализованные в Epigram, представляют собой мощную абстракцию. (В отличие от Dependent ML, значение (я), от которого зависит, может быть любого допустимого типа.) Образец новых формальных возможностей спецификации, которые приносят зависимые типы, можно найти в The Epigram Tutorial.

См. Также
  • ALF, помощник по проверке среди предшественников Epigram.
Дополнительная литература
  • McBride, Conor; МакКинна, Джеймс (2004). «Вид слева». Журнал функционального программирования.
  • Макбрайд, Конор (2004). Прототип эпиграммы, кивок и два подмигивания (Отчет).
  • МакБрайд, Конор (2004). Учебное пособие по эпиграммам (Отчет).
  • Альтенкирх, Торстен; Макбрайд, Конор; МакКинна, Джеймс (2005). Почему зависимые типы имеют значение (отчет).
  • Чепмен, Джеймс; Альтенкирх, Торстен; Макбрайд, Конор (2006). «Перезагрузка эпиграммы»: автономное средство проверки типов для ETT (отчет).
  • Чепмен, Джеймс; Даганд, Пьер-Эварист; Макбрайд, Конор; Моррис, Питер (2010). Мягкое искусство левитации (Отчет).
Внешние ссылки
Ссылки
Последняя правка сделана 2021-05-19 12:13:08
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте