Coq enthält Let-Ausdrücke in seiner Kernsprache. Wir können let-Ausdrücke in Anwendungen wie diese übersetzen:
let x : t = v in b ~> (\(x:t). b) v
Ich verstehe, dass dies nicht immer funktioniert, da der Wert v
beim Typchecking nicht verfügbar wäre b
. Dies kann jedoch leicht durch ein spezielles Gehäuse behoben werden, das die Typprüfung von Anwendungen des Formulars ermöglicht (\(x:t). b) v
. Dies ermöglicht es uns, let-Ausdrücke auf Kosten eines Sonderfalls während der Tippprüfung zu entfernen. Warum enthält Coq include immer noch let-Ausdrücke? Haben sie andere Vorteile (außer dass sie den Sonderfall nicht benötigen)?
type-theory
dependent-types
type-checking
coq
Labbekak
quelle
quelle
let
Ausdrücke benötigt werden, aber es gibt a) keinen Grund,let
Ausdrücke zu vermeiden , und sie sind auch praktisch, und b) das Hinzufügen von Hacks zu Ihrer Kernsprache ist keine gute Idee.Antworten:
Es ist ein weit verbreitetes Missverständnis, dass wir
let
Ausdrücke in Anwendungen übersetzen können. Der Unterschied zwischenlet x : t := b in v
und(fun x : t => v) b
besteht darin, dass wir imlet
Ausdruck während der Typprüfungv
wissen, dass diesx
gleichb
ist, in der Anwendung jedoch nicht (der Unterausdruckfun x : t => v
muss für sich genommen Sinn machen).Hier ist ein Beispiel:
Ihr Vorschlag, die Bewerbung zu
(fun x : t => v) b
einem Sonderfall zu machen, funktioniert nicht wirklich. Lassen Sie uns genauer darüber nachdenken.Wie würden Sie zum Beispiel damit umgehen und das obige Beispiel fortsetzen?
Vermutlich funktioniert dies nicht, weil
a
es nicht eingegeben werden kann, aber wenn wir seine Definition entfalten, erhalten wir einen gut typisierten Ausdruck. Glauben Sie, dass die Benutzer uns lieben oder für unsere Designentscheidung hassen werden?e₁ e₂
e₁
Sie würden auch den Grundsatz brechen, der besagt, dass jeder Unterausdruck eines gut typisierten Ausdrucks gut typisiert ist. Das ist genauso sinnvoll wie die Einführung
null
in Java.quelle