Coq neden ana dillerinde let-ifadeleri içeriyor?


9

Coq, temel dilinde let-ifadeleri içerir. Let-ifadelerini aşağıdaki gibi uygulamalara çevirebiliriz: let x : t = v in b ~> (\(x:t). b) v Bunun her zaman işe yaramadığını anlıyorum çünkü vdaktilo kontrol ederken değer kullanılamayacaktı b. Bununla birlikte, bu, formun uygulamalarının daktilo kontrolüyle özel bir muhafaza ile kolayca sabitlenebilir (\(x:t). b) v. Bu, yazım denetimi sırasında özel bir durum pahasına izin ifadelerini kaldırmamızı sağlar. Coq neden izin ifadeleri içeriyor? Başka avantajları var mı (özel duruma ihtiyaç duymanın yanı sıra)?


4
Öneriniz letifadelere ihtiyaç duymamak için bir saldırı eklemek gibi geliyor , ancak a) ifadelerden kaçınmak için bir neden yok letve bunlar da kullanışlı ve b) ana dilinize kesmek eklemek harika bir fikir değil.
Derek Elkins SE

Yanıtlar:


23

let-Eğerleri uygulamalara çevirebileceğimiz yaygın bir yanlış anlamadır . Arasındaki fark let x : t := b in vve (fun x : t => v) biçinde olmasıdır letarasında -Anlatım sırasında tip denetimi vbunu biliyoruz xeşittir b, ama uygulamada biz (alt ifade yok fun x : t => vkendi başına mantıklı olmalı).

İşte bir örnek:

(* 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).

Uygulamayı (fun x : t => v) bözel bir durum haline getirme öneriniz gerçekten işe yaramıyor. Daha dikkatli düşünelim.

Örneğin, yukarıdaki örneğe devam ederek bununla nasıl başa çıkacaksınız?

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

Muhtemelen bu işe yaramayacaktır çünkü ayazılamaz, ancak tanımını açarsak iyi yazılmış bir ifade alırız. Kullanıcıların tasarım kararımız için bizi seveceğini veya nefret edeceğini düşünüyor musunuz?

"Özel durum" a sahip olmanın ne anlama geldiğini dikkatlice düşünmelisiniz. Bir başvurum varsa, başvurunun geçerli olup olmadığına karar vermeden önce e₁ e₂normalleştirmem gerekir e₁mi?λ-soyutlama? Evet ise, bu, kötü yazılmış ifadeleri normalleştireceğim anlamına gelir ve bunlar döngü yapabilir. Hayır ise, teklifinizin kullanılabilirliği şüpheli görünüyor.

Ayrıca, iyi yazılmış bir ifadenin her alt ifadesinin iyi yazıldığını söyleyen temel teoremi de kırarsınız. Bu null, Java'yı tanıtmak kadar mantıklı .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.