帰納型の宣言の順序は重要ですか?


9

帰納的な型の宣言の順序が問題になるかどうか疑問に思っていました。

たとえばCoqでは、次のNatいずれかを定義できます。

Inductive Nat :=
  | O : Nat
  | S : Nat -> Nat.

または

Inductive Nat :=
  | S : Nat -> Nat
  | O : Nat.

これはおそらく、自動的に生成されたエリミネーターのパラメーターの順序を変更しますが、それは大した問題ではありません。

私が思っているのは、次のような宣言を書くことが可能かどうかです

Inductive typewhereordermatters :=
  | cons1 : type1
  | cons2 : type2.

type2依存型はどこにありcons1ますか?(そしてこの場合、まだ存在しないtype2ものを参照しているため、宣言を他の順序で記述しても意味cons1がありません)。

回答:


10
  1. 順序は関係ありません。そうなるとは思えない。以下のようアンドレイ・バウアーは、コメントで指摘し、あなたが順序を変更した場合、結果は元の正準同型です

  2. あるケースが別のケースに依存することはできません。合計の要素は選択肢を表すため、採用される選択肢が採用されない選択肢に依存することは意味がありません。


2
最初のポイントをより具体的にすることができます。順序は関係ありません。順序を変更すると、結果は元のものと標準的に同型になります。
Andrej Bauer、

2
@デイブ:ありがとう!私はこの質問をしていたのは、この現象が起こりそうな(より実験的な)より高い誘導型のためであり、これが通常の誘導型の場合にも当てはまるかどうか知りたいと思いました。
Guillaume Brunerie

1
@ギョーム:あなたがリンクで指している現象はわからない。データ型定義のさまざまなコンストラクタ句は、それが高次のデータ型であるかどうかに関係なく、相互に依存することはできません。おそらく、依存関係のあるレコード(リンクで使用され、AgdaCoqで利用可能)を考えているでしょうか?
Noam Zeilberger、

1
@Noam:より高い帰納型の例でcircleは、loopコンストラクターのタイプはコンストラクターに依存しbaseます。
ギヨームブルネリー

2
@ギヨーム:わかりました(実験的な構文が導入されています)。
Noam Zeilberger、

6

順序はあなたが尋ねる方法で重要ですか?番号。

しかし、順序は証明アシスタントの機能とは完全に無関係ですか?繰り返しますが、違います。Matitaでは、コックに非常によく似証明支援、コンストラクタは誘導性の定義に書き込まれる順序はないタイプの一致式を確認し、具体的とき、型チェックのための問題。

Matitaは最初に、すべてのコンストラクターが一致の本文で照合されていることを確認する必要があります。これは、コンストラクターが宣言されている順序でコンストラクターを循環させることによって行われます。次に、最後に宣言されたコンストラクターの大文字と小文字を最初にチェックして、適切な一致式を型チェックします。これは逆の順序で行われます。次に、このタイプが実行され、他のケースをチェックするために使用されます。

これは、大規模な一致式を作成するときに非常によく見られます。最初に簡単なケースを入力し、ワイルドカードの下に難しいケースを残し、定期的に入力内容をチェックして、意味があることを確認します。Matitaは不完全な一致式の型を推測できないことがありますが、帰納型で定義されている最後のコンストラクターのケースを入力すると、幸いにもそうなります。

確かではありませんが、Coqが同様のことをしていると思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.