diff --git a/ahmed/notes.typ b/ahmed/notes.typ index 3ddb34f..4907147 100644 --- a/ahmed/notes.typ +++ b/ahmed/notes.typ @@ -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. \ No newline at end of file