diff --git a/paper/gtt.tex b/paper/gtt.tex index 88f1abe52c9cd5320bf152469d73840c01e2473b..c0f623fd79e74153a0249d73dbff754a1990e5f2 100644 --- a/paper/gtt.tex +++ b/paper/gtt.tex @@ -152,15 +152,36 @@ \begin{document} \begin{abstract} - We present Gradual Type Theory: an axiomatic semantics of gradual + We present Gradual Type Theory (GTT): an axiomatic semantics of gradual typing. Gradual Type Theory gives specifications to the cast semantics that are normally part of the language definition of gradual typing. - Since it is based on Levy's Call-by-push-value language, it supports - embeddings of call-by-value and call-by-name gradually typed - languages, and proves uniqueness theorems for cast/contracts in - call-by-value and call-by-name languages with both positive and - negative type connectives. + These combine the axiomatics for effectful languages provided by + call-by-push-value with the graduality property that says that + making types more precise in a gradual program only adds errors, and + that casts produce minimal change in program semantics. + The use of call-by-push-value enables us to see distinctions that + were not previously observed in call-by-value gradually typed + languages: chief among them is that while upcasts are known to + always terminate, \emph{downcasts} satisfy a dual property that they + are \emph{linear}. + + Furthermore, We show that the combination of effect-aware + $\beta\eta$ laws and graduality is \emph{only} satsified by + ``wrapping'' implementations of gradual typing, and ``eager'' + semantics violate the $\eta$ principles. + On the other hand the structure of the dynamic type itself, which is + taken for granted to be a sum in previous work, is not uniquely + determined by the axiomatics. + + We give a translation of the axiomatic theory into + call-by-push-value with recursive types and errors. + We define a logical relation that models the logical notion of term + dynamism that is key to interpreting the dynamic gradual guarantee. + Using the rich types of call-by-push-value, we vary the structure of + the dynamic type and produce several translations that all model the + axioms of GTT to varying degrees of support for call-by-value and + call-by-name embeddings. \end{abstract} %% 2012 ACM Computing Classification System (CSS) concepts @@ -463,7 +484,88 @@ 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 +CBN into CBPV for guidance. +% +In both CBV and CBN, we add a type dynamism judgment $A \ltdyn B$ and +for every such pair, we add an upcast from $A$ to $B$: $\ucpast A B M$ +and a downcast from $B$ to $A$: $\dncast A B M$. +% +Then because CBV types are associated to CBPV value types and CBN +types are associated to CBPV computation types, it seems reasonable to +simply have a value type dynamism $A \ltdyn A'$ and computation type +dynamism $\u B \ltdyn \u B'$ and an upcast and downcast form for each +corresponding to the CBV and CBN casts. +% +A CBV terms $x : A \vdash M : A'$ is in CBPV a term $x : A \vdash M : +\u F A'$, because in call by value values are passed as arguments, +then effects are performed and possibly a value is returned. +% +A CBN term $x : \u B \vdash M : \u B'$ is in CBPV a term $x : U \u +B\vdash M : \u B'$, because in CBN unevaluated thunks are passed as +arguments and terms satisfy the $\eta$ laws of the computation type. + +\begin{figure} + \begin{mathpar} + \inferrule + {\Gamma \vdash V : A \and A \ltdyn A'} + {\Gamma \vdash \upcast {A}{A'} V : \u F A'} + + \inferrule + {\Gamma \vdash V' : A' \and A \ltdyn A'} + {\Gamma \vdash \dncast {A}{A'} V' : \u F A} + + \inferrule + {\Gamma \vdash V : U \u B \and \u B \ltdyn \u B'} + {\Gamma \vdash \upcast {\u B}{\u B'} V : \u B'} + + \inferrule + {\Gamma \vdash V' : U \u B' \and \u B \ltdyn \u B'} + {\Gamma \vdash \dncast {\u B}{\u B'} V' : \u B'} + \end{mathpar} + \caption{Na\"ive Interpretation of Casts} + \label{Bad Casts} +\end{figure} + +So to reproduce this in GTT, we could add casts to the language as in +figure \ref{bad-casts}, which we call the ``na\"ive'' interpretation +of casts. +% +We call it na\"ive because it is problematic for multiple reasons: +some syntactic and some semantic. + +First, semantically, it is \emph{insufficient} to recover all of the +known properties of casts in CBV: specifically that in CBV, upcasts +always terminate without performing any effects, and in some systems +upcasts are defined to be values. +% +In previous work on a logical relation for call-by-value gradual +typing, it was possible to prove from the properties we axiomatized +that all upcasts had this property, but this was only because we were +working in a language whose only effects were divergence and error. +% +In a more + +The na\"ive casts are also problemantic syntactically. +% +The first issue is that they violate a type theoretic principle of +\emph{modularity}: + +%% Counterexample + +%% consider a language whose only effects are error and incrementing +%% and decrementing an integer counter. +%% +%% Then for closed programs with unit output, P <= P' when P ->* err +%% or P ->* (n, ()) and P' ->* (n', ()) and n = n', where n,n' are the +%% final counts + +%% Then for every type A, there are CBV coreflections (e(x) = inc; ret x | p(y) = dec; ret y) + +\subsection{Dynamic Type(s)} \subsection{Embedding Call-by-Value} @@ -483,6 +585,19 @@ interpreted as value types in call-by-push-value. \section{Theorems in Gradual Type Theory} +From the axiomatics of Gradual Type Theory, we can derive many +consequences. + +\begin{theorem}{Casts (de)composition} + For any $A \ltdyn A' \ltdyn A''$ and $\u B \ltdyn \ltdyn \u B' \ltdyn \u B''$: + \begin{enumerate} + \item $x \vdash \upcast A A x \equidyn x$ + \item $x \vdash \upcast A {A''}x \equidyn \upcast{A'}{A''}\upcast A{A'} x$ + \item $\bullet \vdash \dncast {\u B}{\u B} \bullet \equidyn \bullet$ + \item $\bullet \vdash \dncast {\u B}{\u B''} \bullet \equidyn \dncast{\u B}{\u B'}\dncast{\u B'}{\u B''} \bullet$ + \end{enumerate} +\end{theorem} + \section{Contract Translation to Call-by-push-value} \subsection{Cast to Contract Translation} @@ -499,6 +614,25 @@ interpreted as value types in call-by-push-value. \paragraph{Casts as Galois Connections} +\paragraph{Thunkable, Linear, Contextual Isomorphisms} + +Our use of complex values for upcasts and complex stacks for downcasts +seems closely related to the use of thunkable isomorphisms and linear +isomorphisms in polarized languages like call-by-push-value and +sequent calculi. +% +Thunkability and linearity are semantic properties that say when terms +are ``essentially'' values and stacks respectively. +% +Levy has proposed a notion of \emph{contextual} isomorphism of types +that in call-by-push-value and other polarized languages correctly +identifies that isomorphisms between value types should be thunkable +and between computation types should be linear. +% +However, a slightly strange property is that in Levy's paper, all +contextual morphisms are isomorphisms so we are not sure how this +relates to our system. + \paragraph{Abstracting Gradual Typing} As mentioned before, our gradual record types are not quite the same @@ -554,7 +688,7 @@ downcasts to (negative) computation types The $\eta$ law for function types, even in the appropriate form for call-by-value is \emph{not} satisfied by so-called \emph{eager} cast -semantics. +semantics, which is what is produced by AGT. % TODO: see the cbn gtt repo. %