PFPL Chapter 6 Type Safety

Please refer this link from page 49 to 54.

Intros

Type safety expresses the coherence between the statics and the dynamics. Statics may be seen as predicting that the value of an expression will have a certain form so that the dynamics of the expression will be well-defined. Thus, evaluation will not get stuck.

The theorem of type safety for E is defined as:

  • (Preservation) If $e : \tau$ and $e \longmapsto e’$, then $e’: \tau$.
  • (Progress) If $e : \tau$ and either $e \text{ val}$ or $\exists e’$ such that $e \longmapsto e’$.

Safety is the conjunction of preservation and progress.

$e \text{ stuck}$ iff $\neg e \text{ val}$ and $\not\exists e’$ such that $e \longmapsto e’$. Based on safety theorem, stuck state is necessarily ill-typed.

Preservation

Theorem

The preservation theorem of E is defined as: If $e : \tau$ and $e \longmapsto e’$, then $e’: \tau$.

For plus, times, cat, len, the proof can be constructed as:

$$
\dfrac{e_0 \longmapsto e_0’}{op(e_0;e_1) \longmapsto op(e_0’;e_1)}\phantom{“”} \dfrac{e_0 \longmapsto e_0’}{op(e_0) \longmapsto op(e_0’)}
$$

With such forms of rules, we assume that $e_0 : \tau$ and $e_1 : \tau$, then $op(e_0;e_1) :\tau$, by induction $e_0’:\tau$.

For let, the proof is constructed as:

$$
\dfrac{}{\text{let}(e; x.e_1)\longmapsto[e/x]e_1}
$$

Assume that $\text{let}(e;x.e_1):\tau$, by inversion of typing lemma in chapter 4, $\Gamma, x:\tau_0 \vdash e_1 : \tau$ and $\Gamma \vdash e : \tau_0$.

By substitution lemma in chapter 4, $[e/x]e_1 : \tau$.

Progress

Progress theorem captures the idea that well-typed programs do not get stuck.

Lemma

Canonical Forms: If $e\text{ val}$ and $e :\tau$, then

  • If $\tau = \text{num}$, then $e = \text{num}[n]$ for some $n$.
  • If $\tau = \text{str}$, then $e = \text{str}[s]$ for some $s$.

Theorem

If $e : \tau$ and either $e \text{ val}$ or $\exists e’$ such that $e \longmapsto e’$.

For plus, times, cat, len, the proof can be constructed as:

$$
\dfrac{e_0 \longmapsto e_0’}{op(e_0;e_1) \longmapsto op(e_0’;e_1)}\phantom{“”} \dfrac{e_0 \longmapsto e_0’}{op(e_0) \longmapsto op(e_0’)}
$$

WLOG we consider binary operator situation:

  • $\exists e_0’​$ that $e_0 \longmapsto e_0’​$, $e_1 \text{ val}​$, then $op(e_0;e_1) \longmapsto op(e_0’;e_1)​$
  • $\exists e_1’$ that $e_1 \longmapsto e_1’$, $e_0 \text{ val}$, then $op(e_0;e_1) \longmapsto op(e_0;e_1’)$
  • $e_0 \text{ val}$ and $e_1 \text{ val}$, then follow instruction rules to become value.
  • $\exists e_0’$ that $e_0 \longmapsto e_0’$, $\exists e_1’$ that $e_1 \longmapsto e_1’$, then $op(e_0;e_1) \longmapsto op(e_0’;e_1’)$

For let, the proof has form

$$
\dfrac{}{\text{let}(e; x.e_1)\longmapsto[e/x]e_1}
$$

  • If $e \longmapsto e’$, then $\text{let}(e;x.e_1) \longmapsto \text{let}(e’;x.e_1)$
  • If $\Gamma , x :\tau \vdash e_1 \longmapsto e_1’$, then $\text{let}(e;x.e_1) \longmapsto \text{let}(e;x.e_1’)$
  • $\text{let}(e;x.e_1) \longmapsto [e/x]e_1$

RTE

Consider the rule
$$
\dfrac{e_1 \text{ : num} \phantom{“”}e_2\text{ : num}}{\text{div}(e_1;e_2)\text{ : num}}
$$
The expression $\text{div}(\text{num[114514]}; \text{num[0]})$ is well-typed but it stuck.

Two (not so practical) options:

  • Enhance the type system to eliminate such error
  • Add dynamic checks so division by zero signals an error

The main idea was to distinguish checked and unchecked errors.

Unchecked errors are errors can be ruled out by type system.

A method for modeling checked errors is inductively define the judgment $e \text{ err}$ stating that $e$ incurs a checked RTE.
$$
\dfrac{e \text { val}}{\text{div}(e;\text{num[0]}) \text{ err}}\\
\dfrac{e_1 \text{ err}}{\text{div}(e_1;e_2)\text{ err}}\\
\dfrac{e_1 \text{ val}\phantom{“”}e_2\text{ err}}{\text{div}(e_1;e_2)\text{ err}}
$$
We can also consider adding an expression error which forcibly induce an error with static
$$
\dfrac{}{\Gamma \vdash \text{error}: \tau}
$$
and dynamics
$$
\dfrac{}{\text{error} \text{ err}}
$$

Improved Type Safety Theorem

Preservative part is not affected.

Progress part is affected since we have to consider err.

If $e : \tau$ and either $e \text{ val}$, $e\text{ err}$ or $\exists e’$ such that $e \longmapsto e’$.