diff --git a/main.tex b/main.tex index 8a0f05a6f6094b4a96cb22faee3f590196e56a93..aa50a98a3380f3de6e5f9b20eb66dbe2ce056109 100644 --- a/main.tex +++ b/main.tex @@ -1,18 +1,24 @@ \documentclass{article} -\usepackage{amsmath,amssymb} +\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}} @@ -76,11 +82,11 @@ \inferrule{x:A \in \Gamma} {\Gamma \vdash^v x : A} - \inferrule{\gamma : \pi_{x:A \in \Gamma} \Delta \vdash \gamma(x) : A\and + \inferrule{\gamma : \prod_{x:A \in \Gamma} \Delta \vdash \gamma(x) : A\and \Gamma \vdash v : B }{\Delta \vdash v[\gamma] : B} - \inferrule{\gamma : \pi_{x:A \in \Gamma} \Delta \vdash \gamma(x) : A\and + \inferrule{\gamma : \prod_{x:A \in \Gamma} \Delta \vdash \gamma(x) : A\and \Gamma \vdash t : B }{\Delta \vdash t[\gamma] : B} @@ -101,6 +107,171 @@ \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}