Чому Coq включає в себе основні вирази на своїй основній мові


9

Coq включає в себе основні вирази на своїй основній мові. Ми можемо переводити висловлювання Let-вирази в такі програми: let x : t = v in b ~> (\(x:t). b) v Я розумію, що це не завжди працює, оскільки значення vне було б доступним під час перевірки типу b. Однак це можна легко виправити спеціальним кожухом для перевірки типу додатків форми (\(x:t). b) v. Це дозволяє нам видаляти висловлювання let за ціною окремого випадку під час перевірки типу. Чому Coq включає ще включення виразів Let? Чи мають вони інші переваги (окрім того, що не потрібна спеціальна справа)?


4
Ваша пропозиція звучить як додавання хака, щоб уникнути необхідності letвиразів, але немає а) причин уникати letвиразів, і вони також зручні; б) додавання хаків до вашої основної мови - не чудова ідея.
Дерек Елкінс покинув SE

Відповіді:


23

Поширена помилкова думка, що ми можемо переводити let-вираження у додатки. Різниця між let x : t := b in vі (fun x : t => v) bполягає в тому, що в let-expression під час перевірки типів 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.