From 1a8ea28606ee5c11b1e0d1ef25915122a2107838 Mon Sep 17 00:00:00 2001
From: Max New <maxsnew@gmail.com>
Date: Tue, 24 Apr 2018 20:02:33 -0400
Subject: [PATCH] make upcasts uparrows, dncast down, add model stuff, start
 function types

---
 gcbpv.tex | 130 ++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 122 insertions(+), 8 deletions(-)

diff --git a/gcbpv.tex b/gcbpv.tex
index 2d10118..bb8a398 100644
--- a/gcbpv.tex
+++ b/gcbpv.tex
@@ -3,10 +3,12 @@
 \usepackage{amsmath,amssymb}
 \usepackage{tikz-cd}
 \usepackage{mathpartir}
+\usepackage{rotating}
 
 \newtheorem{theorem}{Theorem}
 \newtheorem{definition}{Definition}
 
+
 \newcommand{\vtype}{\,\,\text{val type}}
 \newcommand{\ctype}{\,\,\text{comp type}}
 \newcommand{\ctx}{\,\,\text{ctx}}
@@ -20,8 +22,15 @@
 \newcommand{\ltdynt}{\mathrel{\sqsubseteq_T}}
 
 \newcommand{\dyn}{{?}}
-\newcommand{\upcast}[2]{\langle{#2}\leftarrowtail{#1}\rangle}
-\newcommand{\dncast}[2]{\langle{#1}\twoheadleftarrow{#2}\rangle}
+\newcommand{\dynv}{{?}}
+\newcommand{\dync}{\u {\text{?`}}}
+\newcommand{\uarrow}{\mathrel{\rotatebox[origin=c]{-30}{$\leftarrowtail$}}}
+\newcommand{\darrow}{\mathrel{\rotatebox[origin=c]{30}{$\twoheadleftarrow$}}}
+\newcommand{\upcast}[2]{\langle{#2}\uarrow{#1}\rangle}
+\newcommand{\dncast}[2]{\langle{#1}\darrow{#2}\rangle}
+\newcommand{\err}{\mho}
+\newcommand{\roll}{\text{roll}\,\,}
+\newcommand{\unroll}{\text{unroll}\,\,}
 
 
 \newcommand{\Set}{\text{Set}}
@@ -29,6 +38,7 @@
 \newcommand{\M}{\mathcal{M}}
 \newcommand{\sq}{\square}
 \newcommand{\lett}{\text{let}\,\,}
+\newcommand{\case}{\text{case}\,\,}
 \newcommand{\ret}{\text{ret}\,\,}
 \newcommand{\thunk}{\text{thunk}\,\,}
 \newcommand{\force}{\text{force}\,\,}
@@ -236,12 +246,6 @@ for each.
   \caption{GCBPV Basic Judgmental Rules 2 (Reflexivities, Transitivities)}
 \end{figure}
 
-Errors are least terms at every computation type (not stacks).
-%
-The dynamic type is probably a greatest \emph{value type}.
-%
-Casts are, naturally, the most interesting case.
-%
 A na\"ive attempt to add casts in the style of cbn gradual type theory
 (TODO: cite) would be to add an upcast and downcast \emph{values} for
 every value type dynamism judgment and upcast and downcast
@@ -509,6 +513,116 @@ from a preordering.
   \caption{Functoriality Preserves Representability (Proofs)}
   
 \end{figure}
+
+
+\begin{figure}
+  \begin{mathpar}
+    \inferrule{}{\dynv \vtype}
+
+    \inferrule{}{\dync \ctype}
+
+    \inferrule{A \vtype}{A \ltdyn \dynv}
+
+    \inferrule{\u B \ctype}{\u B \ltdyn \dync}
+  \end{mathpar}
+  \caption{Dynamic Types}
+\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 ] \]
+
+\begin{figure}
+  \inferrule
+  {A \vtype \and \u B \ctype}
+  {A \to \u B \ctype}
+
+  \inferrule
+  {A_1 \ltdyn A_2 \and \u B_1 \ltdyn \u B_2}
+  {A_1 \to \u B_1 \ltdyn A_2 \to \u B_2}
+
+  \inferrule
+  {\Gamma, x : A \pipe \Delta \vdash M : B}
+  {\Gamma \pipe \Delta \vdash \lambda x:A. M : A \to \u B}
+
+  \inferrule
+  {\Phi, x_1 \ltdyn x_2 : A_1 \ltdyn A_2 \pipe \Psi \vdash M_1 \ltdyn M_2 : B_1 \ltdyn B_2}
+  {\Phi \pipe \Psi \vdash \lambda x_1:A_1. M_1 \ltdyn \lambda x_2:A_2. M_2 : A_1 \to \u B_1 \ltdyn A_2 \to \u B_2}
+
+  \inferrule
+  {\Gamma \pipe \Delta \vdash M : A \to \u B\and
+    \Gamma \vdash v : A}
+  {\Gamma \pipe \Delta \vdash M(v) : \u B}
+
+  \inferrule
+  {\Phi \pipe \Psi \vdash M_1 \ltdyn M_2 : A_1 \to \u B_1 \ltdyn A_2 \to \u B_2 \and
+    \Phi \vdash v_1 \ltdyn v_2 : A_1 \ltdyn A_2}
+  {\Phi \pipe \Psi \vdash M_1(v_1) \ltdyn M_2(v_2) : \u B_1 \ltdyn \u B_2}
+  \caption{Function Type}
+\end{figure}
+
+\begin{figure}
+  \inferrule
+  {}
+  {\dncast {A_1 \to \u B_1}{A_2 \to \u B_2} \bullet \equidyn \lambda x:A_1. \dncast {\u B_1}{\u B_2} (\bullet(\upcast {A_1} {A_2}))}
+
+  \inferrule
+  {}
+  {\upcast {U({A_1 \to \u B_1})}{U({A_2 \to \u B_2})} (f : U(A_1 \to \u B_1)) \equidyn
+    \thunk \lambda x_2 : A_2. \force \upcast{U \u B_1}{U \u B_2}(\thunk ((\force f)))
+  }
+
+  
+  
+  \caption{Function Contract Theorem, Proof}
+\end{figure}
+
 \end{document}
 
 %% Local Variables:
-- 
GitLab