これはかなりです。この動作は文書化されています(this manual chapterの "マッチ... with ...エンドコンストラクション"を探してください)、何が起こっているのか分かりにくいかもしれません。
まず、コックにチェックする方法の典型的なmatch
リコール:list
タイプのすべてのコンストラクタはmatch
に対応するブランチを有し、(2)各枝そのこと
Inductive list (T : Type) :=
| nil : list T
| cons : T -> list T -> list T.
Definition tail (T : Type) (l : list T) : list T :=
match l with
| nil => nil
| cons x l' => l'
end.
コックチェック(1)各分岐に導入されたコンストラクタ引数が適切な型(ここではx
がタイプT
であり、l'
が第2ブランチの型がlist T
であると仮定して、同じ型(この場合はlist T
)を持ちます。
単純なケースでは、各ブランチをチェックするために使用されるタイプは、マッチ式全体のタイプとまったく同じです。ただし、ではなく、が常にtrueです。Coqは、チェックしているブランチから抽出した情報に基づいて、より特殊なタイプを使用することがあります。 上ケース分析を行うとき、これはeq
のように、誘導タイプのインデックスを作成しばしば起こる:
Inductive eq (T : Type) (x : T) : T -> Prop :=
| eq_refl : eq T x x.
(=
表記はeq
のためだけ中置構文糖である。)誘導型の
引数がに与えられましたコロンの右側はコークス特有のもので、のインデックスであるとして知られています。左に現れるもの(この場合、T
とx
)は、のパラメータとして知られています。パラメータは、誘導型の宣言ではすべて異なる必要があり、すべてのコンストラクタの結果で使用されたものと正確に一致する必要があります。たとえば、以下の不正なスニペットを考えてみましょう。それはeq_refl'
コンストラクタの結果にnat
代わりのT
を見つけたので
Inductive eq' (T : Type) (x : T) : T -> Type :=
| eq_refl' : eq nat 4 3.
コックは、この例を拒否します。
インデックスには、この制限はありません。戻り値のコンストラクタに表示されるインデックスは、適切な型の任意の式にすることができます。さらに、その表現は、現在のコンストラクタによって異なる場合があります。このため、Coqでは、各ブランチの戻り値の型を、各ブランチのインデックスの選択によって変えることができます。オリジナルの例を少し簡略化したものを考えてみましょう。
Definition h (a b : nat) (e : a = b) : b = a :=
match e in _ = x return x = a with
| eq_refl => eq_refl : a = a
end.
eq
に2番目の引数はインデックスであるので、原理的には使用されるコンストラクタに応じて変えることができます。 Coqは、使用されたコンストラクタを調べるときにそのインデックスが実際に何であるかだけを調べるので、一致の戻り値の型はそのインデックスに依存します。一致のin
句は、誘導型のすべてのインデックスに名前を付けますこれらの名前は、return
句で使用できるバインド変数になります。
ブランチを入力するとき、Coqはインデックスの値を調べ、in
句で宣言された変数にそれらの値を代入します。この一致は1つの分岐のみを持ち、その分岐はインデックスをe
のタイプ(この場合はa
)の2番目の引数と同じにします。したがって、Coqはそのブランチのタイプがa = a
であることを確認しようとします(つまり、x
の代わりにx = a
とa
)。したがって、我々は単にeq_refl : a = a
を提供することができ、我々は完了です。
これで、Coqはすべてのブランチが正しいことを確認したので、return
句のタイプをe
のインデックスがx
に置き換えてマッチ式全体に割り当てます。この変数e
はタイプa = b
であり、インデックスはb
であり、したがって結果のタイプはb = a
です(つまり、x = a
、b
はx
と置き換えられます)。
This answerは、パラメータとインデックスの相違点についてより多くの説明を提供します。
素晴らしい答えをありがとう - これは私にとって非常に啓発的なものでした。 (私はまだupvoteできないと思うけど、もしできれば私はそうするだろう!)ドキュメンテーションのパラメータとインデックスの区別は分かったが、Inductiveの左側に宣言された変数定義。投稿の最後にある[この回答]で強調表示されたリンクでは、再び文書にリンクします。パラメータ/インデックスに関するスタックオーバーフローの答えにリンクすることを意図していましたか? – ConfusedFormalizer
よろしくお願いします!間違ったリンクをごめんね。私はちょうどそれを修正した。 –
私は、 'return'型の注釈の"内部 "と"外部 "の解釈について考えてみましょう。内部解釈はコンストラクタの引数を使って' match'の各枝から返された式の型チェックに使われます。外部の解釈は 'match'への実際の引数を使って' match'式の全体的な結果の型を決定するために使われます。 –