diff --git a/paper/gtt.tex b/paper/gtt.tex index e6d7de59c7fdc18893cbbc158250dd80b1c691bd..fdc75d651b0629ab523988d619a4e6a406865843 100644 --- a/paper/gtt.tex +++ b/paper/gtt.tex @@ -198,6 +198,7 @@ \newcommand{\too}{\kw{to}} \newcommand{\case}{\kw{case}} \newcommand{\kw}[1]{\texttt{#1}\,\,} +\newcommand{\absurd}{\kw{absurd}} \newcommand{\caseofXthenYelseZ}[3]{\case #1 \{ #2 \pipe #3 \}} \newcommand{\pmpairWtoXYinZ}[4]{\kw{split} #1\,\kw{to} (#2,#3). #4} \newcommand{\pmmuXtoYinZ}[3]{\kw{unroll} #1 \,\kw{to} \roll #2. #3} @@ -207,6 +208,13 @@ \newcommand{\abort}{\kw {abort}} \newcommand{\with}{\mathbin{\&}} +\newcommand{\bnfalt}{\mathrel{\bf \,\mid\,}} +\newcommand{\alt}{\bnfalt} +\newcommand{\bnfdef}{\mathrel{\bf ::=}} +\newcommand{\bnfadd}{\mathrel{\bf +::=}} +\newcommand{\bnfsub}{\mathrel{\bf -::=}} + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} @@ -616,8 +624,6 @@ Generalizing further, a stack out of an iterated function type $A_1 \subsection{Casts} - - It is not immediately obvious how to add type casts to call-by-push-value, but we can use previous work on call-by-value and call-by-name gradual typing, combined with the embeddings of CBV and @@ -706,6 +712,35 @@ TODO: do we actually know what would go wrong in that case? %% Then for every type A, there are CBV coreflections (e(x) = inc; ret x | p(y) = dec; ret y) +\begin{figure} + \begin{mathpar} + \inferrule + {\Gamma \vdash V : A \and A \ltdyn A'} + {\Gamma \vdash \upcast A {A'} V : A'} + + \inferrule + {} + {x : A \vdash x \ltdyn \upcast A {A'} x : A \ltdyn A'} + + \inferrule + {} + {x \ltdyn x' : A \ltdyn A' \vdash \upcast A {A'} x \ltdyn x' : A'} + + \inferrule + {\Gamma\pipe \Delta \vdash M : \u B' \and \u B \ltdyn \u B'} + {\Gamma\pipe \Delta \vdash \dncast{\u B}{\u B'} M : \u B} + + \inferrule + {} + {\bullet : \u B' \vdash \dncast{\u B}{\u B'} \bullet \ltdyn \bullet : \u B \ltdyn \u B'} + + \inferrule + {} + {\bullet \ltdyn \bullet : \u B \ltdyn \u B' \vdash \bullet \ltdyn \dncast{\u B}{\u B'} \bullet : \u B} + \end{mathpar} + \caption{Casts in GTT} +\end{figure} + \subsection{Dynamic Type(s)} \subsection{Embedding Call-by-Value} @@ -723,6 +758,57 @@ The key feature of call-by-value is that all of its types are interpreted as value types in call-by-push-value. % +\begin{figure} + \begin{mathpar} + \begin{array}{lrcl} + \text{Types} & A & \bnfdef & 1 \alt (A + A) \alt (A \times A) \alt (A_1,\ldots,A_n) \to A\\ + \text{Values} & V & \bnfdef & \upcast{A}{A'}V \alt () \alt \inl V \alt \inr V \alt (V,V) \alt \lambda (x_1:A_1,\ldots,x_n:A_n). M\\ + \text{Terms} & M & \bnfdef & \err V \alt \alt \dncast{A}{A'}V \alt \caseofXthenYelseZ V {\inl x_1. M_1}{\inr x_2. M_2} \alt \pmpairWtoXYinZ V x y M \alt V(V_1,\ldots,V_n) \alt \bindXtoYinZ M x M \alt \letXbeYinZ V x M + \end{array} + \end{mathpar} + + \begin{mathpar} + \inferrule + {\Gamma \vdash V : A \and A \ltdyn A'} + {\Gamma \vdash \upcast A {A'} V : A'} + + \inferrule + {\Gamma \vdash V : A' \and A \ltdyn A'} + {\Gamma \vdash \dncast A {A'} V : A} + + \inferrule + {} + {x : A' \vdash \dncast A A' x \ltdyn x : A \ltdyn A'} + + \inferrule + {} + {x \ltdyn x' : A \ltdyn A' \vdash x \ltdyn \dncast A {A'} x : A} + \end{mathpar} + \caption{CBV GTT} +\end{figure} + +\begin{figure} + \begin{mathpar} + \inferrule + {A \ltdyn A' \and B \ltdyn B'} + {f : A \to B \vdash \dncast{A\to B}{A' \to B'} f \equidyn \lambda (x:A). \bindXtoYinZ {f(\upcast{A}{A'}x)} y \dncast{B}{B'} y} + + \inferrule + { + f \ltdyn \lambda (x:A). \bindXtoYinZ {f(x)} y y + \and + \inferrule + {\inferrule + {\inferrule{f \ltdyn f'\and x \ltdyn \upcast{A}{A'}x}{{f(x)} \ltdyn f'(\upcast{A}{A'}x)} \and {y \ltdyn y' \vdash y \ltdyn \dncast{B}{B'} y}} + {x \ltdyn x : A \vdash \bindXtoYinZ {f(x)} y y \ltdyn \bindXtoYinZ {f'(\upcast{A}{A'}x)} y' \dncast{B}{B'} y} + } + {\lambda (x:A). \bindXtoYinZ {f(x)} y y \ltdyn \lambda (x:A). \bindXtoYinZ {f'(\upcast{A}{A'}x)} y' \dncast{B}{B'} y} + } + {f \ltdyn f' : A \to B \ltdyn A' \to B' + \vdash f \ltdyn \lambda (x:A). \bindXtoYinZ {f'(\upcast{A}{A'}x)} y' \dncast{B}{B'} y'} + \end{mathpar} + \caption{Uniqueness Principle for CBV Functions} +\end{figure} \section{Theorems in Gradual Type Theory} @@ -743,7 +829,23 @@ Gradual Type Theory. \subsection{Upcasts are Thunkable, Downcasts are Linear, a posteriori} -While we have shown +\begin{theorem}{Upcasts are (Complex) Values, Downcasts are (Complex) Stacks} + If the tagging upcasts are complex values and untagging downcasts + are stacks, then all upcasts are complex values and all downcasts + are complex stacks. +\end{theorem} +\begin{proof} + +\end{proof} + +\subsection{Retract Axiom} + +In the call-by-name version of GTT (\cite{GTT}), there was an explicit +axiom that states that every pair of upcasts and downcasts forms a +section-retraction pair: i.e., that the downcast applied to the upcast +is the identity. +% + \subsection{Uniqueness Principles for Casts} @@ -754,11 +856,95 @@ principles of each type, given in figure TODO ref. \begin{figure} \begin{mathpar} - TODO + \upcast{0}{A}V \equidyn \absurd V\\ + \dncast{\u F 0}{\u F A} \equidyn \err\\ + + \dncast{1}{\u B} \equidyn \{\}\\ + \upcast{U 1}{U \u B} \equidyn \thunk \err\\ \end{mathpar} \caption{Uniqueness Principles for Casts} \end{figure} +To prove these uniqueness theorems, we use the fact that the +specification of upcasts and downcasts by their right and left +$\ltdyn$ rules defines them \emph{uniquely} up to $\equidyn$. +% +In category-theoretic terms this says that the upcasts and downcasts +have a \emph{universal property}, and so we can show that something +else is equivalent to the upcast or downcast by showing that it has +the \emph{same} property. +% + +\begin{lemma}{Specification for Casts is a Universal Property} + If $A \ltdyn A'$ and $x : A \vdash V_u[x] : A'$ is a value such that + the following judgments are provable: + \begin{mathpar} + \inferrule + {} + {x : A \ltdyn x' : A' \vdash V_u[x] \ltdyn x' : A'} + + \inferrule + {} + {x_2 : A \ltdyn x : A \vdash x_2 \ltdyn V_u[x] : A \ltdyn A'} + \end{mathpar} + + then we can prove $x : A \vdash V_u[x] \equidyn x : A$. + + Similarly, if $\u B \ltdyn \u B'$ and $\bullet : \u B' \vdash S_d : + \u B$ is a stack such that the following are provable: + \begin{mathpar} + \inferrule + {} + {\bullet \ltdyn \bullet : \u B' \vdash S_d \ltdyn \bullet : \u B \ltdyn \u B'} + + \inferrule + {} + {\bullet \ltdyn \bullet : \u B \ltdyn \u B' \vdash \bullet \ltdyn S_d : \u B} + \end{mathpar} + then we can prove $\bullet : \u B' \vdash S_d \equidyn \dncast{\u B}{\u B'}\bullet : \u B$ +\end{lemma} +\begin{proof} + \begin{mathpar} + \inferrule*[right=substitution] + {x_1 \ltdyn x_2 \vdash x_1 \ltdyn \upcast{A}{A'}x_2 : A \ltdyn A' \and x_1 \ltdyn x_2' : A \ltdyn A' \vdash V_u[x_1] \ltdyn x_2' : A'} + {x_1 : A \ltdyn x_2 : A \vdash V_u[x_1] \ltdyn \upcast{A}{A'} x_2 : A'} + \end{mathpar} + The other direction is essentially the same, but swapping $V_u$ and + the upcast. +\end{proof} + +The other key ingredient to the uniqueness theorems is the +\emph{$\eta$ principle} and \emph{congruence rules} for each type. +% +The reason for this is that to show that an implementation of a cast +$x : A \vdash V_u : A'$ is correct, we have to show that it is less +than and greater than \emph{variables}: $x : A \ltdyn V_u[x]$ and $x +\ltdyn x' \vdash V_u[x] \ltdyn x'$. +% +Since we know nothing about a variable except it's type, the only way +to proceed is to $\eta$ expand it. +% +The uniqueness principles for casts arise when the two sides of the +cast have the \emph{same} top-level connective, and thus the +\emph{same} $\eta$ principle, so we $\eta$ expand both the lower +bounding and upper bounding variable, and the cast itself is a kind of +$\eta$-expansion \emph{up to cast at smaller type}. + +% TODO: can we take advantage of duality??? +%% With the large number of connectives comes a large number of proofs. +%% % +%% For each connective, we need four proofs: left and right rules for the +%% upcast and left and right rules for the downcast. +%% % +%% However, we can take advantage of the duality between upcasts and +%% downcasts and the duality between $\ltdyn$ and $\gtdyn$ to save some +%% effort, so that if we constrain our proof, we can mechanically turn a +%% single case, say the left rule for upcast into proofs of the other 3 +%% cases. +%% % +%% In order for this duality to be \emph{perfect}, we use the version of +%% casts that are \emph{not} assumed to be + \section{Contract Translation to Call-by-push-value} To show the soundness of our model, and demonstrate its relationship