Skip to content
Snippets Groups Projects
denotational-gradual-typing.tex 3.71 KiB
Newer Older
  • Learn to ignore specific revisions
  • \documentclass{article}
    \usepackage{amssymb}
    \usepackage{amsmath}
    \usepackage{amsthm}
    \usepackage{tikz-cd}
    \usepackage{mathpartir}
    \usepackage{stmaryrd}
    
    \newtheorem{theorem}{Theorem}[section]
    \newtheorem{nonnum-theorem}{Theorem}[section]
    \newtheorem{corollary}{Corollary}[section]
    \newtheorem{definition}{Definition}[section]
    \newtheorem{lemma}{Lemma}[section]
    
    \newcommand{\dynv}{\text{Dyn}^+}
    \newcommand{\dync}{\text{Dyn}^-}
    \newcommand{\good}[1]{\text{good}_{#1}}
    \newcommand{\prop}{\mathbb P}
    \newcommand{\with}{\mathrel{\&}}
    \newcommand{\eqv}{\simeq}
    \newcommand{\soln}{\text{Sol}}
    \newcommand{\police}[1]{\text{police}_{#1}}
    \newcommand{\later}{{\blacktriangleright}}
    
    \begin{document}
    
    \title{Gradual Types as Subsets}
    \author{Max S. New}
    
    \maketitle
    
    We fix a predomain $\dynv$ with poset structure and a domain $\dync$
    with bounded below poset structure as solutions to the domain
    equations:
    
    \[ \dynv = 2 + \dync \]
    \[ \dync = (\dynv \to \dync) \with L (\dynv_{\mho}) \]
    
    Q: does this actually get us the right order?
    Q: what domain-theoretic properties does the order have that matter?
    
    There are several ways to define essentially the same interpretation
    of CBV gradually typed lambda calculus with booleans into this
    semantics:
    
    \begin{enumerate}
    \item Types as ((Co-)Kleisli) co-reflections
    \item Types as interior operators
    \end{enumerate}
    
    I want to explore one that I previously dismissed as somewhat na\"ive:
    value types are (well-behaved) subsets of the universal predomain and
    computation types are (well-behaved) quotients of the universal
    domain.
    
    \begin{enumerate}
    \item A value type $A$ is a \emph{policeable} predicate $\good A :
      \dynv \to \prop$
    \item A computation type $B$ is a \emph{envelopable} equivalence
      relation $\eqv B : \text{Equivalence}(\dynv)$
    \end{enumerate}
    
    Let's explain what these mean.
    %
    First, define $\soln A$ to be the set of ``good'' elements of $\dynv$
    according to $A$, i.e., $\{ d : \dynv \,|\, \good A d \}$.
    %
    $\good A$ is \emph{policeable} when there exists a function $\police A
    : \dynv \to (\soln A)_\mho$ satisfying two properties:
    \begin{enumerate}
    \item (monotonicity) $\forall d \sqsubseteq d'. \police A d \sqsubseteq \police A d'$
    \item (retraction) $\forall x \in \soln A. \police A x = \eta x$
    \item (projection) $\forall d \in \dynv. \police d \sqsubseteq \eta d$
    \end{enumerate}
    
    If $\sqsubseteq$ is a poset and $\eta : A \to A_\mho$ is order-reflecting,
    then $\police A$ is uniquely determined by these two properties, for
    if there were another such function $(\police A)'$ we would have
    \[ \]
    
    \subsection{Synthetic Guarded Domain Theory}
    
    We can solve the domain equation using synthetic guarded domain
    theory.
    
    \begin{align*}
      \dynv &= \mu (\lambda D^+. 2 + \mu (\lambda D^-. L (1 + D^+) \times (D^+ \to D^-) ))\\
      \dync &= \mu (\lambda D^-. L (1 + \later \dynv) \times (\later \dynv \to D^-) )
    \end{align*}
    
    unfolding this gives us
    
    \begin{align*}
      \dynv &\cong 2 + \dync \\
      \dync &= L (1 + \later \dynv) \times (\later \dynv \to \later \dync)\\
      &\cong L (1 + \later \dynv) \times \later (\dynv \to \dync)
    \end{align*}
    
    \begin{lemma}{Universal Domain}
      $\dync$ is a domain with algebra
      \[ \theta_\dync = \lambda p: \later \dync. (\pi_1p, ) \]
    \end{lemma}
    
    Let's define orderings.
    \begin{verbatim}
    data _<=_ : Dyn+ -> Dyn+ -> Prop where
      bool : forall b : 2. inl b <= inl b
    
    
    data _<=_ : Dyn- -> Dyn- -> Prop where
    
    err-ord : BinRel a -> BinRel (a + 1)
    err-ord _<=_ (inr *)       y = T
    err-ord _<=_ (inl x) (inl y) = x <= y
    err-ord _<=_ _ _ = _|_
    
    laterr-ord< BinRel a -> BinRel (L (a + 1))
    laterr-ord< _<=_ (done (inr *)) _ = T
    laterr-ord< _<=_ (done (inl *)) _ = T
    
    
    laterr-ord> BinRel a -> BinRel (L (a + 1))
      
    
    err : Dyn-
    err = mu (\e. ((inl (inl *)), \x. e))
    
    
    \end{verbatim}
    
    Let's define
    
    \end{document}