Coq inclui let-expression em sua linguagem principal. Podemos traduzir expressões let para aplicativos como este:
let x : t = v in b ~> (\(x:t). b) v
Entendo que isso nem sempre funciona porque o valor v
não estaria disponível ao digitar b
. No entanto, isso pode ser facilmente corrigido através de um revestimento especial na verificação de tipos de aplicativos do formulário (\(x:t). b) v
. Isso nos permite remover expressões let ao custo de um caso especial durante a digitação. Por que Coq include ainda inclui let-expression? Eles têm outras vantagens (além de não precisar do caso especial)?
type-theory
dependent-types
type-checking
coq
Labbekak
fonte
fonte
let
expressões, mas não há motivo para evitarlet
expressões e elas também são convenientes eb) adicionar hacks à sua linguagem principal não é uma boa idéia.Respostas:
É um equívoco comum que possamos converter
let
expressões -ex em aplicativos. A diferença entrelet x : t := b in v
e(fun x : t => v) b
é que nalet
expressão-, durante a verificação de tipov
, sabemos quex
é igual ab
, mas na aplicação, não (a subexpressãofun x : t => v
deve fazer sentido por si só).Aqui está um exemplo:
Sua sugestão para tornar a aplicação
(fun x : t => v) b
um caso especial não funciona realmente. Vamos pensar sobre isso com mais cuidado.Por exemplo, como você lidaria com isso, continuando o exemplo acima?
Presumivelmente, isso não funcionará porque
a
não pode ser digitado, mas se desdobrarmos sua definição, obteremos uma expressão bem digitada. Você acha que os usuários vão nos amar ou nos odiar por nossa decisão de design?e₁ e₂
e₁
Você também quebraria o teorema fundamental que diz que toda sub-expressão de uma expressão bem digitada é bem digitada. Isso é tão sensato quanto a introdução
null
ao Java.fonte