logical relations
This commit is contained in:
parent
3ebd38caad
commit
299da9bef4
1 changed files with 86 additions and 1 deletions
|
@ -7,6 +7,7 @@
|
|||
#let mapstostar = $op(arrow.r.long.bar)^*$
|
||||
#let safe = $"safe"$
|
||||
#let db(x) = $bracket.l.double #x bracket.r.double$
|
||||
#let TODO = text(fill: red)[*TODO*]
|
||||
|
||||
= Mon. Jun 3 \@ 14:00
|
||||
|
||||
|
@ -140,6 +141,8 @@ The property we're interested in is: $safe(e)$
|
|||
|
||||
*Definition (safe).* $safe(e) :equiv forall e' . (e mapstostar e') arrow.r.double isValue(e') or exists e'' . (e' mapsto e'')$
|
||||
|
||||
*Definition (Semantic Type Soundness).* $dot tack.r e : tau$ then $safe(e)$
|
||||
|
||||
Common technique:
|
||||
|
||||
- Focus on the values, when do values belong to the relation, when are they safe?
|
||||
|
@ -155,7 +158,8 @@ The body also needs to be well-typed.
|
|||
|
||||
$
|
||||
V db(tau_1 arrow.r tau_2) = { lambda (x : tau_1) . e | forall v in V db(tau_1) . subst(x, v, e) in Epsilon db(tau_2) } \
|
||||
Epsilon db(tau) = { e | forall e' . e mapstostar e' and "irreducible"(e') arrow.r.double e' in V db(tau)}
|
||||
Epsilon db(tau) = { e | forall e' . e mapstostar e' and "irreducible"(e') arrow.r.double e' in V db(tau)} \
|
||||
"irreducible"(e) :equiv cancel(exists) e' . e mapsto e'
|
||||
$
|
||||
|
||||
#rect[
|
||||
|
@ -163,3 +167,84 @@ $
|
|||
Unsafe code blocks are an example of a something that may not be _syntactically well-formed_, but are still represented by logical relations because they behave the same at the boundary.
|
||||
]
|
||||
|
||||
The difference between semantic soundness with logical relations vs. progress and preservation is that you don't need to prove anything about intermediate states of running programs.
|
||||
|
||||
Can't just work with closed terms because of this rule:
|
||||
|
||||
#tree(
|
||||
axi[$Gamma , x : tau tack.r e : tau_2$],
|
||||
uni[$Gamma tack.r lambda (x : tau_1) . e : tau_1 arrow.r tau_2 $]
|
||||
)
|
||||
|
||||
(Slightly more general theorem)
|
||||
|
||||
#rect(width: 100%)[
|
||||
*Definition (Fundamental property of logical relations).*
|
||||
Theorem we are trying to prove
|
||||
$
|
||||
Gamma tack.r e : tau arrow.r.double Gamma tack.r.double e : tau
|
||||
$
|
||||
- "syntactically well typed means semantically well typed"
|
||||
]
|
||||
|
||||
Focus on terms with open variables
|
||||
|
||||
Use $gamma$ as a substitution from variables to values.
|
||||
|
||||
#rect[$G db(Gamma)$]
|
||||
|
||||
- $G db(dot) = { emptyset }$
|
||||
- $G #db[$Gamma , x : tau$] = { gamma[x mapsto v] | gamma in G db(Gamma) and v in V db(tau)}$
|
||||
|
||||
"sound inputs will give you sound outputs". This is the important case
|
||||
|
||||
Now define semantic soundness:
|
||||
|
||||
$
|
||||
Gamma tack.r.double e : tau :equiv forall (gamma in G db(Gamma)) . gamma(e) in Epsilon db(tau)$
|
||||
|
||||
Prove:
|
||||
|
||||
#set enum(numbering: "a.")
|
||||
|
||||
1. $dot tack.r e : tau arrow.r.double e in Epsilon db(tau)$
|
||||
- this cannot be proved by focusing on closed terms alone
|
||||
- This is why the fundamental property must be used, in the case of $Gamma = dot$, then the substitution $gamma$ is empty and the result is $e in Epsilon db(tau)$
|
||||
2. $e in Epsilon db(tau) arrow.r.double safe(e)$
|
||||
|
||||
#set enum(numbering: "1.")
|
||||
|
||||
To prove A:
|
||||
|
||||
_Proof._ By induction on typing derivations
|
||||
|
||||
-
|
||||
Case example:
|
||||
|
||||
#tree(
|
||||
axi[],
|
||||
uni[$Gamma tack.r "true" : "bool"$]
|
||||
)
|
||||
|
||||
Show $Gamma tack.r.double "true" : "bool"$. Suppose $gamma in G db(Gamma)$.
|
||||
Show $gamma("true") in Epsilon db("bool") equiv "true" in Epsilon db("bool")$.
|
||||
Suffices to show $"true" in V db("bool")$, which is true by definition.
|
||||
|
||||
False is proved similarly.
|
||||
|
||||
-
|
||||
Case example:
|
||||
|
||||
#tree(
|
||||
axi[$Gamma(x) = tau$],
|
||||
uni[$Gamma tack.r x : tau$]
|
||||
)
|
||||
|
||||
Show $Gamma tack.r.double x : tau$. #TODO
|
||||
|
||||
To prove B:
|
||||
|
||||
_Proof._ Suppose $e'$ s.t. $e mapstostar e'$ .
|
||||
|
||||
- Case : $not "irreducible" (e')$ then $exists e'' . e' mapsto e''$
|
||||
- Case : $"irreducible" (e')$ then $isValue(e')$ trivially.
|
Loading…
Reference in a new issue