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 mapstostar = $op(arrow.r.long.bar)^*$
|
||||||
#let safe = $"safe"$
|
#let safe = $"safe"$
|
||||||
#let db(x) = $bracket.l.double #x bracket.r.double$
|
#let db(x) = $bracket.l.double #x bracket.r.double$
|
||||||
|
#let TODO = text(fill: red)[*TODO*]
|
||||||
|
|
||||||
= Mon. Jun 3 \@ 14:00
|
= 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 (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:
|
Common technique:
|
||||||
|
|
||||||
- Focus on the values, when do values belong to the relation, when are they safe?
|
- 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) } \
|
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[
|
#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.
|
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