From 8fcce4704c5f678d3020000ac29bf36e59ff3d7e Mon Sep 17 00:00:00 2001 From: Max New <maxsnew@gmail.com> Date: Fri, 3 Jan 2020 15:19:15 -0500 Subject: [PATCH] cbv function uniqueness proof --- jfp-paper/jfp-gtt.tex | 141 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 140 insertions(+), 1 deletion(-) diff --git a/jfp-paper/jfp-gtt.tex b/jfp-paper/jfp-gtt.tex index 8665fc9..d66c61c 100644 --- a/jfp-paper/jfp-gtt.tex +++ b/jfp-paper/jfp-gtt.tex @@ -1,5 +1,13 @@ \documentclass{jfp1} +\usepackage{amssymb} +\usepackage{mathpartir} +\usepackage{tikz-cd} +\usepackage{environ} +\usepackage{xcolor} + +\input{defs} + \title{Gradual Type Theory} \author[M.S. New] @@ -25,6 +33,7 @@ \pagerange{\pageref{firstpage}--\pageref{lastpage}} \doi{S0956796801004857} + \newtheorem{lemma}{Lemma}[section] \begin{document} @@ -39,6 +48,136 @@ hi -\label{lastpage} +\section{Call-by-value Gradual Type Theory} + +We now present call-by-value Gradual Type Theory, which axiomatizes +gradual type casts in a call-by-value language. It is based on Moggi's +computational $\lambda$-calculus $\lambda_c$. + +\begin{figure} + \begin{mathpar} + \begin{array}{rl} + A ::= & \colorbox{lightgray}{\dyn} \mid 0 \mid A_1 + A_2 \mid 1 \mid A_1 \times A_2 \mid A_1 \to A_2\\ + + M ::= & \begin{array}{l} + \colorbox{lightgray}{$\upcast{A}{A'} M$} + \colorbox{lightgray}{$\dncast{A} {A'} M$} + \mid x \\ + \mid \err_{A} \\ + \mid \inl{V} \mid \inr{V} \\ + \mid \abort{V} \mid \caseofXthenYelseZ M {x_1. M_1}{x_2.M_2}\\ + \mid () \\ + \mid (V_1,V_2) \\ + \mid \pmpairWtoinZ M N \mid\pmpairWtoXYinZ M x y N \\ + \mid \letXbeYinZ{M}{x}{N}\\ + \mid \lambda x:A.M \mid M\,N\\ + \end{array}\\ + + %% \Gamma ::= & \cdot \mid \Gamma, x : A & + %% \colorbox{lightgray}{$\Phi$} ::= & \colorbox{lightgray}{$\cdot \mid \Phi, x \ltdyn x': A \ltdyn A'$} & + \end{array} + \end{mathpar} + \caption{CBV GTT} +\end{figure} + +\begin{mathpar} + \inferrule + {\Gamma \vdash M : A \and A \ltdyn A'} + {\Gamma \vdash \upcast A {A'} M : A'} + + \inferrule + {\Gamma \vdash M : A' \and A \ltdyn A'} + {\Gamma \vdash \dncast A {A'} M : A} + + \inferrule + {\Phi \vdash M \ltdyn N : A \ltdyn A' \and A' \ltdyn A''} + {\Phi \vdash M \ltdyn \upcast{A'}{A''}N : A \ltdyn A''} + + \inferrule + {\Phi \vdash M \ltdyn N : A \ltdyn A'' \and A \ltdyn A' \ltdyn A''} + {\Phi \vdash \upcast{A}{A'}M \ltdyn N : A' \ltdyn A''} + + \inferrule + {\Phi \vdash M \ltdyn N : A' \ltdyn A'' \and A \ltdyn A'} + {\Phi \vdash \dncast{A}{A'}M \ltdyn N : A \ltdyn A''} + + \inferrule + {\Phi \vdash M \ltdyn N : A \ltdyn A'' \and A \ltdyn A' \ltdyn A''} + {\Phi \vdash M \ltdyn \dncast{A'}{A''}N : A \ltdyn A'} +\end{mathpar} + +Uniqueness Principles Proofs + +\begin{mathpar} + \inferrule + { + \inferrule + { + M \ltdyn \letXbeYinZ M f f \and + \inferrule + { + \inferrule + {f \ltdyn \lambda x:A_1. f x\and + \inferrule + { + \inferrule + { + \inferrule + { + f \ltdyn g, x \ltdyn y \vdash f \ltdyn g\and + \inferrule + {\inferrule + {} + {f \ltdyn g, x \ltdyn y \vdash x \ltdyn y}} + {f \ltdyn g, x \ltdyn y \vdash x \ltdyn (\dncast{A_1}{A_1'}y)} + } + {f \ltdyn g, x \ltdyn y \vdash f x \ltdyn g (\dncast{A_1}{A_1'}y)} + } + {f \ltdyn g, x \ltdyn y \vdash f x \ltdyn \upcast{A_2}{A_2'}(g (\dncast{A_1}{A_1'}y))}} + {f \ltdyn g \vdash \lambda x:A_1. f x \ltdyn {\lambda y:A_1'. \upcast{A_2}{A_2'}(g (\dncast{A_1}{A_1'}y))}}} + {f \ltdyn g \vdash f \ltdyn {\lambda y:A_1'. \upcast{A_2}{A_2'}(g (\dncast{A_1}{A_1'}y))} + }} + {\letXbeYinZ M f f \ltdyn {\letXbeYinZ M g \lambda y:A_1'. \upcast{A_2}{A_2'}(g (\dncast{A_1}{A_1'}y))}}} + {M \ltdyn {\letXbeYinZ M g \lambda y:A_1'. \upcast{A_2}{A_2'}(g (\dncast{A_1}{A_1'}y))} : A_1 \to A_2 \ltdyn A_1' \to A_2'}} + {\upcast {A_1 \to A_2}{A_1' \to A_2'}M \ltdyn {\letXbeYinZ M g \lambda y:A_1'. \upcast{A_2}{A_2'}(g (\dncast{A_1}{A_1'}y))} : A_1' \to A_2'} + + \inferrule + { + \inferrule + { + \inferrule + {M \ltdyn M} + {M \ltdyn {\upcast {A_1 \to A_2}{A_1' \to A_2'}M}} + \and + \inferrule + { + \inferrule + { + \inferrule + { + \inferrule + {g \ltdyn f, y \vdash g \ltdyn f \and + \inferrule + {y \ltdyn y} + {\dncast{A_1}{A_1'}y \ltdyn y}} + {g \ltdyn f, y \vdash g (\dncast{A_1}{A_1'}y) \ltdyn f y}} + {g \ltdyn f, y \vdash \upcast{A_2}{A_2'}(g (\dncast{A_1}{A_1'}y)) \ltdyn f y}} + {g \ltdyn f \vdash \lambda y:A_1'. \upcast{A_2}{A_2'}(g (\dncast{A_1}{A_1'}y)) \ltdyn \lambda y:A_1'. f y} + \and + \lambda y:A_1'. f y \ltdyn f + } + {g \ltdyn f \vdash \lambda y:A_1'. \upcast{A_2}{A_2'}(g (\dncast{A_1}{A_1'}y)) \ltdyn f} + } + {{\letXbeYinZ M g \lambda y:A_1'. \upcast{A_2}{A_2'}(g (\dncast{A_1}{A_1'}y))} \ltdyn + \letXbeYinZ {\upcast {A_1 \to A_2}{A_1' \to A_2'}M} f f} + \and \letXbeYinZ {\upcast {A_1 \to A_2}{A_1' \to A_2'}M} f f \ltdyn {\upcast {A_1 \to A_2}{A_1' \to A_2'}M}} + {{\letXbeYinZ M g \lambda y:A_1'. \upcast{A_2}{A_2'}(g (\dncast{A_1}{A_1'}y))} \ltdyn {\upcast {A_1 \to A_2}{A_1' \to A_2'}M} : A_1' \to A_2'} +\end{mathpar} + +%% \label{lastpage} \end{document} + +%% Local Variables: +%% compile-command: "./latexrun jfp-gtt.tex" +%% End: -- GitLab