From 7cbcc410ae55a342c2896386d843fdfaaea360e9 Mon Sep 17 00:00:00 2001 From: Ralf Jung <jung@mpi-sws.org> Date: Mon, 12 Dec 2016 17:15:20 +0100 Subject: [PATCH] docs: add boxes --- docs/bib.bib | 8 +++++ docs/derived.tex | 86 ++++++++++++++++++++++++++++++++++++++++++++++++ docs/iris.sty | 15 +++++++-- 3 files changed, 106 insertions(+), 3 deletions(-) diff --git a/docs/bib.bib b/docs/bib.bib index babc95f55..239c73fc4 100644 --- a/docs/bib.bib +++ b/docs/bib.bib @@ -3821,3 +3821,11 @@ year = {2013} pages = {97--108}, } +@inproceedings{iris2, + author = {Ralf Jung and Robbert Krebbers and Lars Birkedal and + Derek Dreyer}, + title = {Higher-order ghost state}, + booktitle = {ICFP}, + pages = {256--269}, + year = {2016}, +} diff --git a/docs/derived.tex b/docs/derived.tex index 55cea6798..03839d20f 100644 --- a/docs/derived.tex +++ b/docs/derived.tex @@ -59,6 +59,92 @@ from which we can derive {\NaInv\pid\namesp\prop \proves \Acc[\namesp]{\NaTokE\pid\mask}{\later\prop * \NaTokE\pid{\mask \setminus \namesp}}} \end{mathpar} +\subsection{Boxes} + +The idea behind the \emph{boxes} is to have an assertion $\prop$ that is actually split into a number of pieces, each of which can be taken out and back in separately. +In some sense, this is a replacement for having an ``authoritative PCM of Iris assertions itself''. +It is similar to the pattern involving saved propositions that was used for the barrier~\cite{iris2}, but more complicated because there are some operations that we want to perform without a later. + +Roughly, the idea is that a \emph{box} is a container for an assertion $\prop$. +A box consists of a bunch of \emph{slices} which decompose $\prop$ into a separating conjunction of the assertions $\propB_\sname$ governed by the individual slices. +Each slice is either \emph{full} (it right now contains $\propB_\sname$), or \emph{empty} (it does not contain anything currently). +The assertion governing the box keeps track of the state of all the slices that make up the box. +The crux is that opening and closing of a slice can be done even if we only have ownership of the boxes ``later'' ($\later$). + +The interface for boxes is as follows: +The two core assertions are: $\BoxSlice\namesp\prop\sname$, saying that there is a slice in namespace $\namesp$ with name $\sname$ and content $\prop$; and $\ABox\namesp\prop{f}$, saying that $f$ describes the slices of a box in namespace $\namesp$, such that all the slices together contain $\prop$. Here, $f$ is of type $\nat \fpfn \BoxState$ mapping names to states, where $\BoxState \eqdef \set{\BoxFull, \BoxEmp}$. +\begin{mathpar} + \inferH{Box-create}{} + {\TRUE \vs[\namesp] \ABox\namesp\TRUE\emptyset} + + \inferH{Slice-insert-empty}{} + {\lateropt b\ABox\namesp\prop{f} \vs[\namesp] \Exists\sname \notin \dom(f). \always\BoxSlice\namesp\propB\sname * \lateropt b\ABox\namesp{\prop * \propB}{\mapinsert\sname\BoxEmp{f}}} + + \inferH{Slice-delete-empty} + {f(\sname) = \BoxEmp} + {\BoxSlice\namesp\propB\sname \proves \lateropt b\ABox\namesp\prop{f} \vs[\namesp] \Exists \prop'. \lateropt b(\later(\prop = \prop' * \propB) * \ABox\namesp{\prop'}{\mapinsert\gname\bot{f}})} + + \inferH{Slice-fill} + {f(\sname) = \BoxEmp} + {\BoxSlice\namesp\propB\sname \proves \lateropt b\propB * \later\ABox\namesp\prop{f} \vs[\namesp] \lateropt b\ABox\namesp\prop{\mapinsert\sname\BoxFull{f}}} + + \inferH{Slice-empty} + {f(\sname) = \BoxFull} + {\BoxSlice\namesp\propB\sname \proves \lateropt b\ABox\namesp\prop{f} \vs[\namesp] \later\propB * \lateropt b\ABox\namesp\prop{\mapinsert\sname\BoxEmp{f}}} + + \inferH{Box-fill} + {\All\sname\in\dom(f). f(\sname) = \BoxEmp} + {\later\prop * \ABox\namesp\prop{f} \vs[\namesp] \ABox\namesp\prop{\mapinsertComp\sname\BoxFull{\sname\in\dom(f)}{f}}} + + \inferH{Box-empty} + {\All\sname\in\dom(f). f(\sname) = \BoxFull} + {\ABox\namesp\prop{f} \vs[\namesp] \later\prop * \ABox\namesp\prop{\mapinsertComp\sname\BoxEmp{\sname\in\dom(f)}{f}}} +\end{mathpar} +Above, $\lateropt b \prop$ is syntactic sugar for $\later\prop$ (if $b$ is $1$) or $\prop$ (if $b$ is $0$). +This is essentially an \emph{optional later}, indicating that the lemmas can be applied with \textlog{Box} being owned now or later, and that ownership is returned the same way. + +\begingroup +\paragraph{Model.} +\newcommand\BoxM{\textmon{Box}} +\newcommand\SliceInv{\textlog{SliceInv}} + +The above rules are validated by the following model. +We need a CMRA as follows: +\begin{align*} + \BoxState \eqdef{}& \BoxFull + \BoxEmp \\ + \BoxM \eqdef{}& \authm(\maybe{\exm(\BoxState)}) \times \maybe{\agm(\latert \iProp)} +\end{align*} + +Now we can define the assertions: +\begin{align*} + \SliceInv(\sname, \prop) \eqdef{}& \Exists b. \ownGhost\sname{(\authfull b, \munit)} * (b = 1 \Ra \prop) \\ + \BoxSlice\namesp\prop\sname \eqdef{}& \ownGhost\sname{(\munit, \prop)} * \knowInv\namesp{\SliceInv(\sname,\prop)} \\ + \ABox\namesp\prop{f} \eqdef{}& \Exists \propB : \nat \to \Prop. \later\left( \prop = \Sep_{\sname \in \dom(f)} \propB(\sname) \right ) * {}\\ + & \Sep_{\sname \in \dom(f)} \Exists \gname. \ownGhost\sname{(\authfrag f(\sname), \propB(\sname))} * \knowInv\namesp{\SliceInv(\sname,\propB(\sname))} +\end{align*} +\endgroup % Model paragraph + +\paragraph{Derived rules.} +Here are some derived rules: +\begin{mathpar} + \inferH{Slice-insert-full}{} + {\later\propB * \lateropt b\ABox\namesp\prop{f} \vs[\namesp] \Exists\sname \notin \dom(f). \always\BoxSlice\namesp\propB\sname * \lateropt b\ABox\namesp{\prop * \propB}{\mapinsert\sname\BoxFull{f}}} + + \inferH{Slice-insert-empty} + {f(\sname) = \BoxFull} + {\BoxSlice\namesp\propB\sname \proves \lateropt b \ABox\namesp\prop{f} \vs[\namesp] \later\propB * \Exists \prop'. \lateropt b (\later(\prop = \prop' * \propB) * \ABox\namesp{\prop'}{\mapinsert\sname\bot{f}})} + + \inferH{Slice-split} + {f(\sname) = s} + {\kern-4ex\BoxSlice\namesp{\propB_1 * \propB_2}\sname \proves \lateropt b \ABox\namesp\prop{f} \vs[\namesp] \Exists \sname_1 \notin \dom(f), \sname_2 \notin \dom(f). \sname_1 \neq \sname_1 \land {}\\\kern5ex \always\BoxSlice\namesp{\propB_1}{\sname_1} * \always\BoxSlice\namesp{\propB_2}{\sname_2} * \lateropt b \ABox\namesp\prop{\mapinsert{\sname_2}{s}{\mapinsert{\sname_1}{s}{\mapinsert\sname\bot{f}}}}} + + \inferH{Slice-merge} + {\sname_1 \neq \sname_2 \and f(\sname_1) = f(\sname_2) = s} + {\BoxSlice\namesp{\propB_1}{\sname_1}, \BoxSlice\namesp{\propB_2}{\sname_2} \proves \lateropt b \ABox\namesp\prop{f} \vs[\namesp] \Exists \sname \notin \dom(f) \setminus \set{\sname_1, \sname_2}. {}\\\kern5ex \always\BoxSlice\namesp{\propB_1 * \propB_2}\sname * \lateropt b \ABox\namesp\prop{\mapinsert\sname{s}{\mapinsert{\sname_2}{\bot}{\mapinsert{\sname_1}{\bot}{f}}}}} +\end{mathpar} + + + % TODO: These need syncing with Coq % \subsection{STSs with interpretation}\label{sec:stsinterp} diff --git a/docs/iris.sty b/docs/iris.sty index 8578e2e6a..3b698bb1b 100644 --- a/docs/iris.sty +++ b/docs/iris.sty @@ -244,9 +244,9 @@ \NewDocumentCommand\wpre{m O{} m}% {\textlog{wp}_{#2}\spac#1\spac{\left\{#3\right\}}} -\newcommand{\later}{\mathop{\triangleright}} +\newcommand{\later}{\mathop{{\triangleright}}} +\newcommand*{\lateropt}[1]{\mathop{{\later}^{#1}}} \newcommand{\always}{\mathop{\Box}} -\newcommand{\pure}{\mathop{\blacksquare}} %% Invariants and Ghost ownership % PDS: Was 0pt inner, 2pt outer. @@ -429,12 +429,21 @@ %% Stored Propositions \newcommand{\mapstoprop}{\mathrel{\kern-0.5ex\tikz[baseline=(m)]{\node at (0,0) (m){}; \draw[line cap=round] (0,0.16) -- (0,-0.004);}\kern-1.5ex\Ra}} -% Non-atomic invariants +%% Non-atomic invariants \newcommand*\pid{p} \newcommand\NaInv[3]{\textlog{NaInv}^{#1.#2}(#3)} \newcommand*\NaTok[1]{{[}\textrm{NaInv}:#1{]}} \newcommand*\NaTokE[2]{{[}\textrm{NaInv}:#1.#2{]}} +%% Boxes +\newcommand*\sname{i} +\newcommand*\BoxState{\textlog{BoxState}} +\newcommand*\BoxFull{\textlog{full}} +\newcommand*\BoxEmp{\textlog{empty}} +\newcommand*\BoxSlice[3]{\textlog{BoxSlice}(#1, #2, #3)} +\newcommand*\ABox[3]{\textlog{Box}(#1, #2, #3)} + + \endinput -- GitLab