Epigramは、依存型を持つ関数型プログラミング言語であり、通常は統合開発環境(IDE)が言語に同梱されています。Epigramの型システムは、プログラム仕様を表現するのに十分な強度を備えています。その目的は、通常のプログラミングから、コンパイラによって正当性を検証および証明できる統合プログラムおよび証明へのスムーズな移行をサポートすることです。Epigramは、カリー・ハワード対応(命題を型とする原理とも呼ばれる)を利用し、直観主義型理論に基づいています。
Epigramのプロトタイプは、コナー・マクブライドがジェームズ・マッキンナとの共同研究に基づいて実装しました。その開発は、英国(UK)のノッティンガム大学、ダラム大学、セント・アンドリュース大学、およびロンドン大学ロイヤル・ホロウェイ校のEpigramグループによって継続されています。Epigramシステムの現在の実験的な実装は、ユーザーマニュアル、チュートリアル、および背景資料とともに無料で利用できます。このシステムは、Linux、Windows、およびmacOSで使用されています。
現在はメンテナンスされておらず、観測型理論を実装することを目的としていたバージョン2は正式にはリリースされなかったものの、GitHubに存在している。
Epigramは、 LaTeX版とASCII版があり、二次元的な自然演繹スタイルの構文を使用します。以下は、Epigramチュートリアルからの例です。
以下の宣言は自然数を定義します。
( ! ( ! ( n : Nat !データ!---------!場所!----------! ; !-----------! ! Nat : * ) !ゼロ: Nat ) ! suc n : Nat )この宣言は、Nat型がカインド*(つまり、単純型)であり、2 つのコンストラクタ と を持つ型でzeroあることを示していますsuc。コンストラクタ はsuc1 つのNat引数を取り、 を返します。これはHaskell の宣言 " "Natと同等です。data Nat = Zero | Suc Nat
LaTeXでは、コードは次のように表示されます。
水平線表記は、「(上段の内容が)真であると仮定すると、(下段の内容が)真であると推論できる」と解釈できます。例えば、「nが型であると仮定するとNat、はsuc n型であるNat」となります。上段に何も記述されていない場合は、下段の記述は常に真です。「は(すべての場合において)zero型であるNat」となります。
ASCII表記:
NatInd : all P : Nat -> * => P zero -> ( all 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 )ASCII表記:
プラスx y <= rec x {プラスx y <= case x {プラスゼロy => y プラス( suc x ) y => suc (プラスx y ) } }Epigramは基本的に、一般化された代数的データ型拡張を備えた型付きラムダ計算ですが、2つの拡張があります。まず、型は第一級エンティティであり、型は; 型は任意の型の式です、型の等価性は型の正規形によって定義されます。 第二に、依存関数型を持ちます。、、 どこに縛られている関数の引数(型)の値に最終的にはそうなる。
Epigramで実装されている完全な依存型は、強力な抽象化です。(Dependent MLとは異なり、依存する値は任意の有効な型にすることができます。)依存型がもたらす新しい形式仕様機能の例は、Epigramチュートリアルで確認できます。