Coqにlet表現がコア言語で含まれているのはなぜですか


9

Coqには、コア言語のlet式が含まれています。let式を次のようなアプリケーションに変換できます。タイプ チェック時にlet x : t = v in b ~> (\(x:t). b) vvを使用できないため、これが常に機能するとは限りませんb。ただし、これは、フォームのアプリケーションのタイプチェックを特別なケーシングで簡単に修正できます(\(x:t). b) v。これにより、タイプチェック中に特殊なケースを犠牲にしてlet式を削除できます。Coqインクルードにlet式がまだ含まれているのはなぜですか?それらには他の利点がありますか(特別なケースを必要としない以外に)?


4
あなたの提案はlet、式を必要としないようにハックを追加するように聞こえますが、a)let式を避ける理由はなく、それらも便利です。b)コア言語にハックを追加することは素晴らしいアイデアではありません。
Derek Elkinsが

回答:


23

let式をアプリケーションに変換できるというのはよくある誤解です。との違いはlet x : t := b in v、-式(fun x : t => v) bではlet、型チェック時にがに等しいvことxがわかってbいますが、アプリケーションではそうではありません(部分式fun x : t => vはそれ自体で意味を持つ必要があります)。

次に例を示します。

(* Dependent type of vectors. *)
Inductive Vector {A : Type} : nat -> Type :=
  | nil : Vector 0
  | cons : forall n, A -> Vector n -> Vector (S n).

(* This works. *)
Check (let n := 0 in cons n 42 nil).

(* This fails. *)
Check ((fun (n : nat) => cons n 42 nil) 0).

アプリケーション(fun x : t => v) bを特別なケースにするというあなたの提案は実際には機能しません。それについてもっと注意深く考えてみましょう。

たとえば、上記の例を続けて、これにどのように対処しますか?

Definition a := (fun (n : nat) => cons n 42 nil).
Check a 0.

a型付けできないため、おそらくこれは機能しませんが、その定義を展開すると、適切に型付けされた式が得られます。ユーザーは私たちを愛していると思いますか、それとも私たちのデザイン決定を嫌っていますか?

e₁ e₂e₁λ

また、型付けされた式のすべての部分式は型付けされているという基本的な定理を破ります。これはnull、Javaに導入するのと同じくらい賢明です。

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