AgdaとCoqが厳密な肯定性に同意しないのはなぜですか?


24

私は、AgdaとCoqの間の紛らわしい不一致に出くわしました。これは、型理論間の最もよく知られている区別(たとえば、(im)predicativity、帰納再帰など)に明らかに関連していません。

特に、Agdaは次の定義を受け入れています。

  data Ty : Set0 -> Set0 where
    c1 : Ty ℕ
    c2 : Ty (Ty ℕ)

一方、c2での[Ty _]自体のインデックスとしての出現は、厳密な陽性に違反すると見なされるため、同等のCoq定義は拒否されます。

  Inductive Ty : Set -> Set :=
    | c1 : Ty nat
    | c2 : Ty (Ty nat).

実際、このケースは、厳密な積極性に違反するCoq'Artセクション14.1.2.1の例のほぼ逐語的な例です。

  Inductive T : Set -> Set := c : (T (T nat)).

しかし、型理論のこの違いの理由はわかりません。コンストラクター引数で型の負の出現を使用してFalseを証明する古典的な例は私には明らかですが、このスタイルのインデックス付けから矛盾を導き出す方法はわかりません(厳密に正のコンストラクター引数に関係なく)。

Dybjerの初期の帰納的家族の論文は、文献をざっと見て、CID論文のPaulin-Mohringの解法にわずかに異なる制限があることについて、一言コメントを述べています。Dybjerの論文はこれを許可しているようだが、Paulin-Mohringの論文は明らかにそれを禁止している。

どうやらこの意見の違いに気付くのは私が初めてではなく、この定義はどちらのシステム(https://lists.chalmers.se/pipermail/agda/2012/004249.html)でも許可されるべきではないと考える人もいますが、あるシステムでは健全であるが他のシステムでは健全ではない理由、または単に意見の相違がある理由についての説明は見つかりませんでした。

だから私はいくつかの質問があると思う:

  1. これは単調な例ですが、厳密に肯定的なタイプではありませんか?(Coqでは、明らかにAgdaはそれを厳密にポジティブとみなします)
  2. Coqが拒否するのに、なぜAgdaはこれを許可するのですか?「厳密にポジティブ」の解釈における単なる特異な違いです。CoqとAgdaの間に微妙な違いがあり、Agdaで聞こえ、Coqで聞こえないのですか、それとも特定の理論的好みによって駆動される好みの問題ですか?
  3. 上記の最初の定義と、以下の同等の帰納的定義との間に意味のある違いはありますか?

帰納的-再帰的定義:

  mutual
    data U : Set0 -> Set0 where
      c : (i : Fin 2) -> U (T i)
    T : Fin 2 -> Set0
    T zero = ℕ
    T (suc zero) = U ℕ

関連する文献へのポインタを持っていることを嬉しく思います。

前もって感謝します。


1
私の知る限り、Coqは実装するのが簡単で、実際には十分に有用だったため、基礎となる理論が許すものよりも厳密です。異なるが関連するケースについてのこの答えは、私の理解する限りです。
ジル「SO-停止されて悪」

1
この定義は、Agdaの現在のTy is not strictly positive, because it occurs in an index of the target type of the constructor c2 in the definition of Ty.
開発

2
はい、あなたは正しいです、他の誰かが昨夜私にこれを指摘しました。私はDebianの2.3.0.1パッケージを使用していましたが、Cabalの2.3.2.1は直接定義とIR定義の両方を拒否します。それは厳しい指標で一見無関係に見えるバグ作られた陽性のチェックのようになります。code.google.com/p/agda/issues/detail?id=690 それが明示的健全性の問題をマークすることなく、リスト上で議論されて以来、私はまだです型自体が健全かどうか疑問に思います。
コリンゴードン

回答:


10

この問題は、次の2つの要因の合流に起因する混乱のようです。

  1. 古いバージョンのAgda(2.3.0.1)を使用していました。2.3.2より前は、Agdaはコンストラクター結果のインデックスの厳密な陽性をチェックしていなかったようです(スレッドの他の場所にリンクしたバグを参照)。
  2. DybjerのInductive Familiesペーパーを詳しく読むと、コンストラクターresultのインデックスを入力するときに、定義されている帰納的タイプをバインドしないことを意図している可能性があります。セクション3.2.1は、散文での帰納的コンストラクタのスキームを提供し、明らかに、スキームの各部分のバインディング環境を記述する言語を読み間違えています。

この綿密な読みは、もちろん、Coqおよび(最近のバージョンの)Agdaが実行するチェックと一致しており、独自のインデックスにTが現れることを禁止します。


4

違いの考えられる理由は、あなた自身の発言が示唆するように、不可逆性です。Coqには歴史的に、命令セットがありました(まだフラグとして利用可能です!)

アダム・クリパラの本を引用http://adam.chlipala.net/cpdt/html/Universes.html

Coqツールは、コマンドラインフラグ-impredicative-setをサポートします。これは、Setをimpredicativeにすることにより、ガリナをより基本的な方法で変更します。forall Tのような用語:Set、TにはSet型があり、Setの帰納的定義には、任意の型の引数を定量化するコンストラクターがあります。一貫性を維持するには、Propの制限と同様に、除去制限を適用する必要があります。制限は、一部のコンストラクターがType型の型を定量化する大きな帰納型にのみ適用されます。このような場合、この誘導型の値は、型がSetまたはPropである結果型を生成するためにのみパターンマッチングされます。この規則は、非大型誘導型にも制限が適用されるPropの規則とは対照的です。そして、結果型の型がPropのみの場合、Coqの古いバージョンでは、デフォルトでSetは必須でした。後のバージョンでは、いくつかの古典的な公理との矛盾を避けるためにSetを述語にします。特に、選択の公理で命令セットを使用する場合は注意が必要です。除外された中間または述語の拡張性と組み合わせて、不整合が生じる可能性があります。Impredicative Setは、本質的にimpredicative数学的概念のモデリングに役立ちますが、ほとんどすべてのCoq開発はそれなしでうまくいきます。


上で見つけたバグ修正の音から、Agdaは単にコンストラクターの結果のインデックスの陽性をチェックしていなかったようです。これは、実際に提案されたタイプが単調かどうかを示すものではありませんが、それが不可逆性に関連していないことを示唆しています。
コリンゴードン

2
はい、-impredicative-setはCoqでSetを命令的にします。
コリンゴードン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.