web-dev-qa-db-ja.com

AgdaとIdrisの違い

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

私の質問は、それらの主な違いはどれですか?型システムは両方で同等に表現的ですか?包括的な比較を行い、利益について議論することは素晴らしいことです。

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

  • イドリスにはHaskellの型クラスがありますが、Agdaにはインスタンス引数があります
  • イドリスには、単項および適用表記法が含まれています
  • どちらも同じようなものかどうかは確かではありませんが、ある種の再バインド可能な構文を持っているようです。

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

159
serras

イドリスを実装したので、私はおそらく少し偏っているので、これに答えるのに最適な人ではないかもしれません! FAQ- http://docs.idris-lang.org/en/latest/faq/faq.html -何か言いたいことがありますが、それを少し展開してください:

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

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

別の違いはコンパイルにあります。 Agdaは主にHaskellを経由し、IdrisはCを経由します。Agdaには、Cを経由したIdrisと同じバックエンドを使用する実験的なバックエンドがあります。 Idrisの主な目標は、常に効率的なコードを生成することです。現在よりもはるかに改善できますが、現在取り組んでいます。

AgdaとIdrisの型システムは、多くの重要な点でかなり似ています。主な違いは宇宙の取り扱いにあると思います。アグダには宇宙多型があり、イドリスには 累積性 (そしてSet : Set制限が厳しすぎると感じた場合、および証拠が不適切である可能性があることを気にしない場合)。

177
Edwin Brady

イドリスとアグダのもう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
_

Agda定義のlは無視できます。これは、エドウィンが答えで言及している宇宙多型に関係しているためです。

重要な違いは、Agdaの等値型は引数としてAの2つの要素を使用するのに対し、イドリスでは潜在的にdifferent型の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であるため、このステートメントは同次等式では意味がありません。異質な平等を備えた完全に賢明な発言です。

46