AgdaとIdrisの違い


165

私は依存型プログラミングに飛び込み始めており、AgdaとIdris言語がHaskellに最も近いことがわかったので、そこから始めました。

私の質問は:それらの間の主な違いはどれですか?型システムはそれらの両方で同等に表現力がありますか?包括的な比較と利点についての議論があれば素晴らしいでしょう。

私はいくつかを見つけることができました:

  • IdrisにはHaskellの型クラスがありますが、Agdaはインスタンス引数を使用します
  • イドリスにはモナド表記と適用表記が含まれます
  • それらが同じであるかどうかは本当にわかりませんが、両方とも何らかの再バインド可能な構文を持っているようです。

編集:この質問のRedditページにいくつかの回答があります:http : //www.reddit.com/r/dependent_types/comments/q8n2q/agda_vs_idris/


1
あなたはcoq aswelを見てみたいかもしれません、構文はhaskellから100万マイルも離れていませんし、型クラスを使いやすいです:)

4
記録のために:Agdaはまた最近ではモナディックおよび適用表記を持っています。
ガレ

回答:


190

Idrisを実装したので、私はおそらくこれに答えるのに最適な人ではないかもしれません。FAQ- http://docs.idris-lang.org/en/latest/faq/faq.html-はそれについて何か言いたいことがありますが、それについて少し拡張します:

Idrisは、定理の証明よりも前に汎用プログラミングをサポートするようにゼロから設計されており、型クラス、Do記法、イディオムブラケット、リスト内包表記、オーバーロードなどの高レベルの機能を備えています。Idrisはインタラクティブな証明よりも高レベルのプログラミングを優先していますが、Idrisは戦術ベースのエラボレーターに基づいて構築されているため、戦術ベースのインタラクティブ定理証明器(Coqに少し似ていますが、少なくともまだ高度ではありません)へのインターフェイスがあります。

Idrisがサポートを目指しているもう1つのことは、組み込みDSLの実装です。Haskellを使用すると、do表記を使用して長い道のりをたどることができます。Idrisも使用できますが、必要に応じて、アプリケーションや変数バインディングなどの他の構成を再バインドすることもできます。詳細については、チュートリアル、またはこのペーパーの詳細をご覧ください。http//eb.host.cs.st-andrews.ac.uk/drafts/dsl-idris.pdf

もう1つの違いはコンパイルです。Agdaは主にHaskellを経由し、IdrisはCを経由します。Adriには、C経由でIdrisと同じバックエンドを使用する実験的なバックエンドがあります。どれだけよく維持されているかわかりません。Idrisの主な目標は、常に効率的なコードを生成することです。現在よりもはるかに優れた作業を行うことができますが、現在取り組んでいます。

AgdaとIdrisの型システムは、多くの重要な点でかなり似ています。主な違いは宇宙の扱い方だと思います。Agdaにはユニバースのポリモーフィズムがあり、Idrisには累積性があります(Set : Setこれが非常に制限的であり、証明が不正確である可能性があることを気にしない場合は両方で可能です)。


49
「...答えるのに最適な人ではない...」あなたはイドリスを親密に知っているので、あなたは答えるのに最高の人の一人です。これで、NADにも返信が必要になり、全体像を把握できます:)返信に時間を割いていただきありがとうございます。
アレックスR

9
累積性についてもっと読むことができる場所はありますか?私はそれについてこれまで聞いたことがありません...
serras


8
HoTTブックの最初の章でも、簡潔ではあるが、かなり明確に説明しています。
David Christiansen

50

イドリスとアグダのもう1つの違いは、イドリスの命題の等式は不均一であるのに対し、アグダの均一性は同質であるということです。

つまり、イドリスにおける平等の推定上の定義は次のようになります。

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

アグダ定義のlは無視できます。これは、エドウィンが彼の回答で言及している宇宙多形性に関係しているためです。

重要な違いは、Agdaの等値型はAの2つの要素を引数として取るのに対し、イドリスでは、型が異なる可能性のある2つの値をとることができることです。

言い換えると、イドリスでは、タイプが異なる2つのものが等しいと主張できます(たとえそれが最終的に証明不可能な主張になったとしても)。

これは、特にホモトピー型理論を扱うことの実現可能性に関して、型理論にとって重要で広範囲に及ぶ結果をもたらします。このため、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/…)。人々は可能な限り前者をより頻繁に使用する傾向があるだけです。後者は、型が等しいという値の後に1が続くというステートメントと同等です。型の等価性が奇妙な(HoTT)世界では、heteqは奇妙なステートメントです。
神秘的なダン14年

6
均質な平等のもとで、その発言がナンセンスであることは理解できません。私が間違っていない限り、(n + (m + o))そして(誘導原理から派生した)onの((n + m) + o)結合性によって判断的に等しいです。したがって、等式の各辺は同じタイプです。平等のタイプの違いは重要ですが、これがその例であることはわかりません。+

5
@Abhishekは、判断の等価性が定義の等価性と同じではありませんか?(n +(m + o))と((n + m)+ o)は命題的には等しいが、定義上/判断上は等しくないという意味だと思います。
トムクロケット

3
正しい。判断の平等と言ったとき、命題の平等を意味しました。ごめんなさい。ここに修正されたコメントがあります:(n +(m + o))と((n + m)+ o)は命題的には等しいが、定義上は等しくありません。a:Aがある場合、a:Bは、AとBが定義上等しい型である場合にのみ保持されます。タイプチェックの決定可能性のために、定義の等価性は決定可能でなければなりません。拡張型理論では、定義の等価性は命題の等価性と一致するため、タイプチェックは決定できません。Coqでは、定義の等価性には計算、アルファの等価性、定義の展開のみが含まれます。
Abhishek Anand 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.