Skip to content
Snippets Groups Projects
cbvgtt.tex 8 KiB
Newer Older
  • Learn to ignore specific revisions
  • \documentclass{article}
    
    
    \usepackage{amsmath,amssymb,amsthm}
    
    \usepackage{tikz-cd}
    \usepackage{mathpartir}
    
    \newtheorem{theorem}{Theorem}
    
    \newtheorem{corollary}[theorem]{Corollary}
    
    \newtheorem{definition}{Definition}
    
    \newcommand{\type}{\,\,\text{type}}
    \newcommand{\ctx}{\,\,\text{ctx}}
    \newcommand{\ltdyn}{\sqsubseteq}
    
    \newcommand{\gtdyn}{\sqsupseteq}
    \newcommand{\equidyn}{\mathrel{\gtdyn\ltdyn}}
    
    \newcommand{\ltdynv}{\mathrel{\sqsubseteq_V}}
    \newcommand{\ltdynt}{\mathrel{\sqsubseteq_T}}
    
    
    \newcommand{\upcast}[2]{\langle #2 \leftarrowtail #1 \rangle}
    \newcommand{\dncast}[2]{\langle #1 \twoheadleftarrow #2 \rangle}
    
    
    \newcommand{\Set}{\text{Set}}
    \newcommand{\relto}{\to}
    \newcommand{\M}{\mathcal{M}}
    \newcommand{\sq}{\square}
    \newcommand{\lett}{\text{let}\,\,}
    
    Max New's avatar
    Max New committed
    \newcommand{\ret}{\text{ret}\,\,}
    
    
    \begin{document}
    \title{Call-by-value Gradual Type Theory}
    \author{Max S. New, Daniel R. Licata and Amal Ahmed}
    \maketitle
    
    \begin{figure}
      \begin{mathpar}
        A \type \and
        \Gamma \ctx\\
    
        \inferrule
        {A \type \and A' \type}
        {A \ltdynv A'}
    
        \inferrule
        {A \type \and A' \type}
        {A \ltdynt A'}\\
    
        \inferrule
        {\Gamma \ctx \and A \type}
        {\Gamma \vdash^v v : A}
    
        \inferrule
        {\Gamma \ctx \and A \type}
        {\Gamma \vdash^T t : A}\\
    
        \inferrule
        {\Gamma \ctx\and \Gamma' \ctx}
        {\Phi_v : \Gamma \ltdynv \Gamma'}
    
        \inferrule
        {\Gamma \ctx\and \Gamma' \ctx}
        {\Phi_t : \Gamma \ltdyn \Gamma'}\\
    
        \inferrule
        {\Phi_v : \Gamma \ltdyn \Gamma'\and
          \Gamma \vdash^v v : A \and
          \Gamma' \vdash^v v' : A'
        }
        {\Phi_v \vdash^v v \ltdynv v' : A \ltdynv A'}
    
        \inferrule
        {\Phi : \Gamma \ltdyn \Gamma'\and
          \Gamma \vdash^T t : A \and
          \Gamma' \vdash^T t' : A'
        }
        {\Phi \vdash^T t \ltdyn t' : A \ltdyn A'}
      \end{mathpar}
      \caption{GTTv Judgments and their Pressupositions}
    \end{figure}
    
    \begin{figure}
      \begin{mathpar}
        \inferrule{x:A \in \Gamma}
        {\Gamma \vdash^v x : A}
    
    
        \inferrule{\gamma : \prod_{x:A \in \Gamma} \Delta \vdash \gamma(x) : A\and
    
          \Gamma \vdash v : B
        }{\Delta \vdash v[\gamma] : B}
    
    
        \inferrule{\gamma : \prod_{x:A \in \Gamma} \Delta \vdash \gamma(x) : A\and
    
          \Gamma \vdash t : B
        }{\Delta \vdash t[\gamma] : B}
    
        \inferrule{\Gamma \vdash v : A}
        {\Gamma \vdash \ret v : A}
    
        \inferrule{\Gamma \vdash t : A\and \Gamma, x : A \vdash u : B}
        {\Gamma \vdash \lett x = t; u : B}
    
        \lett x = \ret v; t \cong t[v/x]\\
        v[\gamma][\delta] = v[\delta \circ \gamma]\\
        t[\gamma][\delta] = t[\delta \circ \gamma]\
        v[x/x,\ldots] = v\\
        t[x/x,\ldots] = t\\
    
        \lett x = (\lett y = r; s); t \cong \lett y = r; \lett x = s; t\\
      \end{mathpar}
      \caption{GTTv Judgmental Term, Value Rules}
    \end{figure}
    
    
    \begin{mathpar}
      \inferrule
      {}
      {\Phi, x \ltdyn x' : A \ltdyn A' \vdash \ret x \ltdyn \ret x' : A \ltdyn A'}
    
      \inferrule
      {\Phi \vdash t \ltdyn t' : A \ltdyn A'\and
        \Phi, x \ltdyn x' : A \ltdyn A' \vdash u \ltdyn u' : C \ltdyn C'}
      {\Phi \vdash \lett x = t; u \ltdyn \lett x' = t'; u' : C \ltdyn C'}
    \end{mathpar}
    
    \begin{mathpar}
      \inferrule
      {\Gamma \vdash^v v : A \and A \ltdyn A'}
      {\Gamma \vdash^T \upcast{A}{A'}v : A'}
    
      \inferrule
      {\Gamma \vdash^v v : A' \and A \ltdyn A'}
      {\Gamma \vdash^T \dncast{A}{A'}v : A}
    
      \inferrule
      {}
      {x \ltdyn x' : A \ltdyn A' \vdash \upcast{A}{A'}x \ltdyn \ret x' : A'}
    
      \inferrule
      {}
      {x : A \vdash \ret x \ltdyn \upcast{A}{A'}x : A \ltdyn A'}
    
      \inferrule
      {}
      {x \ltdyn x' : A \ltdyn A' \vdash \ret x \ltdyn \dncast{A}{A'}x' : A'}
    
      \inferrule
      {}
      {x' : A' \vdash \dncast{A}{A'}x' \ltdyn x' : A \ltdyn A'}
    \end{mathpar}
    
    \begin{mathpar}
      \inferrule{A \type \and B \type}{A \times B \type}
    
      \inferrule
      {\Gamma \vdash v_1 : A_1 \and \Gamma \vdash v_2 : A_2}
      {\Gamma \vdash^{V} (v_1, v_2) : A_1 \times A_2}
    
      \inferrule
      {\Gamma \vdash t : A_1 \times A_2\and
        \Gamma, x_1 : A_1, x_2 : A_2 \vdash u : C}
      {\Gamma \vdash \lett (x,x') = t; u : C}
      
      \inferrule
      {}
      {x \ltdyn x' : A \ltdyn A', y \ltdyn y' : B \ltdyn B' \vdash \ret (x,y) \ltdyn \ret (x',y') : A \times B \ltdyn A' \times B'}
    
      \inferrule
      {\Phi \vdash t \ltdyn t' : A \times B \ltdyn A' \times B'\and
        \Phi, x \ltdyn x' : A \ltdyn A', y \ltdyn y' : B \ltdyn B' \vdash u \ltdyn u' : C \ltdyn C'}
      {\Phi \vdash \lett (x,y) = t; u \ltdyn \lett (x',y') = t'; u' : C \ltdyn C'}
    
      \inferrule
      {}
      {\Gamma \vdash \lett (x_1,x_2) = (v_1,v_2); t \equidyn t[v_1/x_1,v_2/x_2] : C}
    
      \inferrule
      {}
      {\Gamma \vdash t \equidyn \lett (x_1,x_2) = t; \ret (x_1,x_2) : A_1 \times A_2}
    \end{mathpar}
    
    \begin{theorem}[Product Contract]
      If $A_1 \ltdyn A_1'$ and $A_2 \ltdyn A_2'$ then
    
      \begin{align*}
      x' : A_1' \times A_2' \vdash
      \dncast{A_1\times A_2}{A_1'\times A_2'}x'
      &\equidyn\\
      \lett (x_1', x_2') = x'; \lett y_1 = \dncast{A_1}{A_1'}x_1'; \lett y_2 = \dncast{A_2}{A_2'}x_2'; \ret (y_1,y_2)&\equidyn\\
      \lett (x_1', x_2') = x'; \lett y_2 = \dncast{A_2}{A_2'}x_2'; \lett y_1 = \dncast{A_1}{A_1'}x_1'; \ret (y_1,y_2)\\
      \end{align*}
    \end{theorem}
    \begin{proof}
      First, we show the direction that requires $\eta$ expansion.
      \begin{mathpar}
        \inferrule{}
        {
      \dncast{A_1\times A_2}{A_1'\times A_2'}x'
      \ltdyn
      \lett (x_1', x_2') = x'; \lett y_1 = \dncast{A_1}{A_1'}x_1'; \lett y_2 = \dncast{A_2}{A_2'}x_2'; \ret (y_1,y_2)}
      \end{mathpar}
    
      By the Down-Left rule, it is sufficient to prove that under $x \ltdyn x' : (A_1 \times A_2) \ltdyn (A_1' \times A_2')$,
      \begin{mathpar}
      {x \ltdyn
      \lett (x_1', x_2') = x'; \lett y_1 = \dncast{A_1}{A_1'}x_1'; \lett y_2 = \dncast{A_2}{A_2'}x_2'; \ret (y_1,y_2)}
      \end{mathpar}
    
      By the $\eta$ rule for products and the let-rule for values, $x :
      A_1 \times A_2$ can be expanded as follows:
      \begin{align*}
      x &\equidyn
      \lett (x_1,x_2) = x; \ret (x_1,x_2)\\
      &\equidyn
      \lett (x_1,x_2) = x; \lett y_1 =\ret x_1; \ret (y_1,x_2)\\
      &\equidyn
      \lett (x_1,x_2) = x; \lett y_1 = \ret x_1; \lett y_2 = \ret x_2; \ret (y_1,y_2)
      \end{align*}
    
    Now that we have the two sides with the same structre, we use the
    congruence rules for product pattern matching and we have to use the
    Down-Right rule twice:
    
    \begin{mathpar}
      x_1 \ltdyn x_1' : A_1 \ltdyn A_1' \vdash \ret x_1 \ltdyn \dncast{A_1}{A_1'}{x_1'} : A_1
      
      x_2 \ltdyn x_2' : A_2 \ltdyn A_2' \vdash \ret x_2 \ltdyn \dncast{A_2}{A_2'}{x_2'} : A_2
    \end{mathpar}
    
    Next, we show the reverse inequality using $\eta$ contraction
    
      \begin{mathpar}
        {
          \lett (x_1', x_2') = x'; \lett y_1 = \dncast{A_1}{A_1'}x_1'; \lett y_2 = \dncast{A_2}{A_2'}x_2'; \ret (y_1,y_2)\ltdyn \dncast{A_1\times A_2}{A_1'\times A_2'}x' }
      \end{mathpar}
    
      This time, we need to use congruence \emph{first}, because the
      downcast is on the right, we can't use the Down-Right rule unless
      the left side is already at the less dynamic type.
    
      So we rewrite the right side as
      \begin{align*}
        \dncast{A_1\times A_2}{A_1'\times A_2'}x'
        &\ltdyn
        \lett (x_1',x_2') = x'; \dncast{A_1\times A_2}{A_1'\times A_2'}(x_1',x_2')\\
        &\ltdyn
        \lett (x_1',x_2') = x'; \lett y_1' = x_1'; \dncast{A_1\times A_2}{A_1'\times A_2'}(x_1',x_2')\\
        &\ltdyn
        \lett (x_1',x_2') = x'; \lett y_1' = x_1'; \lett y_2' = x_2'; \dncast{A_1\times A_2}{A_1'\times A_2'}(x_1',x_2')
      \end{align*}
    \end{proof}
    
    Then the proof is again by the congruence rules, using Down-Left twice
    and Down-Right once:
    
    \begin{mathpar}
      x_1' : A_1' \vdash \dncast{A_1}{A_1'}x_1' \ltdyn \ret x_1'
    
      x_2' : A_2' \vdash \dncast{A_2}{A_2'}x_2' \ltdyn \ret x_2'
    
      x_1 \ltdyn x_1', x_2 \ltdyn x_2' \vdash (x_1,x_2) \ltdyn \dncast{A_1\times A_2}{A_1'\times A_2'}(x_1',x_2')
    \end{mathpar}
    
    \begin{corollary}[Projections commute]
     For any $A \ltdyn A', B \ltdyn B'$ and $\Gamma, x:A, y : B \vdash t : C$,
     \[
     \lett x = \dncast{A}{A'}x'; \lett y = \dncast B {B'} y'; t
     \equidyn
     \lett y = \dncast B {B'} y'; \lett x = \dncast{A}{A'}x'; t
     \]
    \end{corollary}
    \begin{proof}
      By the previous theorem, both are equivalent to
      \[
      \lett z = \dncast{A\times B}{A' \times B'}(x',y');
      \lett (x,y) = z;
      t
      \]
    \end{proof}
    
    
    \end{document}
    
    %% Local Variables:
    %% compile-command: "pdflatex main.tex"
    %% End: