merge
authorCezary Kaliszyk <kaliszyk@in.tum.de>
Wed, 24 Mar 2010 12:04:03 +0100
changeset 1627 9db725590fe9
parent 1626 0d7d0b8adca5 (current diff)
parent 1620 17a2c6fddc0c (diff)
child 1628 ddf409b2da2b
child 1630 b295a928c56b
merge
--- a/Paper/Paper.thy	Wed Mar 24 12:03:48 2010 +0100
+++ b/Paper/Paper.thy	Wed Mar 24 12:04:03 2010 +0100
@@ -287,14 +287,14 @@
   \end{center}
   
   \noindent
-  then with not too great effort we obtain a function $\fv_\alpha$
+  then with not too great effort we obtain a function $\fv^\alpha$
   operating on quotients, or alpha-equivalence classes of lambda-terms. This
   function is characterised by the equations
 
   \begin{center}
-  $\fv_\alpha(x) = \{x\}$\hspace{10mm}
-  $\fv_\alpha(t_1\;t_2) = \fv_\alpha(t_1) \cup \fv_\alpha(t_2)$\\[1mm]
-  $\fv_\alpha(\lambda x.t) = \fv_\alpha(t) - \{x\}$
+  $\fv^\alpha(x) = \{x\}$\hspace{10mm}
+  $\fv^\alpha(t_1\;t_2) = \fv^\alpha(t_1) \cup \fv^\alpha(t_2)$\\[1mm]
+  $\fv^\alpha(\lambda x.t) = \fv^\alpha(t) - \{x\}$
   \end{center}
 
   \noindent
@@ -393,7 +393,7 @@
 *}
 
 
-section {* General Binders *}
+section {* General Binders\label{sec:binders} *}
 
 text {*
   In Nominal Isabelle, the user is expected to write down a specification of a
@@ -532,26 +532,26 @@
   Our specifications for term-calculi are heavily
   inspired by the syntax of the Ott-tool \cite{ott-jfp}. A specification is
   a collection of (possibly mutual recursive) type declarations, say
-  $ty_{\alpha{}1}$, $ty_{\alpha{}2}$, \ldots $ty_{\alpha{}n}$, and an
+  $ty^\alpha_1$, $ty^\alpha_2$, \ldots $ty^\alpha_n$, and an
   associated collection of binding function declarations, say
-  $bn_{\alpha{}1}$, \ldots $bn_{\alpha{}m}$. They are schematically written as
-  follows:
+  $bn^\alpha_1$, \ldots $bn^\alpha_m$. The syntax for a specification is
+  rougly as follows:
 
   \begin{equation}\label{scheme}
   \mbox{\begin{tabular}{@ {\hspace{-9mm}}p{1.8cm}l}
   type \mbox{declaration part} &
   $\begin{cases}
   \mbox{\begin{tabular}{l}
-  \isacommand{nominal\_datatype} $ty_{\alpha{}1} = \ldots$\\
-  \isacommand{and} $ty_{\alpha{}2} = \ldots$\\
+  \isacommand{nominal\_datatype} $ty^\alpha_1 = \ldots$\\
+  \isacommand{and} $ty^\alpha_2 = \ldots$\\
   $\ldots$\\ 
-  \isacommand{and} $ty_{\alpha{}n} = \ldots$\\ 
+  \isacommand{and} $ty^\alpha_n = \ldots$\\ 
   \end{tabular}}
   \end{cases}$\\
   binding \mbox{function part} &
   $\begin{cases}
   \mbox{\begin{tabular}{l}
-  \isacommand{with} $bn_{\alpha{}1}$ \isacommand{and} \ldots \isacommand{and} $bn_{\alpha{}m}$
+  \isacommand{with} $bn^\alpha_1$ \isacommand{and} \ldots \isacommand{and} $bn^\alpha_m$
   $\ldots$\\
   \isacommand{where}\\
   $\ldots$\\
@@ -561,19 +561,22 @@
   \end{equation}
 
   \noindent
-  Every type declaration $ty_{\alpha{}i}$ consists of a collection of 
+  Every type declaration $ty^\alpha_i$ consists of a collection of 
   term-constructors, each of which comes with a list of labelled 
-  types that indicate the types of the arguments of the term-constructor.
-  For example for a term-constructor $C_{\alpha}$ we might have
+  types that stand for the types of the arguments of the term-constructor.
+  For example for a term-constructor $C^\alpha$ we might have
 
   \begin{center}
-  $C_\alpha\;label_1\!::\!ty'_1\;\ldots label_j\!::\!ty'_j\;\;\textit{binding\_clauses}$ 
+  $C^\alpha\;label_1\!::\!ty'_1\;\ldots label_l\!::\!ty'_l\;\;\textit{binding\_clauses}$ 
   \end{center}
   
   \noindent
-  The labels are optional and can be used in the (possibly empty) list of \emph{binding clauses}.
-  These clauses indicate  the binders and the scope of the binders in a term-constructor.
-  They come in three forms
+  whereby some of the $ty'_k$ are contained in the set of $ty^\alpha_i$
+  declared in \eqref{scheme}. In this case we will call
+  the corresponding argument a \emph{recursive argument}.  The labels
+  annotated on the types are optional and can be used in the (possibly empty)
+  list of \emph{binding clauses}.  These clauses indicate the binders and the
+  scope of the binders in a term-constructor.  They come in three \emph{modes}
 
   \begin{center}
   \begin{tabular}{l}
@@ -584,13 +587,18 @@
   \end{center}
 
   \noindent
-  whereby we also distinguish between \emph{shallow} binders and \emph{deep} binders.
-  Shallow binders are of the form \isacommand{bind}\; {\it label}\; 
-  \isacommand{in}\; {\it another\_label} (similar the other forms). The restriction 
-  we impose on shallow binders
-  is that the {\it label} must either refer to a type that is an atom type or
-  to a type that is a finite set or list of an atom type. For example the specifications of 
-  lambda-terms and type-schemes use shallow binders (where \emph{name} is an atom type):
+  The first mode is for binding lists of atoms (order matters); in the second sets
+  of binders (order does not matter, but cardinality does) and in the last 
+  sets of binders (with vacuous binders preserving alpha-equivalence).
+
+  In addition we distinguish between \emph{shallow} binders and \emph{deep}
+  binders.  Shallow binders are of the form \isacommand{bind}\; {\it label}\;
+  \isacommand{in}\; {\it another\_label} (similar the other two modes). The
+  restriction we impose on shallow binders is that the {\it label} must either
+  refer to a type that is an atom type or to a type that is a finite set or
+  list of an atom type. For example the specifications of lambda-terms, where
+  a single name is bound, and type-schemes, where a finite set of names is
+  bound, use shallow binders (the type \emph{name} is an atom type):
 
   \begin{center}
   \begin{tabular}{@ {}cc@ {}}
@@ -612,17 +620,37 @@
   \end{center}
 
   \noindent
-  A \emph{deep} binder uses an auxiliary binding function that ``picks'' out the atoms
-  in one argument that can be bound in one or more arguments. Such a binding function returns either 
-  a set of atoms (for \isacommand{bind\_set} and \isacommand{bind\_res}) or a 
-  list of atoms (for \isacommand{bind}). It can be defined 
-  by primitive recursion over the corresponding type; the equations
-  are stated in the binding function part of the scheme shown in \eqref{scheme}. 
+  If we have shallow binders that ``share'' a body, for example
+
+  \begin{center}
+  \begin{tabular}{ll}
+  \it {\rm Foo}$_0$ x::name y::name t::lam & \it 
+                              \isacommand{bind}\;x\;\isacommand{in}\;t,\;
+                              \isacommand{bind}\;y\;\isacommand{in}\;t  
+  \end{tabular}
+  \end{center}
+
+  \noindent
+  then we have to make sure the modes of the binders agree. For example we cannot
+  have in the first binding clause the mode \isacommand{bind} and in the second 
+  \isacommand{bind\_set}.
+
+  A \emph{deep} binder uses an auxiliary binding function that ``picks'' out
+  the atoms in one argument of the term-constructor that can be bound in one
+  or more of the other arguments and also can be bound in the same argument (we will
+  call such binders \emph{recursive}). 
+  The binding functions are expected to return either a set of atoms
+  (for \isacommand{bind\_set} and \isacommand{bind\_res}) or a list of atoms
+  (for \isacommand{bind}). They can be defined by primitive recursion over the
+  corresponding type; the equations must be given in the binding function part of
+  the scheme shown in \eqref{scheme}.
+
 
   In the present version of Nominal Isabelle, we 
   adopted the restrictions the Ott-tool imposes on the binding functions, namely a 
-  binding functions can only return the empty set, a singleton set of atoms or 
-  unions of atom sets. For example for lets with patterns you might define
+  binding function can only return the empty set, a singleton set containing an 
+  atom or unions of atom sets. For example for lets with tuple patterns you might 
+  define
 
   \begin{center}
   \begin{tabular}{l}
@@ -645,10 +673,44 @@
   \end{center}
   
   \noindent
-  In this definition the function $atom$ coerces a name into the generic 
-  atom type of Nominal Isabelle. In this way we can treat binders of different
-  type uniformely.
+  In this specification the function $atom$ coerces a name into the generic 
+  atom type of Nominal Isabelle. This allows us to treat binders of different
+  type uniformly. As will shortly become clear, we cannot return an atom 
+  in a binding function that also is bound in the term-constructor. 
+
+  Like with shallow binders, deep binders with shared body need to have the
+  same binding mode. A more serious restriction we have to impose on deep binders 
+  is that we cannot have ``overlapping'' binders. Consider for example the 
+  term-constructors:
 
+  \begin{center}
+  \begin{tabular}{ll}
+  \it {\rm Foo}$_1$ p::pat q::pat t::trm & \it \isacommand{bind}\;bn(p)\;\isacommand{in}\;t,\;
+                              \isacommand{bind}\;bn(q)\;\isacommand{in}\;t\\
+  \it {\rm Foo}$_2$ x::name p::pat t::trm & \it \it \isacommand{bind}\;x\;\isacommand{in}\;t,\;
+                              \isacommand{bind}\;bn(p)\;\isacommand{in}\;t 
+  
+  \end{tabular}
+  \end{center}
+
+  \noindent
+  In the first case we bind all atoms from the pattern $p$ in $t$ and also all atoms 
+  from $q$ in $t$. Therefore the binders overlap in $t$. Similarly in the second case:
+  the binder $bn(p)$ overlap with the shallow binder $x$. We must exclude such specifiactions, 
+  as we will not be able to represent them using the general binders described in 
+  Section \ref{sec:binders}. However the following two term-constructors are allowed:
+
+  \begin{center}
+  \begin{tabular}{ll}
+  \it {\rm Bar}$_1$ p::pat t::trm s::trm & \it \isacommand{bind}\;bn(p)\;\isacommand{in}\;t,\;
+                                            \isacommand{bind}\;bn(p)\;\isacommand{in}\;s\\
+  \it {\rm Bar}$_2$ p::pat t::trm &  \it \isacommand{bind}\;bn(p)\;\isacommand{in}\;p,\;
+                                      \isacommand{bind}\;bn(p)\;\isacommand{in}\;t\\
+  \end{tabular}
+  \end{center}
+
+  \noindent
+  as no overlapping of binders occurs.
   
 
   Because of the problem Pottier pointed out in \cite{Pottier06}, the general