Coq menyertakan let-expressions dalam bahasa intinya. Kami dapat menerjemahkan ekspresi let ke aplikasi seperti ini:
let x : t = v in b ~> (\(x:t). b) v
Saya mengerti bahwa ini tidak selalu berfungsi karena nilainya v
tidak akan tersedia saat mengetik pemeriksaan b
. Namun ini dapat dengan mudah diperbaiki oleh casing khusus pengetikan aplikasi jenis (\(x:t). b) v
. Hal ini memungkinkan kami untuk menghapus ekspresi let dengan biaya kasus khusus saat mengetik pemeriksaan. Mengapa Coq termasuk masih menyertakan ekspresi let? Apakah mereka memiliki kelebihan lain (selain tidak memerlukan kasing khusus)?
type-theory
dependent-types
type-checking
coq
Labbekak
sumber
sumber
let
ekspresi, tetapi ada a) tidak ada alasan untuk menghindarilet
ekspresi dan mereka juga nyaman, dan b) menambahkan peretasan ke bahasa inti Anda bukan ide yang bagus.Jawaban:
Ini adalah kesalahpahaman umum bahwa kita dapat menerjemahkan
let
-ekspresi ke aplikasi. Perbedaan antaralet x : t := b in v
dan(fun x : t => v) b
adalah bahwa dalamlet
-ekspresi, selama pengecekan tipev
kita tahu bahwax
sama denganb
, tetapi dalam aplikasi kita tidak (subekspresifun x : t => v
harus masuk akal sendiri).Berikut ini sebuah contoh:
Saran Anda untuk membuat aplikasi
(fun x : t => v) b
kasus khusus tidak benar-benar berfungsi. Mari kita pikirkan lebih hati-hati.Misalnya, bagaimana Anda akan menangani ini, melanjutkan contoh di atas?
Agaknya ini tidak akan berhasil karena
a
tidak bisa diketik, tetapi jika kita membuka definisi, kita mendapatkan ekspresi yang diketik dengan baik. Apakah Anda pikir pengguna akan mencintai kami, atau membenci kami karena keputusan desain kami?e₁ e₂
e₁
Anda juga akan mematahkan teorema dasar yang mengatakan bahwa setiap sub-ekspresi dari ekspresi yang diketik dengan baik diketik dengan baik. Itu masuk akal seperti memperkenalkan
null
ke Jawa.sumber