From bbc27e359971307e2cc766f4ef04570e992d720d Mon Sep 17 00:00:00 2001 From: Max New <maxsnew@gmail.com> Date: Wed, 25 Apr 2018 14:11:10 -0400 Subject: [PATCH] add description of additives --- gcbpv.tex | 301 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 248 insertions(+), 53 deletions(-) diff --git a/gcbpv.tex b/gcbpv.tex index f014685..5ed9817 100644 --- a/gcbpv.tex +++ b/gcbpv.tex @@ -1,5 +1,6 @@ \documentclass{article} +\usepackage{float} \usepackage{amsmath,amssymb} \usepackage{tikz-cd} \usepackage{mathpartir} @@ -21,6 +22,8 @@ \newcommand{\ltdynv}{\mathrel{\sqsubseteq_V}} \newcommand{\ltdynt}{\mathrel{\sqsubseteq_T}} +\newcommand{\pair}[2]{\{ \pi \mapsto {#1} \pipe \pi' \mapsto {#2}\}} + \newcommand{\dyn}{{?}} \newcommand{\dynv}{{?}} \newcommand{\dync}{\u {\text{?`}}} @@ -58,7 +61,7 @@ Gradual Call-by-push-value adds an ordering form for each of these judgments: value type dynamism, computation type dynamism, value dynamism, term dynamism and stack dynamism. -\begin{figure} +\begin{figure}[H] \begin{mathpar} A \vtype \and @@ -124,7 +127,7 @@ Additionally, there are rules making each of the orderings into \emph{preorders}: i.e., there are reflexivity and transitivity rules for each. -\begin{figure} +\begin{figure}[H] \begin{mathpar} \inferrule {} @@ -141,10 +144,10 @@ for each. {\Gamma \vdash v[\gamma] : A} \inferrule - {\Phi' \vdash v_1 \ltdyn v_2 : A_1 \ltdyn A_2\and + {\Phi' \vdash v_1 \ltdyn v_2 : A_1 \ltdyn A_2\\ \forall (x_1' \ltdyn x_2' : A_1' \ltdyn A_2' \in \Phi'). \Phi \vdash \gamma_1(x_1') \ltdyn \gamma_2(x_2') : A_1' \ltdyn A_2' } - {\Phi \vdash v_1[\gamma_1] \ltdyn v_2[\gamma_2] : A_1 \ltdyn A_2} + {\Phi \vdash v_1[\gamma_1] \ltdyn v_2[\gamma_2] : A_1 \ltdyn A_2}\\ \inferrule {\gamma : \prod_{x' : A' \in \Gamma'} \Gamma \vdash \cdot : A'\and @@ -153,10 +156,10 @@ for each. {\Gamma \vdash M[\gamma] : \u B} \inferrule - {\Phi' \vdash M_1 \ltdyn M_2 : \u B_1 \ltdyn \u B_2\and + {\Phi' \vdash M_1 \ltdyn M_2 : \u B_1 \ltdyn \u B_2\\ \forall (x_1' \ltdyn x_2' : A_1' \ltdyn A_2' \in \Phi'). \Phi \vdash \gamma_1(x_1') \ltdyn \gamma_2(x_2') : A_1' \ltdyn A_2' } - {\Phi \vdash M_1[\gamma_1] \ltdyn M_2[\gamma_2] : \u B_1 \ltdyn \u B_2} + {\Phi \vdash M_1[\gamma_1] \ltdyn M_2[\gamma_2] : \u B_1 \ltdyn \u B_2}\\ \inferrule {\gamma : \prod_{x' : A' \in \Gamma'} \Gamma \vdash \cdot : A'\and @@ -165,10 +168,10 @@ for each. {\Gamma\pipe \u B \vdash S[\gamma] : \u C} \inferrule - {\Phi'\pipe \hole\ltdyn \hole : \u B_1 \ltdyn \u B_2 \vdash S_1 \ltdyn S_2 : \u C_1 \ltdyn \u C_2\and + {\Phi'\pipe \hole\ltdyn \hole : \u B_1 \ltdyn \u B_2 \vdash S_1 \ltdyn S_2 : \u C_1 \ltdyn \u C_2\\ \forall (x_1' \ltdyn x_2' : A_1' \ltdyn A_2' \in \Phi'). \Phi \vdash \gamma_1(x_1') \ltdyn \gamma_2(x_2') : A_1' \ltdyn A_2' - } - {\Phi \pipe \hole\ltdyn \hole : \u B_1 \ltdyn \u B_2 \vdash S_1[\gamma_1] \ltdyn S_2[\gamma_2] : \u C_1 \ltdyn \u C_2} + } + {\Phi \pipe \hole\ltdyn \hole : \u B_1 \ltdyn \u B_2 \vdash S_1[\gamma_1] \ltdyn S_2[\gamma_2] : \u C_1 \ltdyn \u C_2}\\ \inferrule{}{\Gamma\pipe \hole : \u B \vdash \hole : \u B} @@ -185,7 +188,7 @@ for each. \caption{GCBPV Basic Judgmental Rules 1 (Identities, Substitutions)} \end{figure} -\begin{figure} +\begin{figure}[H] \begin{mathpar} \inferrule {} @@ -282,7 +285,7 @@ be \emph{derived} using the $F,U$ adjoint type constructors, which will both be defined to be \emph{monotone} with respect to type dynamism. -\begin{figure} +\begin{figure}[H] \begin{mathpar} \inferrule {\Gamma \vdash v : A_1 \and A_1 \ltdyn A_2} @@ -344,7 +347,7 @@ theorem that monotone functors preserve representability, so we get that for $\u F$ and $U$ types, we have both an upcast and a downcast from a preordering. -\begin{figure} +\begin{figure}[H] \begin{mathpar} \inferrule {A \vtype} @@ -433,7 +436,7 @@ from a preordering. \caption{Adjunction Constructors (Stoupified) Beta and Eta are presented with and without cuts} \end{figure} -\begin{figure} +\begin{figure}[H] \begin{mathpar} \inferrule {\Gamma, x : A_1 \vdash \upcast {A_1} {A_2} x : A_2} @@ -462,7 +465,7 @@ from a preordering. \caption{Functoriality Preserves Representability (Theorem Statments)} \end{figure} -\begin{figure} +\begin{figure}[H] \begin{mathpar} \inferrule* {\hole \ltdyn \lett x = \hole; \ret x \and @@ -514,8 +517,12 @@ from a preordering. \end{figure} +It seems like the easiest thing to do is have a most dynamic function +type and product type, but I'm not sure if it's really necessary. +% +Explore this in the models. -\begin{figure} +\begin{figure}[H] \begin{mathpar} \inferrule{}{\dynv \vtype} @@ -528,57 +535,193 @@ from a preordering. \caption{Dynamic Types} \end{figure} -\section{Models} +\section{Connectives and Contract Uniqueness Theorems} -A model of gcbpv consists of a preorder-enriched cbpv model with -specified interpretations of $\dynv, \dync$ and the following -precision judgments. Note that we don't need $0 \ltdyn \dynv$ and -$\top \ltdyn \dync$ because those are uniquely determined by the -universal property. +Next we consider the multiplicative and additive connectives of +gradual call-by-push value, and their corresponding contracts. +% +We start with the additives because they are comparatively easier. -\begin{mathpar} - 1 \ltdyn \dynv +\subsection{Additive Connectives: Positive Sum, Negative Product} - \dynv \times \dynv \ltdyn \dynv - - \dynv + \dynv \ltdyn \dynv +First, we introduce the sum type, which is a \emph{value} type +constructor. +% +It has two value constructors $\sigma$ and $\sigma'$ for the left and +right injections. +% +It's universal property is given by case analysis. +% +It should have this universal property \emph{any} time it appears as a +variable, which means that we need case analysis values, computations +and stacks. +% +Having two different, seemingly unrelated forms of pattern matching +looks problematic, but they are not unrelated, we can show that +substituting a value with a pattern match into a term is equivalent to +first lifting the pattern match out of the term and then substituting. +% +This + +\begin{align*} + M[\case v \{ \sigma x \mapsto v_k \pipe \sigma' x' \mapsto v_k' \}/x_+ ] + &= + M[\case y \{ \sigma x \mapsto v_k \pipe \sigma' x' \mapsto v_k' \}/x_+][v/y]\\ + &\equidyn + (\case y \{ \\ &\qquad + \sigma x \mapsto M[\case \sigma x \{ \sigma x \mapsto v_k \pipe \sigma' x' \mapsto v_k' \}/x_+]\\ &\qquad + \pipe \sigma' x' \mapsto M[\case \sigma' x' \{ \sigma x \mapsto v_k \pipe \sigma' x' \mapsto v_k' \}/x_+]\\ &\quad + \})[v/y] \\ + &\equidyn + (\case y \{ \\ &\qquad + \sigma x \mapsto M[v_k /x_+]\\ &\qquad + \pipe \sigma' x' \mapsto M[v_k'/x_+]\\ &\quad + \})[v/y] \\ + &= + \case v \{ \sigma x \mapsto M[v_k/x_+] \pipe \sigma' x' \mapsto M[v_k'/x_+] \} +\end{align*} + +\begin{figure}[H] + \begin{mathpar} + \inferrule + {A \vtype \and A' \vtype} + {A + A' \vtype} + + \inferrule + {A_1 \ltdyn A_2 \and A_1' \ltdyn A_2'} + {A_1 + A_1' \ltdyn A_2 + A_2'}\\ - U \dync \ltdyn \dynv\\ - - \dync \wedge \dync \ltdyn \dync + \inferrule + {\Gamma \vdash v : A} + {\Gamma \vdash \sigma_{A,A'} v : A + A'} - \dynv \to \dync \ltdyn \dync + \inferrule + {\Gamma \vdash v' : A'} + {\Gamma \vdash \sigma'_{A,A'} v' : A + A'} - \u F \dynv \ltdyn \dync -\end{mathpar} + \inferrule + {v_1 \ltdyn v_2 : A_1 \ltdyn A_2 \and A_1' \ltdyn A_2'} + {\sigma v_1 \ltdyn \sigma v_2 : A_1 + A_1' \ltdyn A_2 + A_2'} -Next, we will use poset CBPV as a metalanguage and compile GCBPV into -poset CBPV with recursive types. + \inferrule + {v_1' \ltdyn v_2' : A_1' \ltdyn A_2' \and A_1 \ltdyn A_2} + {\sigma' v_1' \ltdyn \sigma' v_2' : A_1 + A_1' \ltdyn A_2 + A_2'} -\begin{mathpar} - \dynv(X, \u Y) = 1 + (X \times X) + (X + X) + U \u Y + \inferrule + {\Gamma \vdash v : A + A'\and + \Gamma, x:A \vdash v_k : A_3\and + \Gamma, x':A' \vdash v_k' : A_3} + {\Gamma \vdash \case v \{\sigma x \mapsto v_k \pipe \sigma' x' \mapsto v_k'\} : A_3} - \dync(X, \u Y) = (\u Y \wedge \u Y) \wedge (X \to \u Y) \wedge \u F X + \inferrule + {\Phi \vdash v_1 \ltdyn v_2 : A_1 + A_1' \ltdyn A_2 + A_2'\\ + \Phi, x_1\ltdyn x_1:A_1 \ltdyn A_1 \vdash v_{k,1} \ltdyn v_{k,2} : A_3 \ltdyn A_4\\ + \Phi, x_1'\ltdyn x_1':A_1' \ltdyn A_1' \vdash v_{k,1}' \ltdyn v_{k,2}' : A_3 \ltdyn A_4} + {\Phi \vdash \case v_1 \{\sigma x_1 \mapsto v_{k,1} \pipe \sigma' x_1' \mapsto v_{k,1}'\} + \ltdyn \case v_2 \{\sigma x_2 \mapsto v_{k,2} \pipe \sigma' x_2' \mapsto v_{k,2}'\} : A_3 \ltdyn A_4} - \dynv = \mu X. \dynv(X, \u \mu \u Y. \dync(X, \u Y)) - - \dync = \mu \u Y. \dync(\mu X. \dynv(X, \u Y), \u Y) -\end{mathpar} + \inferrule + {\Gamma \vdash v : A + A'\and + \Gamma, x:A\pipe \Delta \vdash M : \u B\and + \Gamma, x':A' \pipe \Delta \vdash M' : \u B} + {\Gamma\pipe \Delta \vdash \case v \{\sigma x \mapsto M \pipe \sigma' x' \mapsto M'\} : \u B} -We call the cases of $\dynv$ the ``tag types'' and abbreviate them $T$ -because they are the tags of the sum, and the cases of the $\dync$ the -``message types'' and abbreviate them $\u M$ because they are the -possible messages of the ``coinductive'' dynamic type. -% -We implement the appropriate casts and their adjoints as follows + \inferrule + {\Phi \vdash v_1 \ltdyn v_2 : A_1 + A_1' \ltdyn A_2 + A_2'\\ + \Phi, x_1\ltdyn x_1:A_1 \ltdyn A_1 \pipe \Psi \vdash M_1 \ltdyn M_2 : \u B_1 \ltdyn \u B_2 \\ + \Phi, x_1'\ltdyn x_1':A_1' \ltdyn A_1'\pipe\Psi \vdash M_1' \ltdyn M_2' : \u B_1 \ltdyn \u B_2} + {\Phi\pipe\Psi \vdash \case v_1 \{\sigma x_1 \mapsto M_1 \pipe \sigma' x_1' \mapsto M_1'\} + \ltdyn \case v_2 \{\sigma x_2 \mapsto M_2 \pipe \sigma' x_2' \mapsto M_2'\} : \u B_1 \ltdyn \u B_2} -\[ \upcast T \dynv x = \roll \sigma_T x \] -\[ \dncast {\u F T} {\u F \dynv} \hole = \lett x = \hole; \case \unroll x \{ \sigma_T y \mapsto y; \sigma_{T'} y \mapsto \err \} \] + \case \sigma v \{ \sigma x \mapsto v_k \pipe \sigma' x' \mapsto v_k' \} \equidyn v_k[v/x]\\ + \case \sigma' v' \{ \sigma x \mapsto v_k \pipe \sigma' x' \mapsto v_k' \} \equidyn v_k'[v'/x']\\ + \case \sigma v \{ \sigma x \mapsto M \pipe \sigma' x' \mapsto M' \} \equidyn M[v/x]\\ + \case \sigma' v' \{ \sigma x \mapsto M \pipe \sigma' x' \mapsto M' \} \equidyn M'[v'/x']\\ -\[ \dncast {\u M} \dync \hole = \pi_{\u M} \u \unroll \hole \] -\[ \upcast {U \u M} {U \dync} x = \u \roll \thunk [ \pi_{\u M} \mapsto \force x; \pi_{\u M'} \mapsto \err ] \] + \inferrule + {x_+ : A + A'} + {v \equidyn \case x_+ \{ \sigma x \mapsto v[\sigma x/x+_] \pipe \sigma' x' \mapsto v[\sigma' x'/x_+] \}} + + \inferrule + {x_+ : A + A'} + {M \equidyn \case x_+ \{ \sigma x \mapsto M[\sigma x/x+_] \pipe \sigma' x' \mapsto M[\sigma' x'/x_+] \}} + \end{mathpar} + \caption{Binary Sum} +\end{figure} + +\begin{figure}[H] + \begin{mathpar} + \inferrule + {B \ctype \and B' \ctype} + {B \wedge B' \ctype} + + \inferrule + {B_1 \ltdyn B_2 \and B_1' \ltdyn B_2'} + {B_1 \wedge B_1' \ltdyn B_2 \wedge B_2'} + + \inferrule + {\Gamma\pipe\Delta \vdash M : \u B\and + \Gamma\pipe\Delta \vdash M' : \u B'} + {\Gamma\pipe \Delta \vdash \pair M {M'} : \u B \wedge \u B'} + + \inferrule + {\Phi\pipe\Psi \vdash M_1 \ltdyn M_2 : \u B_1 \ltdyn \u B_2 \\ + \Phi\pipe\Psi \vdash M_1' \ltdyn M_2' : \u B_1' \ltdyn \u B_2'} + {\Phi\pipe \Psi \vdash \pair {M_1} {M_1'} \ltdyn \pair {M_2} {M_2'} : \u B_1 \wedge \u B_1' \ltdyn \u B_2 \wedge \u B_2'} + + \inferrule + {\Gamma \pipe \Delta \vdash M : \u B \wedge \u B'} + {\Gamma \pipe \Delta \vdash \pi M : \u B} -\begin{figure} + \inferrule + {\Gamma \pipe \Delta \vdash M : \u B \wedge \u B'} + {\Gamma \pipe \Delta \vdash \pi' M : \u B'} + + \inferrule + {\Phi \pipe \Psi \vdash M_1 \ltdyn M_2 : \u B_1 \wedge \u B_1' \ltdyn \u B_2 \wedge \u B_2' + \and \u B_1 \ltdyn \u B_2 \and \u B_1' \ltdyn \u B_2'} + {\Phi \pipe \Psi \vdash \pi M_1 \ltdyn \pi M_2 : \u B_1 \ltdyn \u B_2} + + \inferrule + {\Phi \pipe \Psi \vdash M_1 \ltdyn M_2 : \u B_1 \wedge \u B_1' \ltdyn \u B_2 \wedge \u B_2' + \and \u B_1 \ltdyn \u B_2 \and \u B_1' \ltdyn \u B_2'} + {\Phi \pipe \Psi \vdash \pi' M_1 \ltdyn \pi' M_2 : \u B_1 \ltdyn \u B_2} + + \pi \pair M {M'} \equidyn M\and + \pi' \pair M {M'} \equidyn M'\\ + + \inferrule + {M : \u B \wedge \u B'} + {M \equidyn \pair {\pi M}{\pi' M}} + \end{mathpar} + \caption{Binary Computation Product} +\end{figure} + + + +\begin{figure}[H] + \begin{mathpar} + \upcast{A_1 + A_1'}{A_2 + A_2'} x_{+,1} \equidyn\\ + \case x_{+,1} \{ \sigma x \mapsto \upcast {A_1} {A_2} \pipe \sigma' x' \mapsto \upcast {A_1'} {A_2'} \}\\ + + \dncast{\u F(A_1 + A_1')}{\u F(A_2 + A_2')} \bullet \equidyn \lett x_{+,2} = \bullet; \\ \case x_{+,2} \{ + \sigma x_2 \mapsto \dncast{\u F A_1}{\u F A_2}\ret x_2 + \pipe \sigma' x_2' \mapsto \dncast{\u F A_1'}{\u F A_2'}\ret x_2' + \} + + \dncast{\u B_1 \wedge \u B_1'}{\u B_2 \wedge \u B_2'}\bullet \equidyn \pair {\dncast{\u B_1}{\u B_2}\pi\bullet}{\dncast{\u B_1'}{\u B_2'}\pi'\bullet}\\ + + \upcast{U({\u B_1 \wedge \u B_1'})}{U({\u B_2 \wedge \u B_2'})}x_{\wedge} \equidyn\\ + \pair + {\force \upcast{U \u B_1}{U \u B_2}\thunk \pi\force x_{\wedge}} + {\force \upcast{U \u B_1'}{U \u B_2'}\thunk \pi'\force x_{\wedge}} + \end{mathpar} + \caption{Binary Sum and Binary Computation Product Contract Uniqueness Theorems} +\end{figure} + + + +\begin{figure}[H] \begin{mathpar} \inferrule {A \vtype \and \u B \ctype} @@ -609,7 +752,7 @@ We implement the appropriate casts and their adjoints as follows \caption{Function Type} \end{figure} -\begin{figure} +\begin{figure}[H] \begin{mathpar} \inferrule {} @@ -627,6 +770,58 @@ We implement the appropriate casts and their adjoints as follows \caption{Function Contract Theorem, Proof} \end{figure} + +\section{Models} + +A model of gcbpv consists of a preorder-enriched cbpv model with +specified interpretations of $\dynv, \dync$ and the following +precision judgments. Note that we don't need $0 \ltdyn \dynv$ and +$\top \ltdyn \dync$ because those are uniquely determined by the +universal property. + +\begin{mathpar} + 1 \ltdyn \dynv + + \dynv \times \dynv \ltdyn \dynv + + \dynv + \dynv \ltdyn \dynv + + U \dync \ltdyn \dynv\\ + + \dync \wedge \dync \ltdyn \dync + + \dynv \to \dync \ltdyn \dync + + \u F \dynv \ltdyn \dync +\end{mathpar} + +Next, we will use poset CBPV as a metalanguage and compile GCBPV into +poset CBPV with recursive types. + +\begin{mathpar} + \dynv(X, \u Y) = 1 + (X \times X) + (X + X) + U \u Y + + \dync(X, \u Y) = (\u Y \wedge \u Y) \wedge (X \to \u Y) \wedge \u F X + + \dynv = \mu X. \dynv(X, \u \mu \u Y. \dync(X, \u Y)) + + \dync = \mu \u Y. \dync(\mu X. \dynv(X, \u Y), \u Y) +\end{mathpar} + +We call the cases of $\dynv$ the ``tag types'' and abbreviate them $T$ +because they are the tags of the sum, and the cases of the $\dync$ the +``message types'' and abbreviate them $\u M$ because they are the +possible messages of the ``coinductive'' dynamic type. +% +We implement the appropriate casts and their adjoints as follows + +\[ \upcast T \dynv x = \roll \sigma_T x \] +\[ \dncast {\u F T} {\u F \dynv} \hole = \lett x = \hole; \case \unroll x \{ \sigma_T y \mapsto y; \sigma_{T'} y \mapsto \err \} \] + +\[ \dncast {\u M} \dync \hole = \pi_{\u M} \u \unroll \hole \] +\[ \upcast {U \u M} {U \dync} x = \u \roll \thunk [ \pi_{\u M} \mapsto \force x; \pi_{\u M'} \mapsto \err ] \] + + \end{document} %% Local Variables: -- GitLab