diff --git a/paper-new/semantics.tex b/paper-new/semantics.tex index 441bdd844c0aca9016dade473ac212ae0ed42626..2ea59d0de90e3533c681a0792030511e9ae187a2 100644 --- a/paper-new/semantics.tex +++ b/paper-new/semantics.tex @@ -12,15 +12,15 @@ the construction of the monad and the dynamic type. \section{Domain-Theoretic Constructions}\label{sec:domain-theory} In this section, we discuss the fundamental objects of the model into which we will embed -the intensional lambda calculus and inequational theory. It is important to remember that +the step-sensitive lambda calculus $\intlc$ and inequational theory. It is important to remember that the constructions in this section are entirely independent of the syntax described in the previous section; the notions defined here exist in their own right as purely mathematical -constructs. In the next section, we will link the syntax and semantics via an interpretation +constructs. In the next section, we will link the syntax and semantics via a semantic interpretation function. \subsection{The Lift Monad} -When thinking about how to model intensional gradually-typed programs, we must consider +When thinking about how to model intensional gradually-typed programs, we should consider their possible behaviors. On the one hand, we have \emph{failure}: a program may fail at run-time because of a type error. In addition to this, a program may ``think'', i.e., take a step of computation. If a program thinks forever, then it never returns a value, @@ -42,7 +42,7 @@ the \emph{lift monad}, as the following datatype: \end{align*} Unless otherwise mentioned, all constructs involving $\later$ or $\fix$ -are understood to be with repsect to a fixed clock $k$. So for the above, we really have for each +are understood to be with respect to a fixed clock $k$. So for the above, we really have for each clock $k$ a type $\li^k A$ with respect to that clock. Formally, the lift monad $\li A$ is defined as the solution to the guarded recursive type equation @@ -56,7 +56,7 @@ Notice there is a computation $\fix \theta$ of type $\li A$. This represents a c that thinks forever and never returns a value. Since we claimed that $\li A$ is a monad, we need to define the monadic operations -and show that they repect the monadic laws. The return is just $\eta$, and extend +and show that they respect the monadic laws. The return is just $\eta$, and extend is defined via by guarded recursion by cases on the input. % It is instructive to give at least one example of a use of guarded recursion, so % we show below how to define extend: @@ -65,12 +65,17 @@ is defined via by guarded recursion by cases on the input. % Verifying that the monadic laws hold requires \lob-induction and is straightforward. +\begin{comment} +% Since this mentions the ordering on B, it should be introduced after introducing predomains. The lift monad has the following universal property. Let $f$ be a function from $A$ to $B$, where $B$ is a $\later$-algebra, i.e., there is $\theta_B \colon \later B \to B$. -Further suppose that $B$ is also an ``error-algebra'', that is, an algebra of the -constant functor $1 \colon \text{Type} \to \text{Type}$ mapping all types to Unit. -This latter statement amounts to saying that there is a map $\text{Unit} \to B$, so $B$ has a -distinguished ``error element" $\mho_B \colon B$. +Further suppose that $B$ is also an ``error-algebra'', that is, there is an error element +$\mho_B$ such that $\mho_B \le_B y$ for all $y \in B$. + +% Further suppose that $B$ is also an algebra of the +% constant functor $1 \colon \text{Type} \to \text{Type}$ mapping all types to Unit. +% This latter statement amounts to saying that there is a map $\text{Unit} \to B$, so $B$ has a +% distinguished ``error element" $\mho_B \colon B$ such that $\mho_B \le_B y$ for all $y \in B$. Then there is a unique homomorphism of algebras $f' \colon \li A \to B$ such that $f' \circ \eta = f$. The function $f'(l)$ is defined via guarded fixpoint by cases on $l$. @@ -79,40 +84,42 @@ In the $\theta(\tilde{l})$ case, we will return \[\theta_B (\lambda t . (f'_t \, \tilde{l}_t)). \] -Recalling that $f'$ is a guaded fixpoint, it is available ``later'' and by +Recalling that $f'$ is a guarded fixpoint, it is available ``later'' and by applying the tick we get a function we can apply ``now''; for the argument, we apply the tick to $\tilde{l}$ to get a term of type $\li A$. - +\end{comment} %\subsubsection{Model-Theoretic Description} %We can describe the lift monad in the topos of trees model as follows. -\subsection{Predomains} +\subsection{Predomains}\label{sec:predomains} The next important construction is that of a \emph{predomain}. A predomain is intended to model the notion of error ordering that we want terms to have. Thus, we define a predomain $A$ as a partially-ordered set, which consists of a type which we denote $\ty{A}$ and a reflexive, transitive, and antisymmetric relation $\le_P$ on $A$. +We define monotone functions between predomain as expected. Given predomains +$A$ and $B$, we write $f \colon A_i \monto A_o$ to indicate that $f$ is a monotone +function from $A_i$ to $A_o$, i.e, for all $a_1 \le_{A_i} a_2$, we have $f(a_1) \le_{A_o} f(a_2)$. +We also define an ordering on monotone functions as +$f \le g$ if for all $a$ in $\ty{A_i}$, we have $f(a) \le_{A_o} g(a)$. + For each type we want to represent, we define a predomain for the corresponding semantic type. For instance, we define a predomain for natural numbers, a predomain for the dynamic type, a predomain for functions, and a predomain for the lift monad. We describe each of these below. -We define monotone functions between predomain as expected. Given predomains -$A$ and $B$, we write $f \colon A \monto B$ to indicate that $f$ is a monotone -function from $A$ to $B$, i.e, for all $a_1 \le_A a_2$, we have $f(a_1) \le_B f(a_2)$. - \begin{itemize} - \item There is a predomain Nat for natural numbers, where the ordering is equality. + \item There is a predomain $\Nat$ for natural numbers, where the ordering is equality. - \item There is a predomain Dyn to represent the dynamic type. The underlying type + \item There is a predomain $\Dyn$ to represent the dynamic type. The underlying type for this predomain is defined by guarded fixpoint to be such that - $\ty{\Dyn} \cong \mathbb{N}\, +\, \later (\ty{\Dyn} \monto \ty{\Dyn})$. + $\ty{\Dyn} \cong \mathbb{N}\, +\, \later (\ty{\Dyn} \monto \li \ty{\Dyn})$. This definition is valid because the occurrences of Dyn are guarded by the $\later$. The ordering is defined via guarded recursion by cases on the argument, using the - ordering on $\mathbb{N}$ and the ordering on monotone functions described below. + ordering on $\mathbb{N}$ and the ordering on monotone functions described above. \item For a predomain $A$, there is a predomain $\li A$ for the ``lift'' of $A$ using the lift monad. We use the same notation for $\li A$ when $A$ is a type @@ -124,8 +131,10 @@ function from $A$ to $B$, i.e, for all $a_1 \le_A a_2$, we have $f(a_1) \le_B f( \item For predomains $A_i$ and $A_o$, we form the predomain of monotone functions from $A_i$ to $A_o$, which we denote by $A_i \To A_o$. - The ordering is such that $f$ is below $g$ if for all $a$ in $\ty{A_i}$, we have - $f(a)$ is below $g(a)$ in the ordering for $A_o$. + + \item Given a preomain $A$, we can form the predomain $\later A$ whose underlying + type is $\later \ty{A}$. We define $\tilde{x} \le_{\later A} \tilde{y}$ to be + $\later_t (\tilde{x}_t \le_A \tilde{y}_t)$. \end{itemize} @@ -148,14 +157,15 @@ Formally, we define this ordering as follows: We also define a heterogeneous version of this ordering between the lifts of two different predomains $A$ and $B$, parameterized by a relation $R$ between $A$ and $B$. -\subsection{Step-Insensitive Relation} +\subsection{Step-Insensitive Bisimilarity Relation} -We define another ordering on $\li A$, called the ``step-insensitive ordering'' or -``weak bisimilarity'', written $l \bisim l'$. +We define another ordering on $\li A$, called ``step-insensitive bisimilarity" +or ``weak bisimilarity" written $l \bisim l'$. Intuitively, we say $l \bisim l'$ if they are equivalent ``up to delays''. We introduce the notation $x \sim_A y$ to mean $x \le_A y$ and $y \le_A x$. - -The weak bisimilarity relation is defined by guarded fixpoint as follows: +% TODO if A is a poset, then we can just say that x = y +% +The step-insensitive bisimilarity relation is defined by guarded fixpoint as follows: \begin{align*} &\mho \bisim \mho \\ @@ -181,13 +191,37 @@ The weak bisimilarity relation is defined by guarded fixpoint as follows: \text { for some $n$ and $y : \ty{A}$ such that $x \sim_A y$ } \end{align*} +When both sides are $\eta$, then we ensure that the underlying values are related. +When one side is a $\theta$ and the other is $\eta x$ (i.e., one side steps), +we stipulate that the $\theta$-term runs to $\eta y$ where $x$ is related to $y$. +Similarly when one side is $\theta$ and the other $\mho$. +If both sides step, then we allow one time step to pass and compare the resulting terms. +In this way, the definition captures the intuition of terms being equivalent up to +delays. + +It can be shown (by \lob-induction) that the step-sensitive relation is symmetric. +However, it can also be shown that this relation is \emph{not} transitive: +One can prove within Clocked Cubical Type Theory +that if this relation were transitive, then in fact it would be trivial in that +$l \bisim l'$ for all $l, l'$. +This issue will be resolved when we consider the relation's \emph{globalization}. + + + \subsection{Error Domains} +While value types will be interpreted as predomains, we also need a semantics +for computation types. This will be in the form of \emph{error domains}, of which the +Lift monad is a prototypical example. For a fixed clock $k$, an error domain $A$ +consists of a predomain (which we also denote by $A$ when there is no risk of confusion), +along with a bottom element $\mho_A$ and a $\later$-algebra $\theta_A \colon \later^k A \monto A$. + +% TODO function space as error domain? -\subsection{Globalization} +\subsection{Globalization}\label{sec:globalization} Recall that in the above definitions, any occurrences of $\later$ were with -repsect to a fixed clock $k$. Intuitively, this corresponds to a step-indexed set. +respect to a fixed clock $k$. Intuitively, this corresponds to a step-indexed set. It will be necessary to consider the ``globalization'' of these definitions, i.e., the ``global'' behavior of the type over all potential time steps. This is accomplished in the type theory by \emph{clock quantification} \cite{atkey-mcbride2013}, @@ -198,10 +232,124 @@ the usual semantics in the category of sets. \section{Semantics}\label{sec:semantics} +\subsection{Step-indexed Semantics} + +We give a semantics to the step-sensitive lambda calculus $\intlc$ we defined +in Section \ref{sec:step-sensitive-lc}. +% +Much of the semantics is similar to a normal call-by-value denotational semantics; +we highlight the differences. +Recall that we will interpret value types as predomains, and computation types +as error domains. Value type contexts $\Gamma = x_1 \colon A_1, \dots, x_n \colon A_n$ +will be interpreted as the product $\sem{A_1} \times \cdots \times \sem{A_n}$, and +computation type contexts $\Delta = \Delta_\Sigma , \Delta|_V$ will be interpreted as a pair +$(\delta_\Sigma, \delta_V)$ where $\delta_\Sigma$ is either empty or $\sem{B}$. + + +The semantics of the dynamic type $\dyn$ is the predomain $\Dyn$ introduced in Section +\ref{sec:predomains}. +% +The interpretation of a value $\hasty {\Gamma} V A$ will be a monotone function from +$\sem{\Gamma}$ to $\sem{A}$. Likewise, a term $\hasty {\Delta} M {\Ret{A}}$ will be interpreted +as a monotone function from $\sem{\Delta}$ to $\sem{\Ret{A}} = \li \sem{A}$. + +Recall that $\Dyn$ is isomorphic to $\Nat\, + \later (\Dyn \monto \li \Dyn)$. +Thus, the semantics of $\injnat{\cdot}$ and $\injarr{\cdot}$ are simply the +injections $\inl$ and $\inr$. + +The interpretation of $\lda{x}{M}$ works as follows. Recall by the typing rule for +lambda that $\hasty {\cdot, \Gamma, x : A_i} M {\Ret {A_o}}$, so the interpretation of $M$ +has type $\{*\} \times (\sem{\Gamma} \times \sem{A_i})$ to $\sem{A_o}$. +The interpretation of lambda is thus a function (in the ambient type theory) that takes +a value $a$ representing the argument and applies it (along with $\gamma$) as argument to +the interpretation of $M$. +% +The interpretation of bind and of application both make use the monadic extend function on $\li A$. +% +The interpretation of case-nat and case-arrow is simply a case inspection on the +interpretation of the scrutinee, which has type $\Dyn$. + + +\vspace{2ex} + + +\noindent Types: +\begin{align*} + \sem{\nat} &= \Nat \\ + \sem{\dyn} &= \Dyn \\ + \sem{A \ra A'} &= \sem{A} \To \sem{A'} \\ + \sem{\later A} &=\, \later \sem{A} \\ + \sem{\Ret A} &= \li \sem{A} +\end{align*} + +% Contexts: + +% TODO check these, especially the semantics of bind, case-nat, and case-arr +% with respect to their context argument +\noindent Values and terms: +\begin{align*} + \sem{\zro} &= \lambda \gamma . 0 \\ + \sem{\suc\, V} &= \lambda \gamma . (\sem{V}\, \gamma) + 1 \\ + \sem{x \in \Gamma} &= \lambda \gamma . \gamma(x) \\ + \sem{\lda{x}{M}} &= \lambda \gamma . \lambda a . \sem{M}\, (*,\, (\gamma , a)) \\ + \sem{\injnat{V_n}} &= \lambda \gamma . \inl\, (\sem{V_n}\, \gamma) \\ + \sem{\injarr{V_f}} &= \lambda \gamma . \inr\, (\sem{V_f}\, \gamma) \\[2ex] + \sem{\nxt\, V} &= \lambda \gamma . \nxt (\sem{V}\, \gamma) \\ + \sem{\theta} &= \lambda \gamma . \theta \\ +% + \sem{\err_B} &= \lambda \delta . \mho \\ + \sem{\ret\, V} &= \lambda \gamma . \eta\, \sem{V} \\ + \sem{\bind{x}{M}{N}} &= \lambda \delta . \ext {(\lambda x . \sem{N}\, (\delta, x))} {\sem{M}\, \delta} \\ + \sem{V_f\, V_x} &= \lambda \gamma . \ext {(\lambda f . (\ext {f} {\sem{V_x}\, \gamma}))} {(\sem{V_f}\, \gamma)} \\ + \sem{\casenat{V}{M_{no}}{n}{M_{yes}}} &= + \lambda \delta . \text{case $(\sem{V}\, \delta)$ of} \\ + &\quad\quad\quad\quad \alt \inl(n) \to \sem{M_{yes}}(n) \\ + &\quad\quad\quad\quad \alt \inr(\tilde{f}) \to \sem{M_{no}} \\ + \sem{\casearr{V}{M_{no}}{\tilde{f}}{M_{yes}}} &= + \lambda \delta . \text{case $(\sem{V}\, \delta)$ of} \\ + &\quad\quad\quad\quad \alt \inl(n) \to \sem{M_{no}} \\ + &\quad\quad\quad\quad \alt \inr(\tilde{f}) \to \sem{M_{yes}}(\tilde{f}) +\end{align*} + +% TODO +% \noindent Relations: +% \begin{align*} +% % +% \end{align*} + + +\begin{comment} +\subsection{Global Semantics} + +Having defined the above step-indexed semantics, we now pass to a ``global'' +semantics that does not involve any step-indexing. The resulting semantics is still +intensional in that terms that produce the same value in a different number of steps +will be distinct. +We define + +\[ \semgl{\cdot} = \forall (\kpa \colon \Clock) .\, \sem{\cdot}[\kpa]. \] + +Note that for a term $M$ of type $\Ret{A}$, the semantics has type +$\sem{M} \colon \sem{\Delta} \monto \sem{\Ret{A}} = \sem{\Delta} \monto \li \sem{A}$. +In the case where $\Delta$ is the empty context, i.e., when $M$ is a closed term, +then this is equivalent to $\li \sem{A}$. +Then the global semantics in this case is $\forall \kappa . \liclk {\kappa} \sem{A}$. +We can show in Clocked Cubical Type Theory this type satisfies a coinductive unfolding property + +\[ \forall \kappa . \li \sem{A} \cong \sem{A} + 1\, + (\forall \kappa.\li \sem{A}). \] +\end{comment} + + +% Machines + +% We then define a relation $\Dwn^n$ between terms of type $T$ and $\Machine {\sem{T}}$ by + +% \subsection{Extensional Collapse} + -\subsection{Relational Semantics} +% \subsection{Relational Semantics} -\subsubsection{Term Precision via the Step-Sensitive Error Ordering} +% \subsubsection{Term Precision via the Step-Sensitive Error Ordering} % Homogeneous vs heterogeneous term precision % \subsection{Logical Relations Semantics}