Coq inclut des let-expressions dans son langage principal. Nous pouvons traduire des expressions let dans des applications comme celle-ci:
let x : t = v in b ~> (\(x:t). b) v
je comprends que cela ne fonctionne pas toujours car la valeur v
ne serait pas disponible lors de la vérification de frappe b
. Cependant, cela peut être facilement résolu par un boîtier spécial pour la vérification typographique des applications du formulaire (\(x:t). b) v
. Cela nous permet de supprimer les expressions let au prix d'un cas spécial lors de la vérification de la typographie. Pourquoi Coq comprend-il toujours des let-expressions? Ont-ils d'autres avantages (en plus de ne pas avoir besoin du cas spécial)?
type-theory
dependent-types
type-checking
coq
Labbekak
la source
la source
let
expressions, mais il n'y a pas de raison d'éviter leslet
expressions et elles sont également pratiques, et b) l'ajout de hacks à votre langage de base n'est pas une bonne idée.Réponses:
C'est une idée fausse commune que nous pouvons traduire
let
-expresions en applications. La différence entrelet x : t := b in v
et(fun x : t => v) b
est que dans l'let
expression-, pendant la vérification de type dev
nous savons quex
est égal àb
, mais dans l'application nous ne le faisons pas (la sous-expressionfun x : t => v
doit avoir un sens par elle-même).Voici un exemple:
Votre suggestion de faire de l'application
(fun x : t => v) b
un cas spécial ne fonctionne pas vraiment. Réfléchissons-y plus attentivement.Par exemple, comment traiteriez-vous cela, en continuant l'exemple ci-dessus?
Vraisemblablement, cela ne fonctionnera pas car
a
ne peut pas être tapé, mais si nous déplions sa définition, nous obtenons une expression bien typée. Pensez-vous que les utilisateurs vont nous aimer ou nous détester pour notre décision de conception?Vous devez réfléchir soigneusement à ce que signifie avoir le "cas spécial". Si j'ai une applicationλ
e₁ e₂
, dois-je normalisere₁
avant de décider s'il s'agit d'une -abstraction? Si oui, cela signifie que je normaliserai les expressions mal typées, et celles-ci pourraient tourner. Si non, l'utilisabilité de votre proposition semble discutable.Vous briseriez également le théorème fondamental qui dit que chaque sous-expression d'une expression bien typée est bien typée. C'est aussi sensé que d'introduire
null
dans Java.la source