LMCS-Paper/Paper.thy
branchNominal2-Isabelle2012
changeset 3169 b6873d123f9b
parent 3168 a6f3e1b08494
child 3170 89715c48f728
equal deleted inserted replaced
3168:a6f3e1b08494 3169:b6873d123f9b
     1 (*<*)
       
     2 theory Paper
       
     3 imports "../Nominal/Nominal2" 
       
     4         "~~/src/HOL/Library/LaTeXsugar"
       
     5 begin
       
     6 
       
     7 consts
       
     8   fv :: "'a \<Rightarrow> 'b"
       
     9   abs_set :: "'a \<Rightarrow> 'b \<Rightarrow> 'c"
       
    10   alpha_bn :: "'a \<Rightarrow> 'a \<Rightarrow> bool"
       
    11   abs_set2 :: "'a \<Rightarrow> perm \<Rightarrow> 'b \<Rightarrow> 'c"
       
    12   equ2 :: "'a \<Rightarrow> 'a \<Rightarrow> bool"
       
    13   Abs_dist :: "'a \<Rightarrow> 'b \<Rightarrow> 'c" 
       
    14   Abs_print :: "'a \<Rightarrow> 'b \<Rightarrow> 'c" 
       
    15 
       
    16 definition
       
    17  "equal \<equiv> (op =)" 
       
    18 
       
    19 fun alpha_set_ex where
       
    20   "alpha_set_ex (bs, x) R f (cs, y) = (\<exists>pi. alpha_set (bs, x) R f pi (cs, y))"
       
    21  
       
    22 fun alpha_res_ex where
       
    23   "alpha_res_ex (bs, x) R f pi (cs, y) = (\<exists>pi. alpha_res (bs, x) R f pi (cs, y))"
       
    24 
       
    25 fun alpha_lst_ex where
       
    26   "alpha_lst_ex (bs, x) R f pi (cs, y) = (\<exists>pi. alpha_lst (bs, x) R f pi (cs, y))"
       
    27 
       
    28 
       
    29 
       
    30 notation (latex output)
       
    31   swap ("'(_ _')" [1000, 1000] 1000) and
       
    32   fresh ("_ # _" [51, 51] 50) and
       
    33   fresh_star ("_ #\<^sup>* _" [51, 51] 50) and
       
    34   supp ("supp _" [78] 73) and
       
    35   uminus ("-_" [78] 73) and
       
    36   If  ("if _ then _ else _" 10) and
       
    37   alpha_set_ex ("_ \<approx>\<^raw:\,\raisebox{-1pt}{\makebox[0mm][l]{$_{\textit{set}}$}}>\<^bsup>_, _\<^esup> _") and
       
    38   alpha_lst_ex ("_ \<approx>\<^raw:\,\raisebox{-1pt}{\makebox[0mm][l]{$_{\textit{list}}$}}>\<^bsup>_, _\<^esup> _") and
       
    39   alpha_res_ex ("_ \<approx>\<^raw:\,\raisebox{-1pt}{\makebox[0mm][l]{$_{\textit{set+}}$}}>\<^bsup>_, _\<^esup> _") and
       
    40   abs_set ("_ \<approx>\<^raw:{$\,_{\textit{abs\_set}}$}> _") and
       
    41   abs_set2 ("_ \<approx>\<^raw:\raisebox{-1pt}{\makebox[0mm][l]{$\,_{\textit{list}}$}}>\<^bsup>_\<^esup>  _") and
       
    42   fv ("fa'(_')" [100] 100) and
       
    43   equal ("=") and
       
    44   alpha_abs_set ("_ \<approx>\<^raw:{$\,_{\textit{abs\_set}}$}> _") and 
       
    45   alpha_abs_lst ("_ \<approx>\<^raw:{$\,_{\textit{abs\_list}}$}> _") and 
       
    46   alpha_abs_res ("_ \<approx>\<^raw:{$\,_{\textit{abs\_set+}}$}> _") and 
       
    47   Abs_set ("[_]\<^bsub>set\<^esub>._" [20, 101] 999) and
       
    48   Abs_lst ("[_]\<^bsub>list\<^esub>._" [20, 101] 999) and
       
    49   Abs_dist ("[_]\<^bsub>#list\<^esub>._" [20, 101] 999) and
       
    50   Abs_res ("[_]\<^bsub>set+\<^esub>._") and
       
    51   Abs_print ("_\<^bsub>set\<^esub>._") and
       
    52   Cons ("_::_" [78,77] 73) and
       
    53   supp_set ("aux _" [1000] 10) and
       
    54   alpha_bn ("_ \<approx>bn _")
       
    55 
       
    56 consts alpha_trm ::'a
       
    57 consts fa_trm :: 'a
       
    58 consts fa_trm_al :: 'a
       
    59 consts alpha_trm2 ::'a
       
    60 consts fa_trm2 :: 'a
       
    61 consts fa_trm2_al :: 'a
       
    62 consts supp2 :: 'a
       
    63 consts ast :: 'a
       
    64 consts ast' :: 'a
       
    65 consts bn_al :: "'b \<Rightarrow> 'a"
       
    66 notation (latex output) 
       
    67   alpha_trm ("\<approx>\<^bsub>trm\<^esub>") and
       
    68   fa_trm ("fa\<^bsub>trm\<^esub>") and
       
    69   fa_trm_al ("fa\<AL>\<^bsub>trm\<^esub>") and
       
    70   alpha_trm2 ("'(\<approx>\<^bsub>assn\<^esub>, \<approx>\<^bsub>trm\<^esub>')") and
       
    71   fa_trm2 ("'(fa\<^bsub>assn\<^esub>, fa\<^bsub>trm\<^esub>')") and
       
    72   fa_trm2_al ("'(fa\<AL>\<^bsub>assn\<^esub>, fa\<AL>\<^bsub>trm\<^esub>')") and
       
    73   ast ("'(as, t')") and
       
    74   ast' ("'(as', t\<PRIME> ')") and
       
    75   equ2 ("'(=, =')") and
       
    76   supp2 ("'(supp, supp')") and
       
    77   bn_al ("bn\<^sup>\<alpha> _" [100] 100)
       
    78 (*>*)
       
    79 
       
    80 
       
    81 section {* Introduction *}
       
    82 
       
    83 text {*
       
    84   So far, Nominal Isabelle provided a mechanism for constructing alpha-equated
       
    85   terms, for example lambda-terms
       
    86 
       
    87   \[
       
    88   @{text "t ::= x | t t | \<lambda>x. t"}
       
    89   \]\smallskip
       
    90 
       
    91   \noindent
       
    92   where free and bound variables have names.  For such alpha-equated terms,
       
    93   Nominal Isabelle derives automatically a reasoning infrastructure that has
       
    94   been used successfully in formalisations of an equivalence checking
       
    95   algorithm for LF \cite{UrbanCheneyBerghofer08}, Typed
       
    96   Scheme~\cite{TobinHochstadtFelleisen08}, several calculi for concurrency
       
    97   \cite{BengtsonParow09} and a strong normalisation result for cut-elimination
       
    98   in classical logic \cite{UrbanZhu08}. It has also been used by Pollack for
       
    99   formalisations in the locally-nameless approach to binding
       
   100   \cite{SatoPollack10}.
       
   101 
       
   102   However, Nominal Isabelle has fared less well in a formalisation of the
       
   103   algorithm W \cite{UrbanNipkow09}, where types and type-schemes are,
       
   104   respectively, of the form
       
   105 
       
   106   \begin{equation}\label{tysch}
       
   107   \begin{array}{l}
       
   108   @{text "T ::= x | T \<rightarrow> T"}\hspace{15mm}
       
   109   @{text "S ::= \<forall>{x\<^isub>1,\<dots>, x\<^isub>n}. T"}
       
   110   \end{array}
       
   111   \end{equation}\smallskip
       
   112 
       
   113   \noindent
       
   114   and the @{text "\<forall>"}-quantification binds a finite (possibly empty) set of
       
   115   type-variables.  While it is possible to implement this kind of more general
       
   116   binders by iterating single binders, like @{text "\<forall>x\<^isub>1.\<forall>x\<^isub>2...\<forall>x\<^isub>n.T"}, this leads to a rather clumsy
       
   117   formalisation of W. For example, the usual definition for a
       
   118   type being an instance of a type-scheme requires in the iterated version 
       
   119   the following auxiliary \emph{unbinding relation}:
       
   120 
       
   121   \[
       
   122   \infer{@{text T} \hookrightarrow ([], @{text T})}{}\qquad
       
   123   \infer{\forall @{text x.S} \hookrightarrow (@{text x}\!::\!@{text xs}, @{text T})}
       
   124    {@{text S} \hookrightarrow (@{text xs}, @{text T})}
       
   125   \]\smallskip
       
   126 
       
   127   \noindent
       
   128   Its purpose is to relate a type-scheme with a list of type-variables and a type. It is used to
       
   129   address the following problem:
       
   130   Given a type-scheme, say @{text S}, how does one get access to the bound type-variables 
       
   131   and the type-part of @{text S}? The unbinding relation gives an answer to this problem, though 
       
   132   in general it will only provide \emph{a} list of type-variables together with \emph{a} type that are  
       
   133   ``alpha-equivalent'' to @{text S}. This is because unbinding is a relation; it cannot be a function
       
   134   for alpha-equated type-schemes. With the unbinding relation  
       
   135   in place, we can define when a type @{text T} is an instance of a type-scheme @{text S} as follows:
       
   136 
       
   137   \[
       
   138   @{text "T \<prec> S \<equiv> \<exists>xs T' \<sigma>. S \<hookrightarrow> (xs, T') \<and> dom \<sigma> = set xs \<and> \<sigma>(T') = T"}
       
   139   \]\smallskip
       
   140   
       
   141   \noindent
       
   142   This means there exists a list of type-variables @{text xs} and a type @{text T'} to which
       
   143   the type-scheme @{text S} unbinds, and there exists a substitution @{text "\<sigma>"} whose domain is
       
   144   @{text xs} (seen as set) such that @{text "\<sigma>(T') = T"}.
       
   145   The problem with this definition is that we cannot follow the usual proofs 
       
   146   that are by induction on the type-part of the type-scheme (since it is under
       
   147   an existential quantifier and only an alpha-variant). The implementation of 
       
   148   type-schemes using iterations of single binders 
       
   149   prevents us from directly ``unbinding'' the bound type-variables and the type-part. 
       
   150   Clearly, a more dignified approach for formalising algorithm W is desirable. 
       
   151   The purpose of this paper is to introduce general binders, which 
       
   152   allow us to represent type-schemes so that they can bind multiple variables at once
       
   153   and as a result solve this problem more straightforwardly.
       
   154   The need of iterating single binders is also one reason
       
   155   why the existing Nominal Isabelle and similar theorem provers that only provide
       
   156   mechanisms for binding single variables have so far not fared very well with
       
   157   the more advanced tasks in the POPLmark challenge \cite{challenge05},
       
   158   because also there one would like to bind multiple variables at once.
       
   159 
       
   160   Binding multiple variables has interesting properties that cannot be captured
       
   161   easily by iterating single binders. For example in the case of type-schemes we do not
       
   162   want to make a distinction about the order of the bound variables. Therefore
       
   163   we would like to regard in \eqref{ex1} below  the first pair of type-schemes as alpha-equivalent,
       
   164   but assuming that @{text x}, @{text y} and @{text z} are distinct variables,
       
   165   the second pair should \emph{not} be alpha-equivalent:
       
   166 
       
   167   \begin{equation}\label{ex1}
       
   168   @{text "\<forall>{x, y}. x \<rightarrow> y  \<approx>\<^isub>\<alpha>  \<forall>{x, y}. y \<rightarrow> x"}\hspace{10mm}
       
   169   @{text "\<forall>{x, y}. x \<rightarrow> y  \<notapprox>\<^isub>\<alpha>  \<forall>{z}. z \<rightarrow> z"}
       
   170   \end{equation}\smallskip
       
   171 
       
   172   \noindent
       
   173   Moreover, we like to regard type-schemes as alpha-equivalent, if they differ
       
   174   only on \emph{vacuous} binders, such as
       
   175 
       
   176   \begin{equation}\label{ex3}
       
   177   @{text "\<forall>{x}. x \<rightarrow> y  \<approx>\<^isub>\<alpha>  \<forall>{x, z}. x \<rightarrow> y"}
       
   178   \end{equation}\smallskip
       
   179 
       
   180   \noindent
       
   181   where @{text z} does not occur freely in the type.  In this paper we will
       
   182   give a general binding mechanism and associated notion of alpha-equivalence
       
   183   that can be used to faithfully represent this kind of binding in Nominal
       
   184   Isabelle.  The difficulty of finding the right notion for alpha-equivalence
       
   185   can be appreciated in this case by considering that the definition given for
       
   186   type-schemes by Leroy in \cite[Page 18--19]{Leroy92} is incorrect (it omits a side-condition).
       
   187 
       
   188   However, the notion of alpha-equivalence that is preserved by vacuous
       
   189   binders is not always wanted. For example in terms like
       
   190 
       
   191   \begin{equation}\label{one}
       
   192   @{text "\<LET> x = 3 \<AND> y = 2 \<IN> x - y \<END>"}
       
   193   \end{equation}\smallskip
       
   194 
       
   195   \noindent
       
   196   we might not care in which order the assignments @{text "x = 3"} and
       
   197   \mbox{@{text "y = 2"}} are given, but it would be often unusual (particularly
       
   198   in strict languages) to regard \eqref{one} as alpha-equivalent with
       
   199 
       
   200   \[
       
   201   @{text "\<LET> x = 3 \<AND> y = 2 \<AND> z = foo \<IN> x - y \<END>"}
       
   202   \]\smallskip
       
   203 
       
   204   \noindent
       
   205   Therefore we will also provide a separate binding mechanism for cases in
       
   206   which the order of binders does not matter, but the `cardinality' of the
       
   207   binders has to agree.
       
   208 
       
   209   However, we found that this is still not sufficient for dealing with
       
   210   language constructs frequently occurring in programming language
       
   211   research. For example in @{text "\<LET>"}s containing patterns like
       
   212 
       
   213   \begin{equation}\label{two}
       
   214   @{text "\<LET> (x, y) = (3, 2) \<IN> x - y \<END>"}
       
   215   \end{equation}\smallskip
       
   216 
       
   217   \noindent
       
   218   we want to bind all variables from the pattern inside the body of the
       
   219   $\mathtt{let}$, but we also care about the order of these variables, since
       
   220   we do not want to regard \eqref{two} as alpha-equivalent with
       
   221 
       
   222   \[
       
   223   @{text "\<LET> (y, x) = (3, 2) \<IN> x - y \<END>"}
       
   224   \]\smallskip
       
   225 
       
   226   \noindent
       
   227   As a result, we provide three general binding mechanisms each of which binds
       
   228   multiple variables at once, and let the user choose which one is intended
       
   229   when formalising a term-calculus.
       
   230 
       
   231   By providing these general binding mechanisms, however, we have to work
       
   232   around a problem that has been pointed out by Pottier \cite{Pottier06} and
       
   233   Cheney \cite{Cheney05}: in @{text "\<LET>"}-constructs of the form
       
   234 
       
   235   \[
       
   236   @{text "\<LET> x\<^isub>1 = t\<^isub>1 \<AND> \<dots> \<AND> x\<^isub>n = t\<^isub>n \<IN> s \<END>"}
       
   237   \]\smallskip
       
   238 
       
   239   \noindent
       
   240   we care about the information that there are as many bound variables @{text
       
   241   "x\<^isub>i"} as there are @{text "t\<^isub>i"}. We lose this information if
       
   242   we represent the @{text "\<LET>"}-constructor by something like
       
   243 
       
   244   \[
       
   245   @{text "\<LET> (\<lambda>x\<^isub>1\<dots>x\<^isub>n . s)  [t\<^isub>1,\<dots>,t\<^isub>n]"}
       
   246   \]\smallskip
       
   247 
       
   248   \noindent
       
   249   where the notation @{text "\<lambda>_ . _"} indicates that the list of @{text
       
   250   "x\<^isub>i"} becomes bound in @{text s}. In this representation the term
       
   251   \mbox{@{text "\<LET> (\<lambda>x . s) [t\<^isub>1, t\<^isub>2]"}} is a perfectly
       
   252   legal instance, but the lengths of the two lists do not agree. To exclude
       
   253   such terms, additional predicates about well-formed terms are needed in
       
   254   order to ensure that the two lists are of equal length. This can result in
       
   255   very messy reasoning (see for example~\cite{BengtsonParow09}). To avoid
       
   256   this, we will allow type specifications for @{text "\<LET>"}s as follows
       
   257 
       
   258   \[
       
   259   \mbox{\begin{tabular}{r@ {\hspace{2mm}}r@ {\hspace{2mm}}ll}
       
   260   @{text trm} & @{text "::="}  & @{text "\<dots>"} \\
       
   261               & @{text "|"}    & @{text "\<LET>  as::assn  s::trm"}\hspace{2mm} 
       
   262                                  \isacommand{binds} @{text "bn(as)"} \isacommand{in} @{text "s"}\\[1mm]
       
   263   @{text assn} & @{text "::="} & @{text "\<ANIL>"}\\
       
   264                &  @{text "|"}  & @{text "\<ACONS>  name  trm  assn"}
       
   265   \end{tabular}}
       
   266   \]\smallskip
       
   267 
       
   268   \noindent
       
   269   where @{text assn} is an auxiliary type representing a list of assignments
       
   270   and @{text bn} an auxiliary function identifying the variables to be bound
       
   271   by the @{text "\<LET>"}. This function can be defined by recursion over @{text
       
   272   assn} as follows
       
   273 
       
   274   \[
       
   275   @{text "bn(\<ANIL>) ="}~@{term "{}"} \hspace{10mm} 
       
   276   @{text "bn(\<ACONS> x t as) = {x} \<union> bn(as)"} 
       
   277   \]\smallskip
       
   278 
       
   279   \noindent
       
   280   The scope of the binding is indicated by labels given to the types, for
       
   281   example @{text "s::trm"}, and a binding clause, in this case
       
   282   \isacommand{binds} @{text "bn(as)"} \isacommand{in} @{text "s"}. This binding
       
   283   clause states that all the names the function @{text "bn(as)"} returns
       
   284   should be bound in @{text s}.  This style of specifying terms and bindings
       
   285   is heavily inspired by the syntax of the Ott-tool \cite{ott-jfp}. Our work
       
   286   extends Ott in several aspects: one is that we support three binding
       
   287   modes---Ott has only one, namely the one where the order of binders matters.
       
   288   Another is that our reasoning infrastructure, like strong induction principles
       
   289   and the notion of free variables, is derived from first principles within 
       
   290   the Isabelle/HOL theorem prover.
       
   291 
       
   292   However, we will not be able to cope with all specifications that are
       
   293   allowed by Ott. One reason is that Ott lets the user specify `empty' types
       
   294   like \mbox{@{text "t ::= t t | \<lambda>x. t"}} where no clause for variables is
       
   295   given. Arguably, such specifications make some sense in the context of Coq's
       
   296   type theory (which Ott supports), but not at all in a HOL-based environment
       
   297   where every datatype must have a non-empty set-theoretic model
       
   298   \cite{Berghofer99}.  Another reason is that we establish the reasoning
       
   299   infrastructure for alpha-\emph{equated} terms. In contrast, Ott produces a
       
   300   reasoning infrastructure in Isabelle/HOL for \emph{non}-alpha-equated, or
       
   301   `raw', terms. While our alpha-equated terms and the `raw' terms produced by
       
   302   Ott use names for bound variables, there is a key difference: working with
       
   303   alpha-equated terms means, for example, that the two type-schemes
       
   304 
       
   305   \[
       
   306   @{text "\<forall>{x}. x \<rightarrow> y  = \<forall>{x, z}. x \<rightarrow> y"} 
       
   307   \]\smallskip
       
   308   
       
   309   \noindent
       
   310   are not just alpha-equal, but actually \emph{equal}! As a result, we can
       
   311   only support specifications that make sense on the level of alpha-equated
       
   312   terms (offending specifications, which for example bind a variable according
       
   313   to a variable bound somewhere else, are not excluded by Ott, but we have
       
   314   to).  
       
   315 
       
   316   Our insistence on reasoning with alpha-equated terms comes from the
       
   317   wealth of experience we gained with the older version of Nominal Isabelle:
       
   318   for non-trivial properties, reasoning with alpha-equated terms is much
       
   319   easier than reasoning with `raw' terms. The fundamental reason for this is
       
   320   that the HOL-logic underlying Nominal Isabelle allows us to replace
       
   321   `equals-by-equals'. In contrast, replacing
       
   322   `alpha-equals-by-alpha-equals' in a representation based on `raw' terms
       
   323   requires a lot of extra reasoning work.
       
   324 
       
   325   Although in informal settings a reasoning infrastructure for alpha-equated
       
   326   terms is nearly always taken for granted, establishing it automatically in
       
   327   Isabelle/HOL is a rather non-trivial task. For every
       
   328   specification we will need to construct type(s) containing as elements the
       
   329   alpha-equated terms. To do so, we use the standard HOL-technique of defining
       
   330   a new type by identifying a non-empty subset of an existing type.  The
       
   331   construction we perform in Isabelle/HOL can be illustrated by the following picture:
       
   332 
       
   333   \begin{equation}\label{picture}
       
   334   \mbox{\begin{tikzpicture}[scale=1.1]
       
   335   %\draw[step=2mm] (-4,-1) grid (4,1);
       
   336   
       
   337   \draw[very thick] (0.7,0.4) circle (4.25mm);
       
   338   \draw[rounded corners=1mm, very thick] ( 0.0,-0.8) rectangle ( 1.8, 0.9);
       
   339   \draw[rounded corners=1mm, very thick] (-1.95,0.85) rectangle (-2.85,-0.05);
       
   340   
       
   341   \draw (-2.0, 0.845) --  (0.7,0.845);
       
   342   \draw (-2.0,-0.045)  -- (0.7,-0.045);
       
   343 
       
   344   \draw ( 0.7, 0.5) node {\footnotesize\begin{tabular}{@ {}c@ {}}$\alpha$-\\[-1mm]classes\end{tabular}};
       
   345   \draw (-2.4, 0.5) node {\footnotesize\begin{tabular}{@ {}c@ {}}$\alpha$-eq.\\[-1mm]terms\end{tabular}};
       
   346   \draw (1.8, 0.48) node[right=-0.1mm]
       
   347     {\small\begin{tabular}{@ {}l@ {}}existing\\[-1mm] type\\ (sets of raw terms)\end{tabular}};
       
   348   \draw (0.9, -0.35) node {\footnotesize\begin{tabular}{@ {}l@ {}}non-empty\\[-1mm]subset\end{tabular}};
       
   349   \draw (-3.25, 0.55) node {\small\begin{tabular}{@ {}l@ {}}new\\[-1mm]type\end{tabular}};
       
   350   
       
   351   \draw[<->, very thick] (-1.8, 0.3) -- (-0.1,0.3);
       
   352   \draw (-0.95, 0.3) node[above=0mm] {\footnotesize{}isomorphism};
       
   353 
       
   354   \end{tikzpicture}}
       
   355   \end{equation}\smallskip
       
   356 
       
   357   \noindent
       
   358   We take as the starting point a definition of raw terms (defined as a
       
   359   datatype in Isabelle/HOL); then identify the alpha-equivalence classes in
       
   360   the type of sets of raw terms according to our alpha-equivalence relation,
       
   361   and finally define the new type as these alpha-equivalence classes (the
       
   362   non-emptiness requirement is always satisfied whenever the raw terms are
       
   363   definable as datatype in Isabelle/HOL and our relation for alpha-equivalence
       
   364   is an equivalence relation).
       
   365 
       
   366   The fact that we obtain an isomorphism between the new type and the
       
   367   non-empty subset shows that the new type is a faithful representation of
       
   368   alpha-equated terms. That is not the case for example for terms using the
       
   369   locally nameless representation of binders \cite{McKinnaPollack99}: in this
       
   370   representation there are `junk' terms that need to be excluded by
       
   371   reasoning about a well-formedness predicate.
       
   372 
       
   373   The problem with introducing a new type in Isabelle/HOL is that in order to
       
   374   be useful, a reasoning infrastructure needs to be `lifted' from the
       
   375   underlying subset to the new type. This is usually a tricky and arduous
       
   376   task. To ease it, we re-implemented in Isabelle/HOL \cite{KaliszykUrban11}
       
   377   the quotient package described by Homeier \cite{Homeier05} for the HOL4
       
   378   system. This package allows us to lift definitions and theorems involving
       
   379   raw terms to definitions and theorems involving alpha-equated terms. For
       
   380   example if we define the free-variable function over raw lambda-terms
       
   381   as follows
       
   382 
       
   383   \[
       
   384   \mbox{\begin{tabular}{l@ {\hspace{1mm}}r@ {\hspace{1mm}}l}
       
   385   @{text "fv(x)"}     & @{text "\<equiv>"} & @{text "{x}"}\\
       
   386   @{text "fv(t\<^isub>1 t\<^isub>2)"} & @{text "\<equiv>"} & @{text "fv(t\<^isub>1) \<union> fv(t\<^isub>2)"}\\
       
   387   @{text "fv(\<lambda>x.t)"}  & @{text "\<equiv>"} & @{text "fv(t) - {x}"}
       
   388   \end{tabular}}
       
   389   \]\smallskip
       
   390   
       
   391   \noindent
       
   392   then with the help of the quotient package we can obtain a function @{text "fv\<^sup>\<alpha>"}
       
   393   operating on quotients, that is alpha-equivalence classes of lambda-terms. This
       
   394   lifted function is characterised by the equations
       
   395 
       
   396   \[
       
   397   \mbox{\begin{tabular}{l@ {\hspace{1mm}}r@ {\hspace{1mm}}l}
       
   398   @{text "fv\<^sup>\<alpha>(x)"}     & @{text "="} & @{text "{x}"}\\
       
   399   @{text "fv\<^sup>\<alpha>(t\<^isub>1 t\<^isub>2)"} & @{text "="} & @{text "fv\<^sup>\<alpha>(t\<^isub>1) \<union> fv\<^sup>\<alpha>(t\<^isub>2)"}\\
       
   400   @{text "fv\<^sup>\<alpha>(\<lambda>x.t)"}  & @{text "="} & @{text "fv\<^sup>\<alpha>(t) - {x}"}
       
   401   \end{tabular}}
       
   402   \]\smallskip
       
   403 
       
   404   \noindent
       
   405   (Note that this means also the term-constructors for variables, applications
       
   406   and lambda are lifted to the quotient level.)  This construction, of course,
       
   407   only works if alpha-equivalence is indeed an equivalence relation, and the
       
   408   `raw' definitions and theorems are respectful w.r.t.~alpha-equivalence.
       
   409   For example, we will not be able to lift a bound-variable function. Although
       
   410   this function can be defined for raw terms, it does not respect
       
   411   alpha-equivalence and therefore cannot be lifted. 
       
   412   To sum up, every lifting
       
   413   of theorems to the quotient level needs proofs of some respectfulness
       
   414   properties (see \cite{Homeier05}). In the paper we show that we are able to
       
   415   automate these proofs and as a result can automatically establish a reasoning 
       
   416   infrastructure for alpha-equated terms.\smallskip
       
   417 
       
   418   The examples we have in mind where our reasoning infrastructure will be
       
   419   helpful include the term language of Core-Haskell (see
       
   420   Figure~\ref{corehas}). This term language involves patterns that have lists
       
   421   of type-, coercion- and term-variables, all of which are bound in @{text
       
   422   "\<CASE>"}-expressions. In these patterns we do not know in advance how many
       
   423   variables need to be bound. Another example is the algorithm W,
       
   424   which includes multiple binders in type-schemes.\medskip
       
   425 
       
   426   \noindent
       
   427   {\bf Contributions:} We provide three new definitions for when terms
       
   428   involving general binders are alpha-equivalent. These definitions are
       
   429   inspired by earlier work of Pitts \cite{Pitts04}. By means of automati\-cally-generated
       
   430   proofs, we establish a reasoning infrastructure for alpha-equated terms,
       
   431   including properties about support, freshness and equality conditions for
       
   432   alpha-equated terms. We are also able to automatically derive strong
       
   433   induction principles that have the variable convention already built in.
       
   434   For this we simplify the earlier automated proofs by using the proving tools
       
   435   from the function package~\cite{Krauss09} of Isabelle/HOL.  The method
       
   436   behind our specification of general binders is taken from the Ott-tool, but
       
   437   we introduce crucial restrictions, and also extensions, so that our
       
   438   specifications make sense for reasoning about alpha-equated terms.  The main
       
   439   improvement over Ott is that we introduce three binding modes (only one is
       
   440   present in Ott), provide formalised definitions for alpha-equivalence and
       
   441   for free variables of our terms, and also derive a reasoning infrastructure
       
   442   for our specifications from `first principles' inside a theorem prover.
       
   443 
       
   444 
       
   445   \begin{figure}[t]
       
   446   \begin{boxedminipage}{\linewidth}
       
   447   \begin{center}
       
   448   \begin{tabular}{@ {\hspace{8mm}}r@ {\hspace{2mm}}r@ {\hspace{2mm}}l}
       
   449   \multicolumn{3}{@ {}l}{Type Kinds}\\
       
   450   @{text "\<kappa>"} & @{text "::="} & @{text "\<star> | \<kappa>\<^isub>1 \<rightarrow> \<kappa>\<^isub>2"}\smallskip\\
       
   451   \multicolumn{3}{@ {}l}{Coercion Kinds}\\
       
   452   @{text "\<iota>"} & @{text "::="} & @{text "\<sigma>\<^isub>1 \<sim> \<sigma>\<^isub>2"}\smallskip\\
       
   453   \multicolumn{3}{@ {}l}{Types}\\
       
   454   @{text "\<sigma>"} & @{text "::="} & @{text "a | T | \<sigma>\<^isub>1 \<sigma>\<^isub>2 | S\<^isub>n"}$\;\overline{@{text "\<sigma>"}}$@{text "\<^sup>n"} 
       
   455   @{text "| \<forall>a:\<kappa>. \<sigma> | \<iota> \<Rightarrow> \<sigma>"}\smallskip\\
       
   456   \multicolumn{3}{@ {}l}{Coercion Types}\\
       
   457   @{text "\<gamma>"} & @{text "::="} & @{text "c | C | \<gamma>\<^isub>1 \<gamma>\<^isub>2 | S\<^isub>n"}$\;\overline{@{text "\<gamma>"}}$@{text "\<^sup>n"}
       
   458   @{text "| \<forall>c:\<iota>. \<gamma> | \<iota> \<Rightarrow> \<gamma> | refl \<sigma> | sym \<gamma> | \<gamma>\<^isub>1 \<circ> \<gamma>\<^isub>2"}\\
       
   459   & @{text "|"} & @{text "\<gamma> @ \<sigma> | left \<gamma> | right \<gamma> | \<gamma>\<^isub>1 \<sim> \<gamma>\<^isub>2 | rightc \<gamma> | leftc \<gamma> | \<gamma>\<^isub>1 \<triangleright> \<gamma>\<^isub>2"}\smallskip\\
       
   460   \multicolumn{3}{@ {}l}{Terms}\\
       
   461   @{text "e"} & @{text "::="} & @{text "x | K | \<Lambda>a:\<kappa>. e | \<Lambda>c:\<iota>. e | e \<sigma> | e \<gamma> | \<lambda>x:\<sigma>. e | e\<^isub>1 e\<^isub>2"}\\
       
   462   & @{text "|"} & @{text "\<LET> x:\<sigma> = e\<^isub>1 \<IN> e\<^isub>2 | \<CASE> e\<^isub>1 \<OF>"}$\;\overline{@{text "p \<rightarrow> e\<^isub>2"}}$ @{text "| e \<triangleright> \<gamma>"}\smallskip\\
       
   463   \multicolumn{3}{@ {}l}{Patterns}\\
       
   464   @{text "p"} & @{text "::="} & @{text "K"}$\;\overline{@{text "a:\<kappa>"}}\;\overline{@{text "c:\<iota>"}}\;\overline{@{text "x:\<sigma>"}}$\smallskip\\
       
   465   \multicolumn{3}{@ {}l}{Constants}\\
       
   466   & @{text C} & coercion constants\\
       
   467   & @{text T} & value type constructors\\
       
   468   & @{text "S\<^isub>n"} & n-ary type functions (which need to be fully applied)\\
       
   469   & @{text K} & data constructors\smallskip\\
       
   470   \multicolumn{3}{@ {}l}{Variables}\\
       
   471   & @{text a} & type variables\\
       
   472   & @{text c} & coercion variables\\
       
   473   & @{text x} & term variables\\
       
   474   \end{tabular}
       
   475   \end{center}
       
   476   \end{boxedminipage}
       
   477   \caption{The System @{text "F\<^isub>C"}
       
   478   \cite{CoreHaskell}, also often referred to as \emph{Core-Haskell}. In this
       
   479   version of @{text "F\<^isub>C"} we made a modification by separating the
       
   480   grammars for type kinds and coercion kinds, as well as for types and coercion
       
   481   types. For this paper the interesting term-constructor is @{text "\<CASE>"},
       
   482   which binds multiple type-, coercion- and term-variables (the overlines stand for lists).\label{corehas}}
       
   483   \end{figure}
       
   484 *}
       
   485 
       
   486 section {* A Short Review of the Nominal Logic Work *}
       
   487 
       
   488 text {*
       
   489   At its core, Nominal Isabelle is an adaptation of the nominal logic work by
       
   490   Pitts \cite{Pitts03}. This adaptation for Isabelle/HOL is described in
       
   491   \cite{HuffmanUrban10} (including proofs). We shall briefly review this work
       
   492   to aid the description of what follows. 
       
   493 
       
   494   Two central notions in the nominal logic work are sorted atoms and
       
   495   sort-respecting permutations of atoms. We will use the letters @{text "a, b,
       
   496   c, \<dots>"} to stand for atoms and @{text "\<pi>, \<pi>\<^isub>1, \<dots>"} to stand for permutations,
       
   497   which in Nominal Isabelle have type @{typ perm}. The purpose of atoms is to
       
   498   represent variables, be they bound or free. The sorts of atoms can be used
       
   499   to represent different kinds of variables, such as the term-, coercion- and
       
   500   type-variables in Core-Haskell.  It is assumed that there is an infinite
       
   501   supply of atoms for each sort. In the interest of brevity, we shall restrict
       
   502   ourselves in what follows to only one sort of atoms.
       
   503 
       
   504   Permutations are bijective functions from atoms to atoms that are 
       
   505   the identity everywhere except on a finite number of atoms. There is a 
       
   506   two-place permutation operation written
       
   507   @{text "_ \<bullet> _ "} and having the type @{text "perm \<Rightarrow> \<beta> \<Rightarrow> \<beta>"}
       
   508   where the generic type @{text "\<beta>"} is the type of the object 
       
   509   over which the permutation 
       
   510   acts. In Nominal Isabelle, the identity permutation is written as @{term "0::perm"},
       
   511   the composition of two permutations @{term "\<pi>\<^isub>1"} and @{term "\<pi>\<^isub>2"} as \mbox{@{term "\<pi>\<^isub>1 + \<pi>\<^isub>2"}} 
       
   512   (even if this operation is non-commutative), 
       
   513   and the inverse permutation of @{term "\<pi>"} as @{text "- \<pi>"}. The permutation
       
   514   operation is defined over Isabelle/HOL's type-hierarchy \cite{HuffmanUrban10};
       
   515   for example permutations acting on atoms, products, lists, permutations, sets, 
       
   516   functions and booleans are given by:
       
   517   
       
   518   \begin{equation}\label{permute}
       
   519   \mbox{\begin{tabular}{@ {}c@ {\hspace{10mm}}c@ {}}
       
   520   \begin{tabular}{@ {}l@ {}}
       
   521   @{text "\<pi> \<bullet> a \<equiv> \<pi> a"}\\
       
   522   @{thm permute_prod.simps[where p="\<pi>", no_vars, THEN eq_reflection]}\\[2mm]
       
   523   @{thm permute_list.simps(1)[where p="\<pi>", no_vars, THEN eq_reflection]}\\
       
   524   @{thm permute_list.simps(2)[where p="\<pi>", no_vars, THEN eq_reflection]}\\
       
   525   \end{tabular} &
       
   526   \begin{tabular}{@ {}l@ {}}
       
   527   @{thm permute_perm_def[where p="\<pi>" and q="\<pi>'", no_vars, THEN eq_reflection]}\\
       
   528   @{thm permute_set_def[where p="\<pi>", no_vars, THEN eq_reflection]}\\
       
   529   @{text "\<pi> \<bullet> f \<equiv> \<lambda>x. \<pi> \<bullet> (f (- \<pi> \<bullet> x))"}\\
       
   530   @{thm permute_bool_def[where p="\<pi>", no_vars, THEN eq_reflection]}
       
   531   \end{tabular}
       
   532   \end{tabular}}
       
   533   \end{equation}\smallskip
       
   534   
       
   535   \noindent
       
   536   Concrete permutations in Nominal Isabelle are built up from swappings, 
       
   537   written as \mbox{@{text "(a b)"}}, which are permutations that behave 
       
   538   as follows:
       
   539   
       
   540   \[
       
   541   @{text "(a b) = \<lambda>c. if a = c then b else if b = c then a else c"}
       
   542   \]\smallskip
       
   543 
       
   544   The most original aspect of the nominal logic work of Pitts is a general
       
   545   definition for the notion of the `set of free variables of an object @{text
       
   546   "x"}'.  This notion, written @{term "supp x"}, is general in the sense that
       
   547   it applies not only to lambda-terms (alpha-equated or not), but also to lists,
       
   548   products, sets and even functions. Its definition depends only on the
       
   549   permutation operation and on the notion of equality defined for the type of
       
   550   @{text x}, namely:
       
   551   
       
   552   \begin{equation}\label{suppdef}
       
   553   @{thm supp_def[no_vars, THEN eq_reflection]}
       
   554   \end{equation}\smallskip
       
   555 
       
   556   \noindent
       
   557   There is also the derived notion for when an atom @{text a} is \emph{fresh}
       
   558   for an @{text x}, defined as 
       
   559 
       
   560   \[
       
   561   @{thm fresh_def[no_vars]}
       
   562   \]\smallskip
       
   563 
       
   564   \noindent
       
   565   We use for sets of atoms the abbreviation 
       
   566   @{thm (lhs) fresh_star_def[no_vars]}, defined as 
       
   567   @{thm (rhs) fresh_star_def[no_vars]}.
       
   568   A striking consequence of these definitions is that we can prove
       
   569   without knowing anything about the structure of @{term x} that
       
   570   swapping two fresh atoms, say @{text a} and @{text b}, leaves 
       
   571   @{text x} unchanged, namely 
       
   572   
       
   573   \begin{prop}\label{swapfreshfresh}
       
   574   If @{thm (prem 1) swap_fresh_fresh[no_vars]} and @{thm (prem 2) swap_fresh_fresh[no_vars]}
       
   575   then @{thm (concl) swap_fresh_fresh[no_vars]}.
       
   576   \end{prop}
       
   577   
       
   578   While often the support of an object can be relatively easily 
       
   579   described, for example for atoms, products, lists, function applications, 
       
   580   booleans and permutations as follows
       
   581   
       
   582   \begin{equation}\label{supps}\mbox{
       
   583   \begin{tabular}{c@ {\hspace{10mm}}c}
       
   584   \begin{tabular}{rcl}
       
   585   @{term "supp a"} & $=$ & @{term "{a}"}\\
       
   586   @{term "supp (x, y)"} & $=$ & @{term "supp x \<union> supp y"}\\
       
   587   @{term "supp []"} & $=$ & @{term "{}"}\\
       
   588   @{term "supp (x#xs)"} & $=$ & @{term "supp x \<union> supp xs"}\\
       
   589   \end{tabular}
       
   590   &
       
   591   \begin{tabular}{rcl}
       
   592   @{text "supp (f x)"} & @{text "\<subseteq>"} & @{term "supp f \<union> supp x"}\\
       
   593   @{term "supp b"} & $=$ & @{term "{}"}\\
       
   594   @{term "supp \<pi>"} & $=$ & @{term "{a. \<pi> \<bullet> a \<noteq> a}"}
       
   595   \end{tabular}
       
   596   \end{tabular}}
       
   597   \end{equation}\smallskip
       
   598   
       
   599   \noindent 
       
   600   in some cases it can be difficult to characterise the support precisely, and
       
   601   only an approximation can be established (as for function applications
       
   602   above). Reasoning about such approximations can be simplified with the
       
   603   notion \emph{supports}, defined as follows:
       
   604   
       
   605   \begin{defi}
       
   606   A set @{text S} \emph{supports} @{text x}, if for all atoms @{text a} and @{text b}
       
   607   not in @{text S} we have @{term "(a \<rightleftharpoons> b) \<bullet> x = x"}.
       
   608   \end{defi}
       
   609   
       
   610   \noindent
       
   611   The main point of @{text supports} is that we can establish the following 
       
   612   two properties.
       
   613   
       
   614   \begin{prop}\label{supportsprop}
       
   615   Given a set @{text "bs"} of atoms.\\
       
   616   {\it (i)} If @{thm (prem 1) supp_is_subset[where S="bs", no_vars]}
       
   617   and @{thm (prem 2) supp_is_subset[where S="bs", no_vars]} then 
       
   618   @{thm (concl) supp_is_subset[where S="bs", no_vars]}.\\
       
   619   {\it (ii)} @{thm supp_supports[no_vars]}.
       
   620   \end{prop}
       
   621   
       
   622   Another important notion in the nominal logic work is \emph{equivariance}.
       
   623   For a function @{text f} to be equivariant 
       
   624   it is required that every permutation leaves @{text f} unchanged, that is
       
   625   
       
   626   \begin{equation}\label{equivariancedef}
       
   627   @{term "\<forall>\<pi>. \<pi> \<bullet> f = f"}\;.
       
   628   \end{equation}\smallskip
       
   629   
       
   630   \noindent
       
   631   If a function is of type @{text "\<alpha> \<Rightarrow> \<beta>"}, say, this definition is equivalent to 
       
   632   the fact that a permutation applied to the application
       
   633   @{text "f x"} can be moved to the argument @{text x}. That means for 
       
   634   such functions, we have for all permutations @{text "\<pi>"}:
       
   635   
       
   636   \begin{equation}\label{equivariance}
       
   637   @{text "\<pi> \<bullet> f = f"} \;\;\;\;\textit{if and only if}\;\;\;\;
       
   638   @{text "\<forall>x. \<pi> \<bullet> (f x) = f (\<pi> \<bullet> x)"}\;.
       
   639   \end{equation}\smallskip
       
   640    
       
   641   \noindent
       
   642   There is
       
   643   also a similar property for relations, which are in HOL functions of type @{text "\<alpha> \<Rightarrow> \<beta> \<Rightarrow> bool"}.
       
   644   Suppose a relation @{text R}, then for all permutations @{text \<pi>}:
       
   645   
       
   646   \[
       
   647   @{text "\<pi> \<bullet> R = R"} \;\;\;\;\textit{if and only if}\;\;\;\;
       
   648   @{text "\<forall>x y."}~~@{text "x R y"} \;\textit{implies}\; @{text "(\<pi> \<bullet> x) R (\<pi> \<bullet> y)"}\;.
       
   649   \]\smallskip
       
   650 
       
   651   \noindent
       
   652   Note that from property \eqref{equivariancedef} and the definition of @{text supp}, we 
       
   653   can easily deduce that for a function being equivariant is equivalent to having empty support.
       
   654 
       
   655   Using freshness, the nominal logic work provides us with general means for renaming 
       
   656   binders. 
       
   657   
       
   658   \noindent
       
   659   While in the older version of Nominal Isabelle, we used extensively 
       
   660   Proposition~\ref{swapfreshfresh} to rename single binders, this property 
       
   661   proved too unwieldy for dealing with multiple binders. For such binders the 
       
   662   following generalisations turned out to be easier to use.
       
   663 
       
   664   \begin{prop}\label{supppermeq}
       
   665   @{thm[mode=IfThen] supp_perm_eq[where p="\<pi>", no_vars]}
       
   666   \end{prop}
       
   667 
       
   668   \begin{prop}\label{avoiding}
       
   669   For a finite set @{text as} and a finitely supported @{text x} with
       
   670   @{term "as \<sharp>* x"} and also a finitely supported @{text c}, there
       
   671   exists a permutation @{text "\<pi>"} such that @{term "(\<pi> \<bullet> as) \<sharp>* c"} and
       
   672   @{term "supp x \<sharp>* \<pi>"}.
       
   673   \end{prop}
       
   674 
       
   675   \noindent
       
   676   The idea behind the second property is that given a finite set @{text as}
       
   677   of binders (being bound, or fresh, in @{text x} is ensured by the
       
   678   assumption @{term "as \<sharp>* x"}), then there exists a permutation @{text "\<pi>"} such that
       
   679   the renamed binders @{term "\<pi> \<bullet> as"} avoid @{text c} (which can be arbitrarily chosen
       
   680   as long as it is finitely supported) and also @{text "\<pi>"} does not affect anything
       
   681   in the support of @{text x} (that is @{term "supp x \<sharp>* \<pi>"}). The last 
       
   682   fact and Property~\ref{supppermeq} allow us to `rename' just the binders 
       
   683   @{text as} in @{text x}, because @{term "\<pi> \<bullet> x = x"}. 
       
   684 
       
   685   Note that @{term "supp x \<sharp>* \<pi>"}
       
   686   is equivalent with @{term "supp \<pi> \<sharp>* x"}, which means we could also formulate 
       
   687   Propositions \ref{supppermeq} and \ref{avoiding} in the other `direction'; however the 
       
   688   reasoning infrastructure of Nominal Isabelle is set up so that it provides more
       
   689   automation for the formulation given above.
       
   690 
       
   691   Most properties given in this section are described in detail in \cite{HuffmanUrban10}
       
   692   and all are formalised in Isabelle/HOL. In the next sections we will make 
       
   693   use of these properties in order to define alpha-equivalence in 
       
   694   the presence of multiple binders.
       
   695 *}
       
   696 
       
   697 
       
   698 section {* Abstractions\label{sec:binders} *}
       
   699 
       
   700 text {*
       
   701   In Nominal Isabelle, the user is expected to write down a specification of a
       
   702   term-calculus and then a reasoning infrastructure is automatically derived
       
   703   from this specification (remember that Nominal Isabelle is a definitional
       
   704   extension of Isabelle/HOL, which does not introduce any new axioms).
       
   705 
       
   706   In order to keep our work with deriving the reasoning infrastructure
       
   707   manageable, we will wherever possible state definitions and perform proofs
       
   708   on the `user-level' of Isabelle/HOL, as opposed to writing custom ML-code that
       
   709   generates them anew for each specification. 
       
   710   To that end, we will consider
       
   711   first pairs @{text "(as, x)"} of type @{text "(atom set) \<times> \<beta>"}.  These pairs
       
   712   are intended to represent the abstraction, or binding, of the set of atoms @{text
       
   713   "as"} in the body @{text "x"}.
       
   714 
       
   715   The first question we have to answer is when two pairs @{text "(as, x)"} and
       
   716   @{text "(bs, y)"} are alpha-equivalent? (For the moment we are interested in
       
   717   the notion of alpha-equivalence that is \emph{not} preserved by adding
       
   718   vacuous binders.) To answer this question, we identify four conditions: {\it (i)}
       
   719   given a free-atom function @{text "fa"} of type \mbox{@{text "\<beta> \<Rightarrow> atom
       
   720   set"}}, then @{text "(as, x)"} and @{text "(bs, y)"} need to have the same set of free
       
   721   atoms; moreover there must be a permutation @{text \<pi>} such that {\it
       
   722   (ii)} @{text \<pi>} leaves the free atoms of @{text "(as, x)"} and @{text "(bs, y)"} unchanged, but
       
   723   {\it (iii)} `moves' their bound names so that we obtain modulo a relation,
       
   724   say \mbox{@{text "_ R _"}}, two equivalent terms. We also require that {\it (iv)}
       
   725   @{text \<pi>} makes the sets of abstracted atoms @{text as} and @{text bs} equal. The
       
   726   requirements {\it (i)} to {\it (iv)} can be stated formally as:
       
   727 
       
   728   \begin{defi}[Alpha-Equivalence for Set-Bindings]\label{alphaset}\mbox{}\\
       
   729   \begin{tabular}{@ {\hspace{10mm}}l@ {\hspace{5mm}}rl}  
       
   730   @{term "alpha_set_ex (as, x) R fa (bs, y)"}\hspace{2mm}@{text "\<equiv>"} & 
       
   731     \multicolumn{2}{@ {}l}{if there exists a @{text "\<pi>"} such that:}\\ 
       
   732        & \mbox{\it (i)}   & @{term "fa(x) - as = fa(y) - bs"}\\
       
   733        & \mbox{\it (ii)}  & @{term "(fa(x) - as) \<sharp>* \<pi>"}\\
       
   734        & \mbox{\it (iii)} &  @{text "(\<pi> \<bullet> x) R y"} \\
       
   735        & \mbox{\it (iv)}  & @{term "(\<pi> \<bullet> as) = bs"} \\ 
       
   736   \end{tabular}
       
   737   \end{defi}
       
   738  
       
   739   \noindent
       
   740   Note that the relation is
       
   741   dependent on a free-atom function @{text "fa"} and a relation @{text
       
   742   "R"}. The reason for this extra generality is that we will use
       
   743   $\approx_{\,\textit{set}}^{\textit{R}, \textit{fa}}$ for both raw terms and 
       
   744   alpha-equated terms. In
       
   745   the latter case, @{text R} will be replaced by equality @{text "="} and we
       
   746   will prove that @{text "fa"} is equal to @{text "supp"}.
       
   747 
       
   748   Definition \ref{alphaset} does not make any distinction between the
       
   749   order of abstracted atoms. If we want this, then we can define alpha-equivalence 
       
   750   for pairs of the form \mbox{@{text "(as, x)"}} with type @{text "(atom list) \<times> \<beta>"} 
       
   751   as follows
       
   752   
       
   753   \begin{defi}[Alpha-Equivalence for List-Bindings]\label{alphalist}\mbox{}\\
       
   754   \begin{tabular}{@ {\hspace{10mm}}l@ {\hspace{5mm}}rl}  
       
   755   @{term "alpha_lst_ex (as, x) R fa (bs, y)"}\hspace{2mm}@{text "\<equiv>"} &
       
   756   \multicolumn{2}{@ {}l}{if there exists a @{text "\<pi>"} such that:}\\ 
       
   757          & \mbox{\it (i)}   & @{term "fa(x) - (set as) = fa(y) - (set bs)"}\\ 
       
   758          & \mbox{\it (ii)}  & @{term "(fa(x) - set as) \<sharp>* \<pi>"}\\
       
   759          & \mbox{\it (iii)} & @{text "(\<pi> \<bullet> x) R y"}\\
       
   760          & \mbox{\it (iv)}  & @{term "(\<pi> \<bullet> as) = bs"}\\
       
   761   \end{tabular}
       
   762   \end{defi}
       
   763   
       
   764   \noindent
       
   765   where @{term set} is the function that coerces a list of atoms into a set of atoms.
       
   766   Now the last clause ensures that the order of the binders matters (since @{text as}
       
   767   and @{text bs} are lists of atoms).
       
   768 
       
   769   If we do not want to make any difference between the order of binders \emph{and}
       
   770   also allow vacuous binders, that means according to Pitts~\cite{Pitts04} 
       
   771   \emph{restrict} atoms, then we keep sets of binders, but drop 
       
   772   condition {\it (iv)} in Definition~\ref{alphaset}:
       
   773 
       
   774   \begin{defi}[Alpha-Equivalence for Set+-Bindings]\label{alphares}\mbox{}\\
       
   775   \begin{tabular}{@ {\hspace{10mm}}l@ {\hspace{5mm}}rl}  
       
   776   @{term "alpha_res_ex (as, x) R fa (bs, y)"}\hspace{2mm}@{text "\<equiv>"} &
       
   777   \multicolumn{2}{@ {}l}{if there exists a @{text "\<pi>"} such that:}\\ 
       
   778              & \mbox{\it (i)}   & @{term "fa(x) - as = fa(y) - bs"}\\
       
   779              & \mbox{\it (ii)}  & @{term "(fa(x) - as) \<sharp>* \<pi>"}\\
       
   780              & \mbox{\it (iii)} & @{text "(\<pi> \<bullet> x) R y"}\\
       
   781   \end{tabular}
       
   782   \end{defi}
       
   783 
       
   784 
       
   785   It might be useful to consider first some examples how these definitions
       
   786   of alpha-equivalence pan out in practice.  For this consider the case of
       
   787   abstracting a set of atoms over types (as in type-schemes). We set
       
   788   @{text R} to be the usual equality @{text "="} and for @{text "fa(T)"} we
       
   789   define
       
   790   
       
   791   \[
       
   792   @{text "fa(x) \<equiv> {x}"}  \hspace{10mm} @{text "fa(T\<^isub>1 \<rightarrow> T\<^isub>2) \<equiv> fa(T\<^isub>1) \<union> fa(T\<^isub>2)"}
       
   793   \]\smallskip
       
   794 
       
   795   \noindent
       
   796   Now recall the examples shown in \eqref{ex1} and
       
   797   \eqref{ex3}. It can be easily checked that @{text "({x, y}, x \<rightarrow> y)"} and
       
   798   @{text "({x, y}, y \<rightarrow> x)"} are alpha-equivalent according to
       
   799   $\approx_{\,\textit{set}}$ and $\approx_{\,\textit{set+}}$ by taking @{text "\<pi>"} to
       
   800   be the swapping @{term "(x \<rightleftharpoons> y)"}. In case of @{text "x \<noteq> y"}, then @{text
       
   801   "([x, y], x \<rightarrow> y)"} $\not\approx_{\,\textit{list}}$ @{text "([y, x], x \<rightarrow> y)"}
       
   802   since there is no permutation that makes the lists @{text "[x, y]"} and
       
   803   @{text "[y, x]"} equal, and also leaves the type \mbox{@{text "x \<rightarrow> y"}}
       
   804   unchanged. Another example is @{text "({x}, x)"} $\approx_{\,\textit{set+}}$
       
   805   @{text "({x, y}, x)"} which holds by taking @{text "\<pi>"} to be the identity
       
   806   permutation.  However, if @{text "x \<noteq> y"}, then @{text "({x}, x)"}
       
   807   $\not\approx_{\,\textit{set}}$ @{text "({x, y}, x)"} since there is no
       
   808   permutation that makes the sets @{text "{x}"} and @{text "{x, y}"} equal
       
   809   (similarly for $\approx_{\,\textit{list}}$).  It can also relatively easily be
       
   810   shown that all three notions of alpha-equivalence coincide, if we only
       
   811   abstract a single atom. In this case they also agree with the alpha-equivalence
       
   812   used in older versions of Nominal Isabelle \cite{Urban08}.\footnote{We omit a
       
   813   proof of this fact since the details are hairy and not really important for the
       
   814   purpose of this paper.}
       
   815 
       
   816   In the rest of this section we are going to show that the alpha-equivalences
       
   817   really lead to abstractions where some atoms are bound (or more precisely
       
   818   removed from the support).  For this we will consider three abstraction
       
   819   types that are quotients of the relations
       
   820 
       
   821   \begin{equation}
       
   822   \begin{array}{r}
       
   823   @{term "alpha_set_ex (as, x) equal supp (bs, y)"}\smallskip\\
       
   824   @{term "alpha_res_ex (as, x) equal supp (bs, y)"}\smallskip\\
       
   825   @{term "alpha_lst_ex (as, x) equal supp (bs, y)"}\\
       
   826   \end{array}
       
   827   \end{equation}\smallskip
       
   828   
       
   829   \noindent
       
   830   Note that in these relations we replaced the free-atom function @{text "fa"}
       
   831   with @{term "supp"} and the relation @{text R} with equality. We can show
       
   832   the following two properties:
       
   833 
       
   834   \begin{lem}\label{alphaeq} 
       
   835   The relations $\approx_{\,\textit{set}}^{=, \textit{supp}}$, 
       
   836   $\approx_{\,\textit{set+}}^{=, \textit{supp}}$
       
   837   and $\approx_{\,\textit{list}}^{=, \textit{supp}}$ are 
       
   838   equivalence relations and equivariant. 
       
   839   \end{lem}
       
   840 
       
   841   \begin{proof}
       
   842   Reflexivity is by taking @{text "\<pi>"} to be @{text "0"}. For symmetry we have
       
   843   a permutation @{text "\<pi>"} and for the proof obligation take @{term "-
       
   844   \<pi>"}. In case of transitivity, we have two permutations @{text "\<pi>\<^isub>1"}
       
   845   and @{text "\<pi>\<^isub>2"}, and for the proof obligation use @{text
       
   846   "\<pi>\<^isub>1 + \<pi>\<^isub>2"}. Equivariance means @{term "alpha_set_ex (\<pi> \<bullet> as,
       
   847   \<pi> \<bullet> x) equal supp (\<pi> \<bullet> bs, \<pi> \<bullet> y)"} holds provided \mbox{@{term
       
   848   "alpha_set_ex (as, x) equal supp(bs, y)"}} holds. From the assumption we
       
   849   have a permutation @{text "\<pi>'"} and for the proof obligation use @{text "\<pi> \<bullet>
       
   850   \<pi>'"}. To show equivariance, we need to `pull out' the permutations,
       
   851   which is possible since all operators, namely as @{text "#\<^sup>*, -, =, \<bullet>,
       
   852   set"} and @{text "supp"}, are equivariant (see
       
   853   \cite{HuffmanUrban10}). Finally, we apply the permutation operation on
       
   854   booleans.
       
   855   \end{proof}
       
   856 
       
   857   \noindent
       
   858   Recall the picture shown in \eqref{picture} about new types in HOL.
       
   859   The lemma above allows us to use our quotient package for introducing 
       
   860   new types @{text "\<beta> abs\<^bsub>set\<^esub>"}, @{text "\<beta> abs\<^bsub>set+\<^esub>"} and @{text "\<beta> abs\<^bsub>list\<^esub>"}
       
   861   representing alpha-equivalence classes of pairs of type 
       
   862   @{text "(atom set) \<times> \<beta>"} (in the first two cases) and of type @{text "(atom list) \<times> \<beta>"}
       
   863   (in the third case). 
       
   864   The elements in these types will be, respectively, written as
       
   865   
       
   866   \[
       
   867   @{term "Abs_set as x"} \hspace{10mm} 
       
   868   @{term "Abs_res as x"} \hspace{10mm}
       
   869   @{term "Abs_lst as x"} 
       
   870   \]\smallskip
       
   871   
       
   872   \noindent
       
   873   indicating that a set (or list) of atoms @{text as} is abstracted in @{text x}. We will
       
   874   call the types \emph{abstraction types} and their elements
       
   875   \emph{abstractions}. The important property we need to derive is the support of 
       
   876   abstractions, namely:
       
   877 
       
   878   \begin{thm}[Support of Abstractions]\label{suppabs} 
       
   879   Assuming @{text x} has finite support, then
       
   880 
       
   881   \[
       
   882   \begin{array}{l@ {\;=\;}l}
       
   883   @{thm (lhs) supp_Abs(1)[no_vars]} & @{thm (rhs) supp_Abs(1)[no_vars]}\\
       
   884   @{thm (lhs) supp_Abs(2)[no_vars]} & @{thm (rhs) supp_Abs(2)[no_vars]}\\
       
   885   @{thm (lhs) supp_Abs(3)[where bs="as", no_vars]} &
       
   886   @{thm (rhs) supp_Abs(3)[where bs="as", no_vars]}\\
       
   887   \end{array}
       
   888   \]\smallskip
       
   889   \end{thm}
       
   890 
       
   891   \noindent
       
   892   In effect, this theorem states that the atoms @{text "as"} are bound in the
       
   893   abstraction. As stated earlier, this can be seen as a litmus test that our
       
   894   Definitions \ref{alphaset}, \ref{alphalist} and \ref{alphares} capture the
       
   895   idea of alpha-equivalence relations. Below we will give the proof for the
       
   896   first equation of Theorem \ref{suppabs}. The others follow by similar
       
   897   arguments. By definition of the abstraction type @{text
       
   898   "abs\<^bsub>set\<^esub>"} we have
       
   899 
       
   900   \begin{equation}\label{abseqiff}
       
   901   @{thm (lhs) Abs_eq_iff(1)[where bs="as" and bs'="bs", no_vars]} \;\;\;\text{if and only if}\;\;\; 
       
   902   @{term "alpha_set_ex (as, x) equal supp (bs, y)"}
       
   903   \end{equation}\smallskip
       
   904   
       
   905   \noindent
       
   906   and also set
       
   907   
       
   908   \begin{equation}\label{absperm}
       
   909   @{thm permute_Abs(1)[where p="\<pi>", no_vars, THEN eq_reflection]}
       
   910   \end{equation}\smallskip
       
   911 
       
   912   \noindent
       
   913   With this at our disposal, we can show 
       
   914   the following lemma about swapping two atoms in an abstraction.
       
   915   
       
   916   \begin{lem}
       
   917   If @{thm (prem 1) Abs_swap1(1)[where bs="as", no_vars]} and
       
   918   @{thm (prem 2) Abs_swap1(1)[where bs="as", no_vars]} then 
       
   919   @{thm (concl) Abs_swap1(1)[where bs="as", no_vars]}
       
   920   \end{lem}
       
   921   
       
   922   \begin{proof}
       
   923   If @{term "a = b"} the lemma is immediate, since @{term "(a \<rightleftharpoons> b)"} is then
       
   924   the identity permutation.
       
   925   Also in the other case the lemma is straightforward using \eqref{abseqiff}
       
   926   and observing that the assumptions give us @{term "(a \<rightleftharpoons> b) \<bullet> (supp x - as) =
       
   927   (supp x - as)"}.  We therefore can use the swapping @{term "(a \<rightleftharpoons> b)"} as
       
   928   the permutation for the proof obligation.
       
   929   \end{proof}
       
   930   
       
   931   \noindent
       
   932   This lemma together 
       
   933   with \eqref{absperm} allows us to show
       
   934   
       
   935   \begin{equation}\label{halfone}
       
   936   @{thm Abs_supports(1)[no_vars]}
       
   937   \end{equation}\smallskip
       
   938   
       
   939   \noindent
       
   940   which by Property~\ref{supportsprop} gives us `one half' of
       
   941   Theorem~\ref{suppabs}. To establish the `other half', we 
       
   942   use a trick from \cite{Pitts04} and first define an auxiliary 
       
   943   function @{text aux}, taking an abstraction as argument
       
   944 
       
   945   \[
       
   946   @{thm supp_set.simps[THEN eq_reflection, no_vars]}
       
   947   \]\smallskip 
       
   948 
       
   949   \noindent
       
   950   Using the second equation in \eqref{equivariance}, we can show that 
       
   951   @{text "aux"} is equivariant (since @{term "\<pi> \<bullet> (supp x - as) = (supp (\<pi> \<bullet> x)) - (\<pi> \<bullet> as)"}) 
       
   952   and therefore has empty support. 
       
   953   This in turn means
       
   954   
       
   955   \[
       
   956   @{term "supp (supp_set (Abs_set as x)) \<subseteq> supp (Abs_set as x)"}
       
   957   \]\smallskip
       
   958   
       
   959   \noindent
       
   960   using the fact about the support of function applications in \eqref{supps}. Assuming 
       
   961   @{term "supp x - as"} is a finite set, we further obtain
       
   962   
       
   963   \begin{equation}\label{halftwo}
       
   964   @{thm (concl) Abs_supp_subset1(1)[no_vars]}
       
   965   \end{equation}\smallskip
       
   966   
       
   967   \noindent
       
   968   This is because for every finite set of atoms, say @{text "bs"}, we have 
       
   969   @{thm (concl) supp_finite_atom_set[where S="bs", no_vars]}.\footnote{Note that this is not 
       
   970   the case for infinite sets.}
       
   971   Finally, taking \eqref{halfone} and \eqref{halftwo} together establishes 
       
   972   the first equation of Theorem~\ref{suppabs}. The others are similar.
       
   973 
       
   974   Recall the definition of support given in \eqref{suppdef}, and note the difference between 
       
   975   the support of a raw pair and an abstraction
       
   976 
       
   977   \[
       
   978   @{term "supp (as, x) = supp as \<union> supp x"}\hspace{15mm}
       
   979   @{term "supp (Abs_set as x) = supp x - as"}
       
   980   \]\smallskip
       
   981 
       
   982   \noindent
       
   983   While the permutation operations behave in both cases the same (a permutation
       
   984   is just moved to the arguments), the notion of equality is different for pairs and
       
   985   abstractions. Therefore we have different supports. In case of abstractions,
       
   986   we have established in Theorem~\ref{suppabs} that bound atoms are removed from 
       
   987   the support of the abstractions' bodies.
       
   988 
       
   989   The method of first considering abstractions of the form @{term "Abs_set as
       
   990   x"} etc is motivated by the fact that we can conveniently establish at the
       
   991   Isabelle/HOL level properties about them.  It would be extremely laborious
       
   992   to write custom ML-code that derives automatically such properties for every
       
   993   term-constructor that binds some atoms. Also the generality of the
       
   994   definitions for alpha-equivalence will help us in the next sections.
       
   995 *}
       
   996 
       
   997 section {* Specifying General Bindings\label{sec:spec} *}
       
   998 
       
   999 text {*
       
  1000   Our choice of syntax for specifications is influenced by the existing
       
  1001   datatype package of Isabelle/HOL \cite{Berghofer99} 
       
  1002   and by the syntax of the
       
  1003   Ott-tool \cite{ott-jfp}. For us a specification of a term-calculus is a
       
  1004   collection of (possibly mutually recursive) type declarations, say @{text
       
  1005   "ty\<AL>\<^isub>1, \<dots>, ty\<AL>\<^isub>n"}, and an associated collection of
       
  1006   binding functions, say @{text "bn\<AL>\<^isub>1, \<dots>, bn\<AL>\<^isub>m"}. The
       
  1007   syntax in Nominal Isabelle for such specifications is schematically as follows:
       
  1008   
       
  1009   \begin{equation}\label{scheme}
       
  1010   \mbox{\begin{tabular}{@ {}p{2.5cm}l}
       
  1011   type \mbox{declaration part} &
       
  1012   $\begin{cases}
       
  1013   \mbox{\begin{tabular}{l}
       
  1014   \isacommand{nominal\_datatype} @{text "ty\<AL>\<^isub>1 = \<dots>"}\\
       
  1015   \isacommand{and} @{text "ty\<AL>\<^isub>2 = \<dots>"}\\
       
  1016   \raisebox{2mm}{$\ldots$}\\[-2mm] 
       
  1017   \isacommand{and} @{text "ty\<AL>\<^isub>n = \<dots>"}\\ 
       
  1018   \end{tabular}}
       
  1019   \end{cases}$\\[2mm]
       
  1020   binding \mbox{function part} &
       
  1021   $\begin{cases}
       
  1022   \mbox{\begin{tabular}{l}
       
  1023   \isacommand{binder} @{text "bn\<AL>\<^isub>1"} \isacommand{and} \ldots \isacommand{and} @{text "bn\<AL>\<^isub>m"}\\
       
  1024   \isacommand{where}\\
       
  1025   \raisebox{2mm}{$\ldots$}\\[-2mm]
       
  1026   \end{tabular}}
       
  1027   \end{cases}$\\
       
  1028   \end{tabular}}
       
  1029   \end{equation}\smallskip
       
  1030 
       
  1031   \noindent
       
  1032   Every type declaration @{text ty}$^\alpha_{1..n}$ consists of a collection
       
  1033   of term-constructors, each of which comes with a list of labelled types that
       
  1034   stand for the types of the arguments of the term-constructor.  For example a
       
  1035   term-constructor @{text "C\<^sup>\<alpha>"} might be specified with
       
  1036 
       
  1037   \[
       
  1038   @{text "C\<^sup>\<alpha> label\<^isub>1::ty"}\mbox{$'_1$} @{text "\<dots> label\<^isub>l::ty"}\mbox{$'_l\;\;\;\;\;$}  
       
  1039   @{text "binding_clauses"} 
       
  1040   \]\smallskip
       
  1041   
       
  1042   \noindent
       
  1043   whereby some of the @{text ty}$'_{1..l}$ (or their components) can be
       
  1044   contained in the collection of @{text ty}$^\alpha_{1..n}$ declared in
       
  1045   \eqref{scheme}. In this case we will call the corresponding argument a
       
  1046   \emph{recursive argument} of @{text "C\<^sup>\<alpha>"}. The types of such
       
  1047   recursive arguments need to satisfy a `positivity' restriction, which
       
  1048   ensures that the type has a set-theoretic semantics (see
       
  1049   \cite{Berghofer99}). If the types are polymorphic, we require the
       
  1050   type variables to stand for types that are finitely supported and over which 
       
  1051   a permutation operation is defined.
       
  1052   The labels @{text "label"}$_{1..l}$ annotated on the types are optional. Their
       
  1053   purpose is to be used in the (possibly empty) list of \emph{binding
       
  1054   clauses}, which indicate the binders and their scope in a term-constructor.
       
  1055   They come in three \emph{modes}:
       
  1056 
       
  1057 
       
  1058   \[\mbox{
       
  1059   \begin{tabular}{@ {}l@ {}}
       
  1060   \isacommand{binds} {\it binders} \isacommand{in} {\it bodies}\\
       
  1061   \isacommand{binds (set)} {\it binders} \isacommand{in} {\it bodies}\\
       
  1062   \isacommand{binds (set+)} {\it binders} \isacommand{in} {\it bodies}
       
  1063   \end{tabular}}
       
  1064   \]\smallskip
       
  1065   
       
  1066   \noindent
       
  1067   The first mode is for binding lists of atoms (the order of bound atoms
       
  1068   matters); the second is for sets of binders (the order does not matter, but
       
  1069   the cardinality does) and the last is for sets of binders (with vacuous
       
  1070   binders preserving alpha-equivalence). As indicated, the labels in the
       
  1071   `\isacommand{in}-part' of a binding clause will be called \emph{bodies};
       
  1072   the `\isacommand{binds}-part' will be called \emph{binders}. In contrast to
       
  1073   Ott, we allow multiple labels in binders and bodies.  For example we allow
       
  1074   binding clauses of the form:
       
  1075  
       
  1076   \[\mbox{
       
  1077   \begin{tabular}{@ {}ll@ {}}
       
  1078   @{text "Foo\<^isub>1 x::name y::name t::trm s::trm"} &  
       
  1079       \isacommand{binds} @{text "x y"} \isacommand{in} @{text "t s"}\\
       
  1080   @{text "Foo\<^isub>2 x::name y::name t::trm s::trm"} &  
       
  1081       \isacommand{binds} @{text "x y"} \isacommand{in} @{text "t"}, 
       
  1082       \isacommand{binds} @{text "x y"} \isacommand{in} @{text "s"}\\
       
  1083   \end{tabular}}
       
  1084   \]\smallskip
       
  1085 
       
  1086   \noindent
       
  1087   Similarly for the other binding modes. Interestingly, in case of
       
  1088   \isacommand{binds (set)} and \isacommand{binds (set+)} the binding clauses
       
  1089   above will make a difference to the semantics of the specifications (the
       
  1090   corresponding alpha-equivalence will differ). We will show this later with
       
  1091   an example.
       
  1092 
       
  1093   
       
  1094   There are also some restrictions we need to impose on our binding clauses in
       
  1095   comparison to Ott. The main idea behind these restrictions is
       
  1096   that we obtain a notion of alpha-equivalence where it is ensured
       
  1097   that within a given scope an atom occurrence cannot be both bound and free
       
  1098   at the same time.  The first restriction is that a body can only occur in
       
  1099   \emph{one} binding clause of a term constructor. So for example
       
  1100 
       
  1101   \[\mbox{
       
  1102   @{text "Foo x::name y::name t::trm"}\hspace{3mm}  
       
  1103   \isacommand{binds} @{text "x"} \isacommand{in} @{text "t"},
       
  1104   \isacommand{binds} @{text "y"} \isacommand{in} @{text "t"}}
       
  1105   \]\smallskip
       
  1106 
       
  1107   \noindent
       
  1108   is not allowed. This ensures that the bound atoms of a body cannot be free
       
  1109   at the same time by specifying an alternative binder for the same body.
       
  1110 
       
  1111   For binders we distinguish between \emph{shallow} and \emph{deep} binders.
       
  1112   Shallow binders are just labels. The restriction we need to impose on them
       
  1113   is that in case of \isacommand{binds (set)} and \isacommand{binds (set+)} the
       
  1114   labels must either refer to atom types or to sets of atom types; in case of
       
  1115   \isacommand{binds} the labels must refer to atom types or to lists of atom
       
  1116   types. Two examples for the use of shallow binders are the specification of
       
  1117   lambda-terms, where a single name is bound, and type-schemes, where a finite
       
  1118   set of names is bound:
       
  1119 
       
  1120   \[\mbox{
       
  1121   \begin{tabular}{@ {}c@ {\hspace{8mm}}c@ {}}
       
  1122   \begin{tabular}{@ {}l}
       
  1123   \isacommand{nominal\_datatype} @{text lam} $=$\\
       
  1124   \hspace{2mm}\phantom{$\mid$}~@{text "Var name"}\\
       
  1125   \hspace{2mm}$\mid$~@{text "App lam lam"}\\
       
  1126   \hspace{2mm}$\mid$~@{text "Lam x::name t::lam"}\hspace{3mm}%
       
  1127   \isacommand{binds} @{text x} \isacommand{in} @{text t}\\
       
  1128   \\
       
  1129   \end{tabular} &
       
  1130   \begin{tabular}{@ {}l@ {}}
       
  1131   \isacommand{nominal\_datatype}~@{text ty} $=$\\
       
  1132   \hspace{2mm}\phantom{$\mid$}~@{text "TVar name"}\\
       
  1133   \hspace{2mm}$\mid$~@{text "TFun ty ty"}\\
       
  1134   \isacommand{and}~@{text "tsc ="}\\
       
  1135   \hspace{2mm}\phantom{$\mid$}~@{text "TAll xs::(name fset) T::ty"}\hspace{3mm}%
       
  1136   \isacommand{binds (set+)} @{text xs} \isacommand{in} @{text T}\\
       
  1137   \end{tabular}
       
  1138   \end{tabular}}
       
  1139   \]\smallskip
       
  1140 
       
  1141 
       
  1142   \noindent
       
  1143   In these specifications @{text "name"} refers to a (concrete) atom type, and @{text
       
  1144   "fset"} to the type of finite sets.  Note that for @{text Lam} it does not
       
  1145   matter which binding mode we use. The reason is that we bind only a single
       
  1146   @{text name}, in which case all three binding modes coincide. However, having 
       
  1147   \isacommand{binds (set)} or just \isacommand{binds}
       
  1148   in the second case makes a difference to the semantics of the specification
       
  1149   (which we will define in the next section).
       
  1150 
       
  1151   A \emph{deep} binder uses an auxiliary binding function that `picks' out
       
  1152   the atoms in one argument of the term-constructor, which can be bound in
       
  1153   other arguments and also in the same argument (we will call such binders
       
  1154   \emph{recursive}, see below). The binding functions are
       
  1155   expected to return either a set of atoms (for \isacommand{binds (set)} and
       
  1156   \isacommand{binds (set+)}) or a list of atoms (for \isacommand{binds}). They need
       
  1157   to be defined by recursion over the corresponding type; the equations
       
  1158   must be given in the binding function part of the scheme shown in
       
  1159   \eqref{scheme}. For example a term-calculus containing @{text "Let"}s with
       
  1160   tuple patterns may be specified as:
       
  1161 
       
  1162   \begin{equation}\label{letpat}
       
  1163   \mbox{%
       
  1164   \begin{tabular}{l}
       
  1165   \isacommand{nominal\_datatype} @{text trm} $=$\\
       
  1166   \hspace{5mm}\phantom{$\mid$}~@{term "Var name"}\\
       
  1167   \hspace{5mm}$\mid$~@{term "App trm trm"}\\
       
  1168   \hspace{5mm}$\mid$~@{text "Lam x::name t::trm"} 
       
  1169      \;\;\isacommand{binds} @{text x} \isacommand{in} @{text t}\\
       
  1170   \hspace{5mm}$\mid$~@{text "Let_pat p::pat trm t::trm"} 
       
  1171      \;\;\isacommand{binds} @{text "bn(p)"} \isacommand{in} @{text t}\\
       
  1172   \isacommand{and} @{text pat} $=$\\
       
  1173   \hspace{5mm}\phantom{$\mid$}~@{text "PVar name"}\\
       
  1174   \hspace{5mm}$\mid$~@{text "PTup pat pat"}\\ 
       
  1175   \isacommand{binder}~@{text "bn::pat \<Rightarrow> atom list"}\\
       
  1176   \isacommand{where}~@{text "bn(PVar x) = [atom x]"}\\
       
  1177   \hspace{5mm}$\mid$~@{text "bn(PTup p\<^isub>1 p\<^isub>2) = bn(p\<^isub>1) @ bn(p\<^isub>2)"}\smallskip\\ 
       
  1178   \end{tabular}}
       
  1179   \end{equation}\smallskip
       
  1180 
       
  1181   \noindent
       
  1182   In this specification the function @{text "bn"} determines which atoms of
       
  1183   the pattern @{text p} (fifth line) are bound in the argument @{text "t"}. Note that in the
       
  1184   second-last @{text bn}-clause the function @{text "atom"} coerces a name
       
  1185   into the generic atom type of Nominal Isabelle \cite{HuffmanUrban10}. This
       
  1186   allows us to treat binders of different atom type uniformly.
       
  1187 
       
  1188   For deep binders we allow binding clauses such as
       
  1189   
       
  1190   \[\mbox{
       
  1191   \begin{tabular}{ll}
       
  1192   @{text "Bar p::pat t::trm"} &  
       
  1193      \isacommand{binds} @{text "bn(p)"} \isacommand{in} @{text "p t"} \\
       
  1194   \end{tabular}}
       
  1195   \]\smallskip
       
  1196 
       
  1197   
       
  1198   \noindent
       
  1199   where the argument of the deep binder also occurs in the body. We call such
       
  1200   binders \emph{recursive}.  To see the purpose of such recursive binders,
       
  1201   compare `plain' @{text "Let"}s and @{text "Let_rec"}s in the following
       
  1202   specification:
       
  1203  
       
  1204   \begin{equation}\label{letrecs}
       
  1205   \mbox{%
       
  1206   \begin{tabular}{@ {}l@ {}l}
       
  1207   \isacommand{nominal\_datatype}~@{text "trm ="}\\
       
  1208   \hspace{5mm}\phantom{$\mid$}~\ldots\\
       
  1209   \hspace{5mm}$\mid$~@{text "Let as::assn t::trm"} 
       
  1210      & \hspace{-19mm}\isacommand{binds} @{text "bn(as)"} \isacommand{in} @{text t}\\
       
  1211   \hspace{5mm}$\mid$~@{text "Let_rec as::assn t::trm"}
       
  1212      & \hspace{-19mm}\isacommand{binds} @{text "bn(as)"} \isacommand{in} @{text "as t"}\\
       
  1213   \isacommand{and} @{text "assn"} $=$\\
       
  1214   \hspace{5mm}\phantom{$\mid$}~@{text "ANil"}\\
       
  1215   \hspace{5mm}$\mid$~@{text "ACons name trm assn"}\\
       
  1216   \isacommand{binder} @{text "bn::assn \<Rightarrow> atom list"}\\
       
  1217   \isacommand{where}~@{text "bn(ANil) = []"}\\
       
  1218   \hspace{5mm}$\mid$~@{text "bn(ACons a t as) = [atom a] @ bn(as)"}\\
       
  1219   \end{tabular}}
       
  1220   \end{equation}\smallskip
       
  1221   
       
  1222   \noindent
       
  1223   The difference is that with @{text Let} we only want to bind the atoms @{text
       
  1224   "bn(as)"} in the term @{text t}, but with @{text "Let_rec"} we also want to bind the atoms
       
  1225   inside the assignment. This difference has consequences for the associated
       
  1226   notions of free-atoms and alpha-equivalence.
       
  1227   
       
  1228   To make sure that atoms bound by deep binders cannot be free at the
       
  1229   same time, we cannot have more than one binding function for a deep binder. 
       
  1230   Consequently we exclude specifications such as
       
  1231 
       
  1232   \[\mbox{
       
  1233   \begin{tabular}{@ {}l@ {\hspace{2mm}}l@ {}}
       
  1234   @{text "Baz\<^isub>1 p::pat t::trm"} & 
       
  1235      \isacommand{binds} @{text "bn\<^isub>1(p) bn\<^isub>2(p)"} \isacommand{in} @{text "p t"}\\
       
  1236   @{text "Baz\<^isub>2 p::pat t\<^isub>1::trm t\<^isub>2::trm"} & 
       
  1237      \isacommand{binds} @{text "bn\<^isub>1(p)"} \isacommand{in} @{text "p t\<^isub>1"},
       
  1238      \isacommand{binds} @{text "bn\<^isub>2(p)"} \isacommand{in} @{text "p t\<^isub>2"}\\
       
  1239   \end{tabular}}
       
  1240   \]\smallskip
       
  1241 
       
  1242   \noindent
       
  1243   Otherwise it is possible that @{text "bn\<^isub>1"} and @{text "bn\<^isub>2"}  pick 
       
  1244   out different atoms to become bound, respectively be free, 
       
  1245   in @{text "p"}.\footnote{Since the Ott-tool does not derive a reasoning 
       
  1246   infrastructure for 
       
  1247   alpha-equated terms with deep binders, it can permit such specifications.}
       
  1248   
       
  1249 
       
  1250   We also need to restrict the form of the binding functions in order to
       
  1251   ensure the @{text "bn"}-functions can be defined for alpha-equated
       
  1252   terms. The main restriction is that we cannot return an atom in a binding
       
  1253   function that is also bound in the corresponding term-constructor.
       
  1254   Consider again the specification for @{text "trm"} and a contrived
       
  1255   version for assignments @{text "assn"}:
       
  1256 
       
  1257   \begin{equation}\label{bnexp}
       
  1258   \mbox{%
       
  1259   \begin{tabular}{@ {}l@ {}}
       
  1260   \isacommand{nominal\_datatype}~@{text "trm ="}~\ldots\\
       
  1261   \isacommand{and} @{text "assn"} $=$\\
       
  1262   \hspace{5mm}\phantom{$\mid$}~@{text "ANil'"}\\
       
  1263   \hspace{5mm}$\mid$~@{text "ACons' x::name y::name t::trm assn"}
       
  1264      \;\;\isacommand{binds} @{text "y"} \isacommand{in} @{text t}\\
       
  1265   \isacommand{binder} @{text "bn::assn \<Rightarrow> atom list"}\\
       
  1266   \isacommand{where}~@{text "bn(ANil') = []"}\\
       
  1267   \hspace{5mm}$\mid$~@{text "bn(ACons' x y t as) = [atom x] @ bn(as)"}\\
       
  1268   \end{tabular}}
       
  1269   \end{equation}\smallskip
       
  1270 
       
  1271   \noindent
       
  1272   In this example the term constructor @{text "ACons'"} has four arguments with
       
  1273   a binding clause involving two of them. This constructor is also used in the definition
       
  1274   of the binding function. The restriction we have to impose is that the
       
  1275   binding function can only return free atoms, that is the ones that are \emph{not}
       
  1276   mentioned in a binding clause.  Therefore @{text "y"} cannot be used in the
       
  1277   binding function @{text "bn"} (since it is bound in @{text "ACons'"} by the
       
  1278   binding clause), but @{text x} can (since it is a free atom). This
       
  1279   restriction is sufficient for lifting the binding function to alpha-equated
       
  1280   terms. If we would permit @{text "bn"} to return @{text "y"},
       
  1281   then it would not be respectful and therefore cannot be lifted to
       
  1282   alpha-equated lambda-terms.
       
  1283 
       
  1284   In the version of Nominal Isabelle described here, we also adopted the
       
  1285   restriction from the Ott-tool that binding functions can only return: the
       
  1286   empty set or empty list (as in case @{text ANil'}), a singleton set or
       
  1287   singleton list containing an atom (case @{text PVar} in \eqref{letpat}), or
       
  1288   unions of atom sets or appended atom lists (case @{text ACons'}). This
       
  1289   restriction will simplify some automatic definitions and proofs later on.
       
  1290   
       
  1291   To sum up this section, we introduced nominal datatype
       
  1292   specifications, which are like standard datatype specifications in
       
  1293   Isabelle/HOL but extended with binding clauses and specifications for binding
       
  1294   functions. Each constructor argument in our specification can also
       
  1295   have an optional label. These labels are used in the binding clauses
       
  1296   of a constructor; there can be several binding clauses for each
       
  1297   constructor, but bodies of binding clauses can only occur in a
       
  1298   single one. Binding clauses come in three modes: \isacommand{binds},
       
  1299   \isacommand{binds (set)} and \isacommand{binds (set+)}.  Binders
       
  1300   fall into two categories: shallow binders and deep binders. Shallow
       
  1301   binders can occur in more than one binding clause and only have to
       
  1302   respect the binding mode (i.e.~be of the right type). Deep binders
       
  1303   can also occur in more than one binding clause, unless they are
       
  1304   recursive in which case they can only occur once. Each of the deep
       
  1305   binders can only have a single binding function.  Binding functions
       
  1306   are defined by recursion over a nominal datatype.  They can
       
  1307   return the empty set, singleton atoms and unions of sets of atoms
       
  1308   (for binding modes \isacommand{binds (set)} and \isacommand{binds
       
  1309   (set+)}), and the empty list, singleton atoms and appended lists of
       
  1310   atoms (for mode \isacommand{bind}). However, they can only return
       
  1311   atoms that are not mentioned in any binding clause.  
       
  1312 
       
  1313   In order to
       
  1314   simplify our definitions of free atoms and alpha-equivalence we define next, we
       
  1315   shall assume specifications of term-calculi are implicitly
       
  1316   \emph{completed}. By this we mean that for every argument of a
       
  1317   term-constructor that is \emph{not} already part of a binding clause
       
  1318   given by the user, we add implicitly a special \emph{empty} binding
       
  1319   clause, written \isacommand{binds}~@{term
       
  1320   "{}"}~\isacommand{in}~@{text "labels"}. In case of the lambda-terms,
       
  1321   the completion produces
       
  1322 
       
  1323   \[\mbox{
       
  1324   \begin{tabular}{@ {}l@ {\hspace{-1mm}}}
       
  1325   \isacommand{nominal\_datatype} @{text lam} =\\
       
  1326   \hspace{5mm}\phantom{$\mid$}~@{text "Var x::name"}
       
  1327     \;\;\isacommand{binds}~@{term "{}"}~\isacommand{in}~@{text "x"}\\
       
  1328   \hspace{5mm}$\mid$~@{text "App t\<^isub>1::lam t\<^isub>2::lam"}
       
  1329     \;\;\isacommand{binds}~@{term "{}"}~\isacommand{in}~@{text "t\<^isub>1 t\<^isub>2"}\\
       
  1330   \hspace{5mm}$\mid$~@{text "Lam x::name t::lam"}
       
  1331     \;\;\isacommand{binds}~@{text x} \isacommand{in} @{text t}\\
       
  1332   \end{tabular}}
       
  1333   \]\smallskip
       
  1334 
       
  1335   \noindent 
       
  1336   The point of completion is that we can make definitions over the binding
       
  1337   clauses and be sure to have captured all arguments of a term constructor. 
       
  1338 *}
       
  1339 
       
  1340 section {* Alpha-Equivalence and Free Atoms\label{sec:alpha} *}
       
  1341 
       
  1342 text {*
       
  1343   Having dealt with all syntax matters, the problem now is how we can turn
       
  1344   specifications into actual type definitions in Isabelle/HOL and then
       
  1345   establish a reasoning infrastructure for them. As Pottier and Cheney pointed
       
  1346   out \cite{Cheney05,Pottier06}, just re-arranging the arguments of
       
  1347   term-constructors so that binders and their bodies are next to each other
       
  1348   will result in inadequate representations in cases like \mbox{@{text "Let
       
  1349   x\<^isub>1 = t\<^isub>1\<dots>x\<^isub>n = t\<^isub>n in s"}}. Therefore we will
       
  1350   first extract `raw' datatype definitions from the specification and then
       
  1351   define explicitly an alpha-equivalence relation over them. We subsequently
       
  1352   construct the quotient of the datatypes according to our alpha-equivalence.
       
  1353 
       
  1354 
       
  1355   The `raw' datatype definition can be obtained by stripping off the 
       
  1356   binding clauses and the labels from the types given by the user. We also have to invent
       
  1357   new names for the  types @{text "ty\<^sup>\<alpha>"} and the term-constructors @{text "C\<^sup>\<alpha>"}. 
       
  1358   In our implementation we just use the affix ``@{text "_raw"}''.
       
  1359   But for the purpose of this paper, we use the superscript @{text "_\<^sup>\<alpha>"} to indicate 
       
  1360   that a notion is given for alpha-equivalence classes and leave it out 
       
  1361   for the corresponding notion given on the raw level. So for example 
       
  1362   we have @{text "ty\<^sup>\<alpha> / ty"} and @{text "C\<^sup>\<alpha> / C"}
       
  1363   where @{term ty} is the type used in the quotient construction for 
       
  1364   @{text "ty\<^sup>\<alpha>"} and @{text "C"} is the term-constructor of the raw type @{text "ty"},
       
  1365   respectively @{text "C\<^sup>\<alpha>"} is the corresponding term-constructor of @{text "ty\<^sup>\<alpha>"}. 
       
  1366 
       
  1367   The resulting datatype definition is legal in Isabelle/HOL provided the datatypes are 
       
  1368   non-empty and the types in the constructors only occur in positive 
       
  1369   position (see \cite{Berghofer99} for an in-depth description of the datatype package
       
  1370   in Isabelle/HOL). 
       
  1371   We subsequently define each of the user-specified binding 
       
  1372   functions @{term "bn"}$_{1..m}$ by recursion over the corresponding 
       
  1373   raw datatype. We also define permutation operations by 
       
  1374   recursion so that for each term constructor @{text "C"} we have that
       
  1375   
       
  1376   \begin{equation}\label{ceqvt}
       
  1377   @{text "\<pi> \<bullet> (C z\<^isub>1 \<dots> z\<^isub>n) = C (\<pi> \<bullet> z\<^isub>1) \<dots> (\<pi> \<bullet> z\<^isub>n)"}
       
  1378   \end{equation}\smallskip
       
  1379 
       
  1380   \noindent
       
  1381   We will need this operation later when we define the notion of alpha-equivalence.
       
  1382 
       
  1383   The first non-trivial step we have to perform is the generation of
       
  1384   \emph{free-atom functions} from the specifications.\footnote{Admittedly, the
       
  1385   details of our definitions will be somewhat involved. However they are still
       
  1386   conceptually simple in comparison with the `positional' approach taken in
       
  1387   Ott \cite[Pages 88--95]{ott-jfp}, which uses the notions of \emph{occurrences} and
       
  1388   \emph{partial equivalence relations} over sets of occurrences.} For the
       
  1389   \emph{raw} types @{text "ty"}$_{1..n}$ we define the free-atom functions
       
  1390 
       
  1391   \begin{equation}\label{fvars}
       
  1392   \mbox{@{text "fa_ty"}$_{1..n}$}
       
  1393   \end{equation}\smallskip
       
  1394   
       
  1395   \noindent
       
  1396   by recursion.
       
  1397   We define these functions together with auxiliary free-atom functions for
       
  1398   the binding functions. Given raw binding functions @{text "bn"}$_{1..m}$ 
       
  1399   we define
       
  1400   
       
  1401   \[
       
  1402   @{text "fa_bn"}\mbox{$_{1..m}$}.
       
  1403   \]\smallskip
       
  1404   
       
  1405   \noindent
       
  1406   The reason for this setup is that in a deep binder not all atoms have to be
       
  1407   bound, as we saw in \eqref{letrecs} with the example of `plain' @{text Let}s. We need
       
  1408   therefore functions that calculate those free atoms in deep binders.
       
  1409 
       
  1410   While the idea behind these free-atom functions is simple (they just
       
  1411   collect all atoms that are not bound), because of our rather complicated
       
  1412   binding mechanisms their definitions are somewhat involved.  Given
       
  1413   a raw term-constructor @{text "C"} of type @{text ty} and some associated
       
  1414   binding clauses @{text "bc\<^isub>1\<dots>bc\<^isub>k"}, the result of @{text
       
  1415   "fa_ty (C z\<^isub>1 \<dots> z\<^isub>n)"} will be the union @{text
       
  1416   "fa(bc\<^isub>1) \<union> \<dots> \<union> fa(bc\<^isub>k)"} where we will define below what @{text "fa"} for a binding
       
  1417   clause means. We only show the details for the mode \isacommand{binds (set)} (the other modes are similar). 
       
  1418   Suppose a binding clause @{text bc\<^isub>i} is of the form 
       
  1419   
       
  1420   \[
       
  1421   \mbox{\isacommand{binds (set)} @{text "b\<^isub>1\<dots>b\<^isub>p"} \isacommand{in} @{text "d\<^isub>1\<dots>d\<^isub>q"}}
       
  1422   \]\smallskip
       
  1423   
       
  1424   \noindent
       
  1425   in which the body-labels @{text "d"}$_{1..q}$ refer to types @{text
       
  1426   ty}$_{1..q}$, and the binders @{text b}$_{1..p}$ either refer to labels of
       
  1427   atom types (in case of shallow binders) or to binding functions taking a
       
  1428   single label as argument (in case of deep binders). Assuming @{text "D"}
       
  1429   stands for the set of free atoms of the bodies, @{text B} for the set of
       
  1430   binding atoms in the binders and @{text "B'"} for the set of free atoms in
       
  1431   non-recursive deep binders, then the free atoms of the binding clause @{text
       
  1432   bc\<^isub>i} are
       
  1433 
       
  1434   \begin{equation}\label{fadef}
       
  1435   \mbox{@{text "fa(bc\<^isub>i) \<equiv> (D - B) \<union> B'"}}.
       
  1436   \end{equation}\smallskip
       
  1437   
       
  1438   \noindent
       
  1439   The set @{text D} is formally defined as
       
  1440   
       
  1441   \[
       
  1442   @{text "D \<equiv> fa_ty\<^isub>1 d\<^isub>1 \<union> ... \<union> fa_ty\<^isub>q d\<^isub>q"}
       
  1443   \]\smallskip
       
  1444   
       
  1445   \noindent
       
  1446   where in case @{text "d\<^isub>i"} refers to one of the raw types @{text "ty"}$_{1..n}$ from the 
       
  1447   specification, the function @{text "fa_ty\<^isub>i"} is the corresponding free-atom function 
       
  1448   we are defining by recursion; otherwise we set \mbox{@{text "fa_ty\<^isub>i \<equiv> supp"}}. The reason
       
  1449   for the latter is that @{text "ty"}$_i$ is not a type that is part of the specification, and
       
  1450   we assume @{text supp} is the generic function that characterises the free variables of 
       
  1451   a type (in fact in the next section we will show that the free-variable functions we
       
  1452   define here, are equal to the support once lifted to alpha-equivalence classes).
       
  1453   
       
  1454   In order to formally define the set @{text B} we use the following auxiliary @{text "bn"}-functions
       
  1455   for atom types to which shallow binders may refer\\[-4mm]
       
  1456   
       
  1457   \begin{equation}\label{bnaux}\mbox{
       
  1458   \begin{tabular}{r@ {\hspace{2mm}}c@ {\hspace{2mm}}l}
       
  1459   @{text "bn\<^bsub>atom\<^esup> a"} & @{text "\<equiv>"} & @{text "{atom a}"}\\
       
  1460   @{text "bn\<^bsub>atom_set\<^esup> as"} & @{text "\<equiv>"} & @{text "atoms as"}\\
       
  1461   @{text "bn\<^bsub>atom_list\<^esub> as"} & @{text "\<equiv>"} & @{text "atoms (set as)"}
       
  1462   \end{tabular}}
       
  1463   \end{equation}\smallskip
       
  1464   
       
  1465   \noindent 
       
  1466   Like the function @{text atom}, the function @{text "atoms"} coerces 
       
  1467   a set of atoms to a set of the generic atom type. 
       
  1468   It is defined as  @{text "atoms as \<equiv> {atom a | a \<in> as}"}. 
       
  1469   The set @{text B} in \eqref{fadef} is then formally defined as
       
  1470   
       
  1471   \begin{equation}\label{bdef}
       
  1472   @{text "B \<equiv> bn_ty\<^isub>1 b\<^isub>1 \<union> ... \<union> bn_ty\<^isub>p b\<^isub>p"}
       
  1473   \end{equation}\smallskip
       
  1474 
       
  1475   \noindent 
       
  1476   where we use the auxiliary binding functions from \eqref{bnaux} for shallow 
       
  1477   binders (that means when @{text "ty"}$_i$ is of type @{text "atom"}, @{text "atom set"} or
       
  1478   @{text "atom list"}). 
       
  1479 
       
  1480   The set @{text "B'"} in \eqref{fadef} collects all free atoms in
       
  1481   non-recursive deep binders. Let us assume these binders in the binding 
       
  1482   clause @{text "bc\<^isub>i"} are
       
  1483 
       
  1484   \[
       
  1485   \mbox{@{text "bn\<^isub>1 l\<^isub>1, \<dots>, bn\<^isub>r l\<^isub>r"}}
       
  1486   \]\smallskip
       
  1487   
       
  1488   \noindent
       
  1489   with @{text "l"}$_{1..r}$ $\subseteq$ @{text "b"}$_{1..p}$ and 
       
  1490   none of the @{text "l"}$_{1..r}$ being among the bodies
       
  1491   @{text "d"}$_{1..q}$. The set @{text "B'"} is defined as
       
  1492   
       
  1493   \begin{equation}\label{bprimedef}
       
  1494   @{text "B' \<equiv> fa_bn\<^isub>1 l\<^isub>1 \<union> ... \<union> fa_bn\<^isub>r l\<^isub>r"}
       
  1495   \end{equation}\smallskip
       
  1496   
       
  1497   \noindent
       
  1498   This completes all clauses for the free-atom functions @{text "fa_ty"}$_{1..n}$.
       
  1499 
       
  1500   Note that for non-recursive deep binders, we have to add in \eqref{fadef}
       
  1501   the set of atoms that are left unbound by the binding functions @{text
       
  1502   "bn"}$_{1..m}$. We used for
       
  1503   the definition of this set the functions @{text "fa_bn"}$_{1..m}$. The
       
  1504   definition for those functions needs to be extracted from the clauses the
       
  1505   user provided for @{text "bn"}$_{1..m}$ Assume the user specified a @{text
       
  1506   bn}-clause of the form
       
  1507   
       
  1508   \[
       
  1509   @{text "bn (C z\<^isub>1 \<dots> z\<^isub>s) = rhs"}
       
  1510   \]\smallskip
       
  1511   
       
  1512   \noindent
       
  1513   where the @{text "z"}$_{1..s}$ are of types @{text "ty"}$_{1..s}$. For 
       
  1514   each of the arguments we calculate the free atoms as follows:
       
  1515   
       
  1516   \[\mbox{
       
  1517   \begin{tabular}{c@ {\hspace{2mm}}p{0.9\textwidth}}
       
  1518   $\bullet$ & @{term "fa_ty\<^isub>i z\<^isub>i"} provided @{text "z\<^isub>i"} does not occur in @{text "rhs"}\\ 
       
  1519   & (that means nothing is bound in @{text "z\<^isub>i"} by the binding function),\smallskip\\
       
  1520   $\bullet$ & @{term "fa_bn\<^isub>i z\<^isub>i"} provided @{text "z\<^isub>i"} occurs in  @{text "rhs"}
       
  1521   with the recursive call @{text "bn\<^isub>i z\<^isub>i"}\\
       
  1522   & (that means whatever is `left over' from the @{text "bn"}-function is free)\smallskip\\
       
  1523   $\bullet$ & @{term "{}"} provided @{text "z\<^isub>i"} occurs in  @{text "rhs"},
       
  1524   but without a recursive call\\
       
  1525   & (that means @{text "z\<^isub>i"} is supposed to become bound by the binding function)\\
       
  1526   \end{tabular}}
       
  1527   \]\smallskip
       
  1528   
       
  1529   \noindent
       
  1530   For defining @{text "fa_bn (C z\<^isub>1 \<dots> z\<^isub>n)"} we just union up all these sets.
       
  1531  
       
  1532   To see how these definitions work in practice, let us reconsider the
       
  1533   term-constructors @{text "Let"} and @{text "Let_rec"} shown in
       
  1534   \eqref{letrecs} together with the term-constructors for assignments @{text
       
  1535   "ANil"} and @{text "ACons"}. Since there is a binding function defined for
       
  1536   assignments, we have three free-atom functions, namely @{text
       
  1537   "fa\<^bsub>trm\<^esub>"}, @{text "fa\<^bsub>assn\<^esub>"} and @{text
       
  1538   "fa\<^bsub>bn\<^esub>"} as follows:
       
  1539   
       
  1540   \[\mbox{
       
  1541   \begin{tabular}{@ {}l@ {\hspace{1mm}}c@ {\hspace{1mm}}l@ {}}
       
  1542   @{text "fa\<^bsub>trm\<^esub> (Let as t)"} & @{text "\<equiv>"} & @{text "(fa\<^bsub>trm\<^esub> t - set (bn as)) \<union> fa\<^bsub>bn\<^esub> as"}\\
       
  1543   @{text "fa\<^bsub>trm\<^esub> (Let_rec as t)"} & @{text "\<equiv>"} & @{text "(fa\<^bsub>assn\<^esub> as \<union> fa\<^bsub>trm\<^esub> t) - set (bn as)"}\smallskip\\
       
  1544 
       
  1545   @{text "fa\<^bsub>assn\<^esub> (ANil)"} & @{text "\<equiv>"} & @{term "{}"}\\
       
  1546   @{text "fa\<^bsub>assn\<^esub> (ACons a t as)"} & @{text "\<equiv>"} & @{text "(supp a) \<union> (fa\<^bsub>trm\<^esub> t) \<union> (fa\<^bsub>assn\<^esub> as)"}\smallskip\\
       
  1547 
       
  1548   @{text "fa\<^bsub>bn\<^esub> (ANil)"} & @{text "\<equiv>"} & @{term "{}"}\\
       
  1549   @{text "fa\<^bsub>bn\<^esub> (ACons a t as)"} & @{text "\<equiv>"} & @{text "(fa\<^bsub>trm\<^esub> t) \<union> (fa\<^bsub>bn\<^esub> as)"}
       
  1550   \end{tabular}}
       
  1551   \]\smallskip
       
  1552 
       
  1553 
       
  1554   \noindent
       
  1555   Recall that @{text ANil} and @{text "ACons"} have no binding clause in the
       
  1556   specification. The corresponding free-atom function @{text
       
  1557   "fa\<^bsub>assn\<^esub>"} therefore returns all free atoms of an assignment
       
  1558   (in case of @{text "ACons"}, they are given in terms of @{text supp}, @{text
       
  1559   "fa\<^bsub>trm\<^esub>"} and @{text "fa\<^bsub>assn\<^esub>"}). The binding
       
  1560   only takes place in @{text Let} and @{text "Let_rec"}. In case of @{text
       
  1561   "Let"}, the binding clause specifies that all atoms given by @{text "set (bn
       
  1562   as)"} have to be bound in @{text t}. Therefore we have to subtract @{text
       
  1563   "set (bn as)"} from @{text "fa\<^bsub>trm\<^esub> t"}. However, we also need
       
  1564   to add all atoms that are free in @{text "as"}. This is in contrast with
       
  1565   @{text "Let_rec"} where we have a recursive binder to bind all occurrences
       
  1566   of the atoms in @{text "set (bn as)"} also inside @{text "as"}. Therefore we
       
  1567   have to subtract @{text "set (bn as)"} from both @{text
       
  1568   "fa\<^bsub>trm\<^esub> t"} and @{text "fa\<^bsub>assn\<^esub> as"}. Like the
       
  1569   function @{text "bn"}, the function @{text "fa\<^bsub>bn\<^esub>"} traverses
       
  1570   the list of assignments, but instead returns the free atoms, which means in
       
  1571   this example the free atoms in the argument @{text "t"}.
       
  1572 
       
  1573 
       
  1574   An interesting point in this example is that a `naked' assignment (@{text
       
  1575   "ANil"} or @{text "ACons"}) does not bind any atoms, even if the binding
       
  1576   function is specified over assignments. Only in the context of a @{text Let}
       
  1577   or @{text "Let_rec"}, where the binding clauses are given, will some atoms
       
  1578   actually become bound.  This is a phenomenon that has also been pointed out
       
  1579   in \cite{ott-jfp}. For us this observation is crucial, because we would not
       
  1580   be able to lift the @{text "bn"}-functions to alpha-equated terms if they
       
  1581   act on atoms that are bound. In that case, these functions would \emph{not}
       
  1582   respect alpha-equivalence.
       
  1583 
       
  1584   Having the free-atom functions at our disposal, we can next define the 
       
  1585   alpha-equivalence relations for the raw types @{text
       
  1586   "ty"}$_{1..n}$. We write them as
       
  1587   
       
  1588   \[
       
  1589   \mbox{@{text "\<approx>ty"}$_{1..n}$}.
       
  1590   \]\smallskip
       
  1591   
       
  1592   \noindent
       
  1593   Like with the free-atom functions, we also need to
       
  1594   define auxiliary alpha-equivalence relations 
       
  1595   
       
  1596   \[
       
  1597   \mbox{@{text "\<approx>bn\<^isub>"}$_{1..m}$}
       
  1598   \]\smallskip
       
  1599   
       
  1600   \noindent
       
  1601   for the binding functions @{text "bn"}$_{1..m}$, 
       
  1602   To simplify our definitions we will use the following abbreviations for
       
  1603   \emph{compound equivalence relations} and \emph{compound free-atom functions} acting on tuples.
       
  1604   
       
  1605   \[\mbox{
       
  1606   \begin{tabular}{r@ {\hspace{2mm}}c@ {\hspace{2mm}}l}
       
  1607   @{text "(x\<^isub>1,\<dots>, x\<^isub>n) (R\<^isub>1,\<dots>, R\<^isub>n) (y\<^isub>1,\<dots>, y\<^isub>n)"} & @{text "\<equiv>"} &
       
  1608   @{text "x\<^isub>1 R\<^isub>1 y\<^isub>1 \<and> \<dots> \<and> x\<^isub>n R\<^isub>n y\<^isub>n"}\\
       
  1609   @{text "(fa\<^isub>1,\<dots>, fa\<^isub>n) (x\<^isub>1,\<dots>, x\<^isub>n)"} & @{text "\<equiv>"} & @{text "fa\<^isub>1 x\<^isub>1 \<union> \<dots> \<union> fa\<^isub>n x\<^isub>n"}\\
       
  1610   \end{tabular}}
       
  1611   \]\smallskip
       
  1612 
       
  1613 
       
  1614   The alpha-equivalence relations are defined as inductive predicates
       
  1615   having a single clause for each term-constructor. Assuming a
       
  1616   term-constructor @{text C} is of type @{text ty} and has the binding clauses
       
  1617   @{term "bc"}$_{1..k}$, then the alpha-equivalence clause has the form
       
  1618   
       
  1619   \begin{equation}\label{gform}
       
  1620   \mbox{\infer{@{text "C z\<^isub>1 \<dots> z\<^isub>n  \<approx>ty  C z\<PRIME>\<^isub>1 \<dots> z\<PRIME>\<^isub>n"}}
       
  1621   {@{text "prems(bc\<^isub>1) \<dots> prems(bc\<^isub>k)"}}} 
       
  1622   \end{equation}\smallskip
       
  1623 
       
  1624   \noindent
       
  1625   The task below is to specify what the premises corresponding to a binding
       
  1626   clause are. To understand better what the general pattern is, let us first 
       
  1627   treat the special instance where @{text "bc\<^isub>i"} is the empty binding clause 
       
  1628   of the form
       
  1629 
       
  1630   \[
       
  1631   \mbox{\isacommand{binds (set)} @{term "{}"} \isacommand{in} @{text "d\<^isub>1\<dots>d\<^isub>q"}.}
       
  1632   \]\smallskip
       
  1633 
       
  1634   \noindent
       
  1635   In this binding clause no atom is bound and we only have to `alpha-relate'
       
  1636   the bodies. For this we build first the tuples @{text "D \<equiv> (d\<^isub>1,\<dots>,
       
  1637   d\<^isub>q)"} and @{text "D' \<equiv> (d\<PRIME>\<^isub>1,\<dots>, d\<PRIME>\<^isub>q)"}
       
  1638   whereby the labels @{text "d"}$_{1..q}$ refer to some of the arguments @{text
       
  1639   "z"}$_{1..n}$ and respectively @{text "d\<PRIME>"}$_{1..q}$ to some of the @{text
       
  1640   "z\<PRIME>"}$_{1..n}$ in \eqref{gform}. In order to relate two such
       
  1641   tuples we define the compound alpha-equivalence relation @{text "R"} as
       
  1642   follows
       
  1643 
       
  1644   \begin{equation}\label{rempty}
       
  1645   \mbox{@{text "R \<equiv> (R\<^isub>1,\<dots>, R\<^isub>q)"}}
       
  1646   \end{equation}\smallskip
       
  1647 
       
  1648   \noindent
       
  1649   with @{text "R\<^isub>i"} being @{text "\<approx>ty\<^isub>i"} if the corresponding
       
  1650   labels @{text "d\<^isub>i"} and @{text "d\<PRIME>\<^isub>i"} refer to a
       
  1651   recursive argument of @{text C} and have type @{text "ty\<^isub>i"}; otherwise
       
  1652   we take @{text "R\<^isub>i"} to be the equality @{text "="}. Again the
       
  1653   latter is because @{text "ty\<^isub>i"} is then not part of the specified types
       
  1654   and alpha-equivalence of any previously defined type is supposed to coincide
       
  1655   with equality.  This lets us now define the premise for an empty binding
       
  1656   clause succinctly as @{text "prems(bc\<^isub>i) \<equiv> D R D'"}, which can be
       
  1657   unfolded to the series of premises
       
  1658   
       
  1659   \[
       
  1660   @{text "d\<^isub>1 R\<^isub>1 d\<PRIME>\<^isub>1  \<dots> d\<^isub>q R\<^isub>q d\<PRIME>\<^isub>q"}.
       
  1661   \]\smallskip
       
  1662   
       
  1663   \noindent
       
  1664   We will use the unfolded version in the examples below.
       
  1665 
       
  1666   Now suppose the binding clause @{text "bc\<^isub>i"} is of the general form 
       
  1667   
       
  1668   \begin{equation}\label{nonempty}
       
  1669   \mbox{\isacommand{binds (set)} @{text "b\<^isub>1\<dots>b\<^isub>p"} \isacommand{in} @{text "d\<^isub>1\<dots>d\<^isub>q"}.}
       
  1670   \end{equation}\smallskip
       
  1671 
       
  1672   \noindent
       
  1673   In this case we define a premise @{text P} using the relation
       
  1674   $\approx_{\,\textit{set}}^{\textit{R}, \textit{fa}}$ given in Section~\ref{sec:binders} (similarly
       
  1675   $\approx_{\,\textit{set+}}^{\textit{R}, \textit{fa}}$ and 
       
  1676   $\approx_{\,\textit{list}}^{\textit{R}, \textit{fa}}$ for the other
       
  1677   binding modes). As above, we first build the tuples @{text "D"} and
       
  1678   @{text "D'"} for the bodies @{text "d"}$_{1..q}$, and the corresponding
       
  1679   compound alpha-relation @{text "R"} (shown in \eqref{rempty}). 
       
  1680   For $\approx_{\,\textit{set}}^{\textit{R}, \textit{fa}}$  we also need
       
  1681   a compound free-atom function for the bodies defined as
       
  1682   
       
  1683   \[
       
  1684   \mbox{@{text "fa \<equiv> (fa_ty\<^isub>1,\<dots>, fa_ty\<^isub>q)"}}
       
  1685   \]\smallskip
       
  1686 
       
  1687   \noindent
       
  1688   with the assumption that the @{text "d"}$_{1..q}$ refer to arguments of types @{text "ty"}$_{1..q}$.
       
  1689   The last ingredient we need are the sets of atoms bound in the bodies.
       
  1690   For this we take
       
  1691 
       
  1692   \[
       
  1693   @{text "B \<equiv> bn_ty\<^isub>1 b\<^isub>1 \<union> \<dots> \<union> bn_ty\<^isub>p b\<^isub>p"}\;.\\
       
  1694   \]\smallskip
       
  1695 
       
  1696   \noindent
       
  1697   Similarly for @{text "B'"} using the labels @{text "b\<PRIME>"}$_{1..p}$. This 
       
  1698   lets us formally define the premise @{text P} for a non-empty binding clause as:
       
  1699   
       
  1700   \[
       
  1701   \mbox{@{term "P \<equiv> alpha_set_ex (B, D) R fa (B', D')"}}\;.
       
  1702   \]\smallskip
       
  1703 
       
  1704   \noindent
       
  1705   This premise accounts for alpha-equivalence of the bodies of the binding
       
  1706   clause. However, in case the binders have non-recursive deep binders, this
       
  1707   premise is not enough: we also have to `propagate' alpha-equivalence
       
  1708   inside the structure of these binders. An example is @{text "Let"} where we
       
  1709   have to make sure the right-hand sides of assignments are
       
  1710   alpha-equivalent. For this we use relations @{text "\<approx>bn"}$_{1..m}$ (which we
       
  1711   will define shortly).  Let us assume the non-recursive deep binders
       
  1712   in @{text "bc\<^isub>i"} are
       
  1713   
       
  1714   \[
       
  1715   @{text "bn\<^isub>1 l\<^isub>1, \<dots>, bn\<^isub>r l\<^isub>r"}.
       
  1716   \]\smallskip
       
  1717   
       
  1718   \noindent
       
  1719   The tuple @{text L} consists then of all these binders @{text "(l\<^isub>1,\<dots>,l\<^isub>r)"} 
       
  1720   (similarly @{text "L'"}) and the compound equivalence relation @{text "R'"} 
       
  1721   is @{text "(\<approx>bn\<^isub>1,\<dots>,\<approx>bn\<^isub>r)"}.  All premises for @{text "bc\<^isub>i"} are then given by
       
  1722   
       
  1723   \[
       
  1724   @{text "prems(bc\<^isub>i) \<equiv> P  \<and>   L R' L'"}
       
  1725   \]\smallskip
       
  1726 
       
  1727   \noindent 
       
  1728   The auxiliary alpha-equivalence relations @{text "\<approx>bn"}$_{1..m}$ 
       
  1729   in @{text "R'"} are defined as follows: assuming a @{text bn}-clause is of the form
       
  1730   
       
  1731   \[
       
  1732   @{text "bn (C z\<^isub>1 \<dots> z\<^isub>s) = rhs"}
       
  1733   \]\smallskip
       
  1734   
       
  1735   \noindent
       
  1736   where the @{text "z"}$_{1..s}$ are of types @{text "ty"}$_{1..s}$,
       
  1737   then the corresponding alpha-equivalence clause for @{text "\<approx>bn"} has the form
       
  1738   
       
  1739   \[
       
  1740   \mbox{\infer{@{text "C z\<^isub>1 \<dots> z\<^isub>s \<approx>bn C z\<PRIME>\<^isub>1 \<dots> z\<PRIME>\<^isub>s"}}
       
  1741   {@{text "z\<^isub>1 R\<^isub>1 z\<PRIME>\<^isub>1 \<dots> z\<^isub>s R\<^isub>s z\<PRIME>\<^isub>s"}}}
       
  1742   \]\smallskip
       
  1743   
       
  1744   \noindent
       
  1745   In this clause the relations @{text "R"}$_{1..s}$ are given by 
       
  1746 
       
  1747   \[\mbox{
       
  1748   \begin{tabular}{c@ {\hspace{2mm}}p{0.9\textwidth}}
       
  1749   $\bullet$ & @{text "z\<^isub>i \<approx>ty z\<PRIME>\<^isub>i"} provided @{text "z\<^isub>i"} does not occur in @{text rhs} and 
       
  1750   is a recursive argument of @{text C},\smallskip\\
       
  1751   $\bullet$ & @{text "z\<^isub>i = z\<PRIME>\<^isub>i"} provided @{text "z\<^isub>i"} does not occur in @{text rhs}
       
  1752   and is a non-recursive argument of @{text C},\smallskip\\
       
  1753   $\bullet$ & @{text "z\<^isub>i \<approx>bn\<^isub>i z\<PRIME>\<^isub>i"} provided @{text "z\<^isub>i"} occurs in @{text rhs}
       
  1754   with the recursive call @{text "bn\<^isub>i x\<^isub>i"} and\smallskip\\
       
  1755   $\bullet$ & @{text True} provided @{text "z\<^isub>i"} occurs in @{text rhs} but without a
       
  1756   recursive call.
       
  1757   \end{tabular}}
       
  1758   \]\smallskip
       
  1759 
       
  1760   \noindent
       
  1761   This completes the definition of alpha-equivalence. As a sanity check, we can show
       
  1762   that the premises of empty binding clauses are a special case of the clauses for 
       
  1763   non-empty ones (we just have to unfold the definition of 
       
  1764   $\approx_{\,\textit{set}}^{\textit{R}, \textit{fa}}$ and take @{text "0"}
       
  1765   for the existentially quantified permutation).
       
  1766 
       
  1767   Again let us take a look at a concrete example for these definitions. For 
       
  1768   the specification shown in \eqref{letrecs}
       
  1769   we have three relations $\approx_{\textit{trm}}$, $\approx_{\textit{assn}}$ and
       
  1770   $\approx_{\textit{bn}}$ with the following rules:
       
  1771 
       
  1772   \begin{equation}\label{rawalpha}\mbox{
       
  1773   \begin{tabular}{@ {}c @ {}}
       
  1774   \infer{@{text "Let as t \<approx>\<^bsub>trm\<^esub> Let as' t'"}}
       
  1775   {@{term "alpha_lst_ex (bn as, t) alpha_trm fa_trm (bn as', t')"} & 
       
  1776   \hspace{5mm}@{text "as \<approx>\<^bsub>bn\<^esub> as'"}}\\
       
  1777   \\
       
  1778   \makebox[0mm]{\infer{@{text "Let_rec as t \<approx>\<^bsub>trm\<^esub> Let_rec as' t'"}}
       
  1779   {@{term "alpha_lst_ex (bn as, ast) alpha_trm2 fa_trm2 (bn as', ast')"}}}\\
       
  1780   \\
       
  1781 
       
  1782   \begin{tabular}{@ {}c @ {}}
       
  1783   \infer{@{text "ANil \<approx>\<^bsub>assn\<^esub> ANil"}}{}\hspace{9mm}
       
  1784   \infer{@{text "ACons a t as \<approx>\<^bsub>assn\<^esub> ACons a' t' as"}}
       
  1785   {@{text "a = a'"} & \hspace{5mm}@{text "t \<approx>\<^bsub>trm\<^esub> t'"} & \hspace{5mm}@{text "as \<approx>\<^bsub>assn\<^esub> as'"}}
       
  1786   \end{tabular}\\
       
  1787   \\
       
  1788 
       
  1789   \begin{tabular}{@ {}c @ {}}
       
  1790   \infer{@{text "ANil \<approx>\<^bsub>bn\<^esub> ANil"}}{}\hspace{9mm}
       
  1791   \infer{@{text "ACons a t as \<approx>\<^bsub>bn\<^esub> ACons a' t' as"}}
       
  1792   {@{text "t \<approx>\<^bsub>trm\<^esub> t'"} & \hspace{5mm}@{text "as \<approx>\<^bsub>bn\<^esub> as'"}}
       
  1793   \end{tabular}
       
  1794   \end{tabular}}
       
  1795   \end{equation}\smallskip
       
  1796 
       
  1797   \noindent
       
  1798   Notice the difference between  $\approx_{\textit{assn}}$ and
       
  1799   $\approx_{\textit{bn}}$: the latter only `tracks' alpha-equivalence of 
       
  1800   the components in an assignment that are \emph{not} bound. This is needed in the 
       
  1801   clause for @{text "Let"} (which has
       
  1802   a non-recursive binder). 
       
  1803   The underlying reason is that the terms inside an assignment are not meant 
       
  1804   to be `under' the binder. Such a premise is \emph{not} needed in @{text "Let_rec"}, 
       
  1805   because there all components of an assignment are `under' the binder. 
       
  1806   Note also that in case of more than one body (that is in the @{text "Let_rec"}-case above)
       
  1807   we need to parametrise the relation $\approx_{\textit{list}}$ with a compound
       
  1808   equivalence relation and a compound free-atom function. This is because the
       
  1809   corresponding binding clause specifies a binder with two bodies, namely
       
  1810   @{text "as"} and @{text "t"}.
       
  1811 *}
       
  1812 
       
  1813 section {* Establishing the Reasoning Infrastructure *}
       
  1814 
       
  1815 text {*
       
  1816   Having made all necessary definitions for raw terms, we can start with
       
  1817   establishing the reasoning infrastructure for the alpha-equated types @{text
       
  1818   "ty\<AL>"}$_{1..n}$, that is the types the user originally specified. We
       
  1819   give in this section and the next the proofs we need for establishing this
       
  1820   infrastructure. One point of our work is that we have completely
       
  1821   automated these proofs in Isabelle/HOL.
       
  1822 
       
  1823   First we establish that the free-variable functions, the binding functions and the
       
  1824   alpha-equi\-va\-lences are equivariant.
       
  1825 
       
  1826   \begin{lem}\mbox{}\\
       
  1827   @{text "(i)"} The functions @{text "fa_ty"}$_{1..n}$, @{text "fa_bn"}$_{1..m}$ and
       
  1828   @{text "bn"}$_{1..m}$ are equivariant.\\
       
  1829   @{text "(ii)"} The relations @{text "\<approx>ty"}$_{1..n}$ and
       
  1830   @{text "\<approx>bn"}$_{1..m}$ are equivariant.
       
  1831   \end{lem}
       
  1832 
       
  1833   \begin{proof}
       
  1834   The function package of Isabelle/HOL allows us to prove the first part by
       
  1835   mutual induction over the definitions of the functions.\footnote{We have
       
  1836   that the free-atom functions are terminating. From this the function
       
  1837   package derives an induction principle~\cite{Krauss09}.} The second is by a
       
  1838   straightforward induction over the rules of @{text "\<approx>ty"}$_{1..n}$ and
       
  1839   @{text "\<approx>bn"}$_{1..m}$ using the first part.
       
  1840   \end{proof}
       
  1841 
       
  1842   \noindent
       
  1843   Next we establish that the alpha-equivalence relations defined in the
       
  1844   previous section are indeed equivalence relations.
       
  1845 
       
  1846   \begin{lem}\label{equiv} 
       
  1847   The relations @{text "\<approx>ty"}$_{1..n}$ and @{text "\<approx>bn"}$_{1..m}$ are
       
  1848   equivalence relations.
       
  1849   \end{lem}
       
  1850 
       
  1851   \begin{proof} 
       
  1852   The proofs are by induction. The non-trivial
       
  1853   cases involve premises built up by $\approx_{\textit{set}}$, 
       
  1854   $\approx_{\textit{set+}}$ and $\approx_{\textit{list}}$. They 
       
  1855   can be dealt with as in Lemma~\ref{alphaeq}. However, the transitivity
       
  1856   case needs in addition the fact that the relations are equivariant. 
       
  1857   \end{proof}
       
  1858 
       
  1859   \noindent 
       
  1860   We can feed the last lemma into our quotient package and obtain new types
       
  1861   @{text "ty"}$^\alpha_{1..n}$ representing alpha-equated terms of types
       
  1862   @{text "ty"}$_{1..n}$. We also obtain definitions for the term-constructors
       
  1863   @{text "C"}$^\alpha_{1..k}$ from the raw term-constructors @{text
       
  1864   "C"}$_{1..k}$, and similar definitions for the free-atom functions @{text
       
  1865   "fa_ty"}$^\alpha_{1..n}$ and @{text "fa_bn"}$^\alpha_{1..m}$ as well as the
       
  1866   binding functions @{text "bn"}$^\alpha_{1..m}$. However, these definitions
       
  1867   are not really useful to the user, since they are given in terms of the
       
  1868   isomorphisms we obtained by creating new types in Isabelle/HOL (recall the
       
  1869   picture shown in the Introduction).
       
  1870 
       
  1871   The first useful property for the user is the fact that distinct 
       
  1872   term-constructors are not equal, that is the property
       
  1873   
       
  1874   \begin{equation}\label{distinctalpha}
       
  1875   \mbox{@{text "C"}$^\alpha$~@{text "x\<^isub>1 \<dots> x\<^isub>r"}~@{text "\<noteq>"}~% 
       
  1876   @{text "D"}$^\alpha$~@{text "y\<^isub>1 \<dots> y\<^isub>s"}} 
       
  1877   \end{equation}\smallskip
       
  1878   
       
  1879   \noindent
       
  1880   whenever @{text "C"}$^\alpha$~@{text "\<noteq>"}~@{text "D"}$^\alpha$.
       
  1881   In order to derive this property, we use the definition of alpha-equivalence
       
  1882   and establish that
       
  1883   
       
  1884   \begin{equation}\label{distinctraw}
       
  1885   \mbox{@{text "C x\<^isub>1 \<dots> x\<^isub>r"}\;$\not\approx$@{text ty}\;@{text "D y\<^isub>1 \<dots> y\<^isub>s"}}
       
  1886   \end{equation}\smallskip
       
  1887 
       
  1888   \noindent
       
  1889   holds for the corresponding raw term-constructors.
       
  1890   In order to deduce \eqref{distinctalpha} from \eqref{distinctraw}, our quotient
       
  1891   package needs to know that the raw term-constructors @{text "C"} and @{text "D"} 
       
  1892   are \emph{respectful} w.r.t.~the alpha-equivalence relations (see \cite{Homeier05}).
       
  1893   Given, for example, @{text "C"} is of type @{text "ty"} with argument types
       
  1894   @{text "ty"}$_{1..r}$, respectfulness amounts to showing that
       
  1895   
       
  1896   \[\mbox{
       
  1897   @{text "C x\<^isub>1 \<dots> x\<^isub>r \<approx>ty C x\<PRIME>\<^isub>1 \<dots> x\<PRIME>\<^isub>r"}
       
  1898   }\]\smallskip
       
  1899 
       
  1900   \noindent
       
  1901   holds under the assumptions \mbox{@{text
       
  1902   "x\<^isub>i \<approx>ty\<^isub>i x\<PRIME>\<^isub>i"}} whenever @{text "x\<^isub>i"}
       
  1903   and @{text "x\<PRIME>\<^isub>i"} are recursive arguments of @{text C}, and
       
  1904   @{text "x\<^isub>i = x\<PRIME>\<^isub>i"} whenever they are non-recursive arguments 
       
  1905   (similarly for @{text "D"}). For this we have to show
       
  1906   by induction over the definitions of alpha-equivalences the following 
       
  1907   auxiliary implications
       
  1908 
       
  1909   \begin{equation}\label{fnresp}\mbox{
       
  1910   \begin{tabular}{lll}
       
  1911   @{text "x \<approx>ty\<^isub>i x'"} & implies & @{text "fa_ty\<^isub>i x = fa_ty\<^isub>i x'"}\\
       
  1912   @{text "x \<approx>ty\<^isub>l x'"} & implies & @{text "fa_bn\<^isub>j x = fa_bn\<^isub>j x'"}\\
       
  1913   @{text "x \<approx>ty\<^isub>l x'"} & implies & @{text "bn\<^isub>j x = bn\<^isub>j x'"}\\
       
  1914   @{text "x \<approx>ty\<^isub>l x'"} & implies & @{text "x \<approx>bn\<^isub>j x'"}\\
       
  1915   \end{tabular}
       
  1916   }\end{equation}\smallskip
       
  1917   
       
  1918   \noindent
       
  1919   whereby @{text "ty\<^isub>l"} is the type over which @{text "bn\<^isub>j"}
       
  1920   is defined. Whereas the first, second and last implication are true by
       
  1921   how we stated our definitions, the third \emph{only} holds because of our
       
  1922   restriction imposed on the form of the binding functions---namely \emph{not}
       
  1923   to return any bound atoms. In Ott, in contrast, the user may define @{text
       
  1924   "bn"}$_{1..m}$ so that they return bound atoms and in this case the third
       
  1925   implication is \emph{not} true. A result is that in general the lifting of the
       
  1926   corresponding binding functions in Ott to alpha-equated terms is impossible.
       
  1927   Having established respectfulness for the raw term-constructors, the 
       
  1928   quotient package is able to automatically deduce \eqref{distinctalpha} from 
       
  1929   \eqref{distinctraw}.
       
  1930 
       
  1931   Next we can lift the permutation operations defined in \eqref{ceqvt}. In
       
  1932   order to make this lifting to go through, we have to show that the
       
  1933   permutation operations are respectful. This amounts to showing that the
       
  1934   alpha-equivalence relations are equivariant, which
       
  1935   we already established in Lemma~\ref{equiv}. As a result we can add the
       
  1936   equations
       
  1937   
       
  1938   \begin{equation}\label{calphaeqvt}
       
  1939   @{text "\<pi> \<bullet> (C\<^sup>\<alpha> x\<^isub>1 \<dots> x\<^isub>r) = C\<^sup>\<alpha> (\<pi> \<bullet> x\<^isub>1) \<dots> (\<pi> \<bullet> x\<^isub>r)"}
       
  1940   \end{equation}\smallskip
       
  1941 
       
  1942   \noindent
       
  1943   to our infrastructure. In a similar fashion we can lift the defining equations
       
  1944   of the free-atom functions @{text "fa_ty\<AL>"}$_{1..n}$ and
       
  1945   @{text "fa_bn\<AL>"}$_{1..m}$ as well as of the binding functions @{text
       
  1946   "bn\<AL>"}$_{1..m}$ and size functions @{text "size_ty\<AL>"}$_{1..n}$.
       
  1947   The latter are defined automatically for the raw types @{text "ty"}$_{1..n}$
       
  1948   by the datatype package of Isabelle/HOL.
       
  1949 
       
  1950   We also need to lift the properties that characterise when two raw terms of the form
       
  1951   
       
  1952   \[
       
  1953   \mbox{@{text "C x\<^isub>1 \<dots> x\<^isub>r \<approx>ty C x\<PRIME>\<^isub>1 \<dots> x\<PRIME>\<^isub>r"}}
       
  1954   \]\smallskip
       
  1955 
       
  1956   \noindent
       
  1957   are alpha-equivalent. This gives us conditions when the corresponding
       
  1958   alpha-equated terms are \emph{equal}, namely
       
  1959   
       
  1960   \[
       
  1961   @{text "C\<^sup>\<alpha> x\<^isub>1 \<dots> x\<^isub>r = C\<^sup>\<alpha> x\<PRIME>\<^isub>1 \<dots> x\<PRIME>\<^isub>r"}.
       
  1962   \]\smallskip
       
  1963   
       
  1964   \noindent
       
  1965   We call these conditions \emph{quasi-injectivity}. They correspond to the
       
  1966   premises in our alpha-equiva\-lence relations, except that the
       
  1967   relations @{text "\<approx>ty"}$_{1..n}$ are all replaced by equality (and similarly
       
  1968   the free-atom and binding functions are replaced by their lifted
       
  1969   counterparts). Recall the alpha-equivalence rules for @{text "Let"} and
       
  1970   @{text "Let_rec"} shown in \eqref{rawalpha}. For @{text "Let\<^sup>\<alpha>"} and
       
  1971   @{text "Let_rec\<^sup>\<alpha>"} we have
       
  1972 
       
  1973   \begin{equation}\label{alphalift}\mbox{
       
  1974   \begin{tabular}{@ {}c @ {}}
       
  1975   \infer{@{text "Let\<^sup>\<alpha> as t = Let\<^sup>\<alpha> as' t'"}}
       
  1976   {@{term "alpha_lst_ex (bn_al as, t) equal fa_trm_al (bn as', t')"} & 
       
  1977   \hspace{5mm}@{text "as \<approx>\<AL>\<^bsub>bn\<^esub> as'"}}\\
       
  1978   \\
       
  1979   \makebox[0mm]{\infer{@{text "Let_rec\<^sup>\<alpha> as t = Let_rec\<^sup>\<alpha> as' t'"}}
       
  1980   {@{term "alpha_lst_ex (bn_al as, ast) equ2 fa_trm2_al (bn_al as', ast')"}}}\\
       
  1981   \end{tabular}}
       
  1982   \end{equation}\smallskip
       
  1983 
       
  1984   We can also add to our infrastructure cases lemmas and a (mutual)
       
  1985   induction principle for the types @{text "ty\<AL>"}$_{1..n}$. The cases
       
  1986   lemmas allow the user to deduce a property @{text "P"} by exhaustively
       
  1987   analysing how an element of a type, say @{text "ty\<AL>"}$_i$, can be
       
  1988   constructed (that means one case for each of the term-constructors in @{text
       
  1989   "ty\<AL>"}$_i\,$). The lifted cases lemma for a type @{text
       
  1990   "ty\<AL>"}$_i\,$ looks as follows
       
  1991 
       
  1992   \begin{equation}\label{cases}
       
  1993   \infer{P}
       
  1994   {\begin{array}{l}
       
  1995   @{text "\<forall>x\<^isub>1\<dots>x\<^isub>k. y = C\<AL>\<^isub>1 x\<^isub>1 \<dots> x\<^isub>k \<Rightarrow> P"}\\
       
  1996   \hspace{5mm}\vdots\\
       
  1997   @{text "\<forall>x\<^isub>1\<dots>x\<^isub>l. y = C\<AL>\<^isub>m x\<^isub>1 \<dots> x\<^isub>l \<Rightarrow> P"}\\
       
  1998   \end{array}}
       
  1999   \end{equation}\smallskip
       
  2000 
       
  2001   \noindent
       
  2002   where @{text "y"} is a variable of type @{text "ty\<AL>"}$_i$ and @{text "P"} is the 
       
  2003   property that is established by the case analysis. Similarly, we have a (mutual) 
       
  2004   induction principle for the types @{text "ty\<AL>"}$_{1..n}$, which is of the 
       
  2005   form
       
  2006 
       
  2007    \begin{equation}\label{induct}
       
  2008   \infer{@{text "P\<^isub>1 y\<^isub>1 \<and> \<dots> \<and> P\<^isub>n y\<^isub>n "}}
       
  2009   {\begin{array}{l}
       
  2010   @{text "\<forall>x\<^isub>1\<dots>x\<^isub>k. P\<^isub>i x\<^isub>i \<and> \<dots> \<and> P\<^isub>j x\<^isub>j \<Rightarrow> P (C\<AL>\<^isub>1 x\<^isub>1 \<dots> x\<^isub>k)"}\\
       
  2011   \hspace{5mm}\vdots\\
       
  2012   @{text "\<forall>x\<^isub>1\<dots>x\<^isub>l. P\<^isub>r x\<^isub>r \<and> \<dots> \<and> P\<^isub>s x\<^isub>s \<Rightarrow> P (C\<AL>\<^isub>m x\<^isub>1 \<dots> x\<^isub>l)"}\\
       
  2013   \end{array}}
       
  2014   \end{equation}\smallskip
       
  2015 
       
  2016   \noindent
       
  2017   whereby the @{text P}$_{1..n}$ are the properties established by the
       
  2018   induction, and the @{text y}$_{1..n}$ are of type @{text
       
  2019   "ty\<AL>"}$_{1..n}$. Note that for the term constructor @{text
       
  2020   "C"}$^\alpha_1$ the induction principle has a hypothesis of the form
       
  2021 
       
  2022   \[
       
  2023   \mbox{@{text "\<forall>x\<^isub>1\<dots>x\<^isub>k. P\<^isub>i x\<^isub>i \<and> \<dots> \<and> P\<^isub>j x\<^isub>j \<Rightarrow> P (C\<AL>\<^sub>1 x\<^isub>1 \<dots> x\<^isub>k)"}} 
       
  2024   \]\smallskip
       
  2025 
       
  2026   \noindent 
       
  2027   in which the @{text "x"}$_{i..j}$ @{text "\<subseteq>"} @{text "x"}$_{1..k}$ are the
       
  2028   recursive arguments of this term constructor (similarly for the other
       
  2029   term-constructors). 
       
  2030 
       
  2031   Recall the lambda-calculus with @{text "Let"}-patterns shown in
       
  2032   \eqref{letpat}. The cases lemmas and the induction principle shown in
       
  2033   \eqref{cases} and \eqref{induct} boil down in that example to the following three inference
       
  2034   rules:
       
  2035 
       
  2036   \begin{equation}\label{inductex}\mbox{
       
  2037   \begin{tabular}{c}
       
  2038   \multicolumn{1}{@ {\hspace{-5mm}}l}{cases lemmas:}\smallskip\\
       
  2039   \infer{@{text "P\<^bsub>trm\<^esub>"}}
       
  2040   {\begin{array}{@ {}l@ {}}
       
  2041    @{text "\<forall>x. y = Var\<^sup>\<alpha> x \<Rightarrow> P\<^bsub>trm\<^esub>"}\\
       
  2042    @{text "\<forall>x\<^isub>1 x\<^isub>2. y = App\<^sup>\<alpha> x\<^isub>1 x\<^isub>2 \<Rightarrow> P\<^bsub>trm\<^esub>"}\\
       
  2043    @{text "\<forall>x\<^isub>1 x\<^isub>2. y = Lam\<^sup>\<alpha> x\<^isub>1 x\<^isub>2 \<Rightarrow> P\<^bsub>trm\<^esub>"}\\
       
  2044    @{text "\<forall>x\<^isub>1 x\<^isub>2 x\<^isub>3. y = Let_pat\<^sup>\<alpha> x\<^isub>1 x\<^isub>2 x\<^isub>3 \<Rightarrow> P\<^bsub>trm\<^esub>"}
       
  2045    \end{array}}\hspace{10mm}
       
  2046 
       
  2047   \infer{@{text "P\<^bsub>pat\<^esub>"}}
       
  2048   {\begin{array}{@ {}l@ {}}
       
  2049    @{text "\<forall>x. y = PVar\<^sup>\<alpha> x \<Rightarrow> P\<^bsub>pat\<^esub>"}\\
       
  2050    @{text "\<forall>x\<^isub>1 x\<^isub>2. y = PTup\<^sup>\<alpha> x\<^isub>1 x\<^isub>2 \<Rightarrow> P\<^bsub>pat\<^esub>"}
       
  2051   \end{array}}\medskip\\
       
  2052 
       
  2053   \multicolumn{1}{@ {\hspace{-5mm}}l}{induction principle:}\smallskip\\
       
  2054   
       
  2055   \infer{@{text "P\<^bsub>trm\<^esub> y\<^isub>1 \<and> P\<^bsub>pat\<^esub> y\<^isub>2"}}
       
  2056   {\begin{array}{@ {}l@ {}}
       
  2057    @{text "\<forall>x. P\<^bsub>trm\<^esub> (Var\<^sup>\<alpha> x)"}\\
       
  2058    @{text "\<forall>x\<^isub>1 x\<^isub>2. P\<^bsub>trm\<^esub> x\<^isub>1 \<and> P\<^bsub>trm\<^esub> x\<^isub>2 \<Rightarrow> P\<^bsub>trm\<^esub> (App\<^sup>\<alpha> x\<^isub>1 x\<^isub>2)"}\\
       
  2059    @{text "\<forall>x\<^isub>1 x\<^isub>2. P\<^bsub>trm\<^esub> x\<^isub>2 \<Rightarrow> P\<^bsub>trm\<^esub> (Lam\<^sup>\<alpha> x\<^isub>1 x\<^isub>2)"}\\
       
  2060    @{text "\<forall>x\<^isub>1 x\<^isub>2 x\<^isub>3. P\<^bsub>pat\<^esub> x\<^isub>1 \<and> P\<^bsub>trm\<^esub> x\<^isub>2 \<and> P\<^bsub>trm\<^esub> x\<^isub>3 \<Rightarrow> P\<^bsub>trm\<^esub> (Let_pat\<^sup>\<alpha> x\<^isub>1 x\<^isub>2 x\<^isub>3)"}\\
       
  2061    @{text "\<forall>x. P\<^bsub>pat\<^esub> (PVar\<^sup>\<alpha> x)"}\\
       
  2062    @{text "\<forall>x\<^isub>1 x\<^isub>2. P\<^bsub>pat\<^esub> x\<^isub>1 \<and> P\<^bsub>pat\<^esub> x\<^isub>2 \<Rightarrow> P\<^bsub>pat\<^esub> (PTup\<^sup>\<alpha> x\<^isub>1 x\<^isub>2)"}
       
  2063   \end{array}}
       
  2064   \end{tabular}}
       
  2065   \end{equation}\smallskip
       
  2066 
       
  2067   By working now completely on the alpha-equated level, we
       
  2068   can first show using \eqref{calphaeqvt} and Property~\ref{swapfreshfresh} that the support of each term
       
  2069   constructor is included in the support of its arguments, 
       
  2070   namely
       
  2071 
       
  2072   \[
       
  2073   @{text "(supp x\<^isub>1 \<union> \<dots> \<union> supp x\<^isub>r) supports (C\<^sup>\<alpha> x\<^isub>1 \<dots> x\<^isub>r)"}
       
  2074   \]\smallskip
       
  2075 
       
  2076   \noindent
       
  2077   This allows us to prove using the induction principle for  @{text "ty\<AL>"}$_{1..n}$ 
       
  2078   that every element of type @{text "ty\<AL>"}$_{1..n}$ is finitely supported 
       
  2079   (using Proposition~\ref{supportsprop}{\it (i)}). 
       
  2080   Similarly, we can establish by induction that the free-atom functions and binding 
       
  2081   functions are equivariant, namely
       
  2082   
       
  2083   \[\mbox{
       
  2084   \begin{tabular}{rcl}
       
  2085   @{text "\<pi> \<bullet> (fa_ty\<AL>\<^isub>i  x)"} & $=$ & @{text "fa_ty\<AL>\<^isub>i (\<pi> \<bullet> x)"}\\
       
  2086   @{text "\<pi> \<bullet> (fa_bn\<AL>\<^isub>j  x)"} & $=$ & @{text "fa_bn\<AL>\<^isub>j (\<pi> \<bullet> x)"}\\
       
  2087   @{text "\<pi> \<bullet> (bn\<AL>\<^isub>j  x)"}    & $=$ & @{text "bn\<AL>\<^isub>j (\<pi> \<bullet> x)"}\\
       
  2088   \end{tabular}}
       
  2089   \]\smallskip
       
  2090 
       
  2091   
       
  2092   \noindent
       
  2093   Lastly, we can show that the support of elements in @{text
       
  2094   "ty\<AL>"}$_{1..n}$ is the same as the free-atom functions @{text
       
  2095   "fa_ty\<AL>"}$_{1..n}$.  This fact is important in the nominal setting where
       
  2096   the general theory is formulated in terms of support and freshness, but also
       
  2097   provides evidence that our notions of free-atoms and alpha-equivalence
       
  2098   `match up' correctly.
       
  2099 
       
  2100   \begin{thm}\label{suppfa} 
       
  2101   For @{text "x"}$_{1..n}$ with type @{text "ty\<AL>"}$_{1..n}$, we have
       
  2102   @{text "supp x\<^isub>i = fa_ty\<AL>\<^isub>i x\<^isub>i"}.
       
  2103   \end{thm}
       
  2104 
       
  2105   \begin{proof}
       
  2106   The proof is by induction on @{text "x"}$_{1..n}$. In each case
       
  2107   we unfold the definition of @{text "supp"}, move the swapping inside the 
       
  2108   term-constructors and then use the quasi-injectivity lemmas in order to complete the
       
  2109   proof. For the abstraction cases we use then the facts derived in Theorem~\ref{suppabs},
       
  2110   for which we have to know that every body of an abstraction is finitely supported.
       
  2111   This, we have proved earlier.
       
  2112   \end{proof}
       
  2113 
       
  2114   \noindent
       
  2115   Consequently, we can replace the free-atom functions by @{text "supp"} in  
       
  2116   our quasi-injection lemmas. In the examples shown in \eqref{alphalift}, for instance,
       
  2117   we obtain for @{text "Let\<^sup>\<alpha>"} and @{text "Let_rec\<^sup>\<alpha>"} 
       
  2118 
       
  2119   \[\mbox{
       
  2120   \begin{tabular}{@ {}c @ {}}
       
  2121   \infer{@{text "Let\<^sup>\<alpha> as t = Let\<^sup>\<alpha> as' t'"}}
       
  2122   {@{term "alpha_lst_ex (bn_al as, t) equal supp (bn_al as', t')"} & 
       
  2123   \hspace{5mm}@{text "as \<approx>\<AL>\<^bsub>bn\<^esub> as'"}}\\
       
  2124   \\
       
  2125   \makebox[0mm]{\infer{@{text "Let_rec\<^sup>\<alpha> as t = Let_rec\<^sup>\<alpha> as' t'"}}
       
  2126   {@{term "alpha_lst_ex (bn_al as, ast) equ2 supp2 (bn_al as', ast')"}}}\\
       
  2127   \end{tabular}}
       
  2128   \]\smallskip
       
  2129 
       
  2130   \noindent
       
  2131   Taking into account that the compound equivalence relation @{term
       
  2132   "equ2"} and the compound free-atom function @{term "supp2"} are by
       
  2133   definition equal to @{term "equal"} and @{term "supp"}, respectively, the
       
  2134   above rules simplify further to
       
  2135 
       
  2136   \[\mbox{
       
  2137   \begin{tabular}{@ {}c @ {}}
       
  2138   \infer{@{text "Let\<^sup>\<alpha> as t = Let\<^sup>\<alpha> as' t'"}}
       
  2139   {@{term "Abs_lst (bn_al as) t = Abs_lst (bn_al as') t'"} & 
       
  2140   \hspace{5mm}@{text "as \<approx>\<AL>\<^bsub>bn\<^esub> as'"}}\\
       
  2141   \\
       
  2142   \makebox[0mm]{\infer{@{text "Let_rec\<^sup>\<alpha> as t = Let_rec\<^sup>\<alpha> as' t'"}}
       
  2143   {@{term "Abs_lst (bn_al as) ast = Abs_lst (bn_al as') ast'"}}}\\
       
  2144   \end{tabular}}
       
  2145   \]\smallskip
       
  2146 
       
  2147   \noindent
       
  2148   which means we can characterise equality between term-constructors (on the
       
  2149   alpha-equated level) in terms of equality between the abstractions defined
       
  2150   in Section~\ref{sec:binders}. From this we can deduce the support for @{text
       
  2151   "Let\<^sup>\<alpha>"} and @{text "Let_rec\<^sup>\<alpha>"}, namely
       
  2152 
       
  2153 
       
  2154   \[\mbox{
       
  2155   \begin{tabular}{l@ {\hspace{2mm}}l@ {\hspace{2mm}}l}
       
  2156   @{text "supp (Let\<^sup>\<alpha> as t)"} & @{text "="} & @{text "(supp t - set (bn\<^sup>\<alpha> as)) \<union> fa\<AL>\<^bsub>bn\<^esub> as"}\\
       
  2157   @{text "supp (Let_rec\<^sup>\<alpha> as t)"} & @{text "="} & @{text "(supp t \<union> supp as) - set (bn\<^sup>\<alpha> as)"}\\
       
  2158   \end{tabular}}
       
  2159   \]\smallskip
       
  2160 
       
  2161   \noindent
       
  2162   using the support of abstractions derived in Theorem~\ref{suppabs}.
       
  2163 
       
  2164   To sum up this section, we have established a reasoning infrastructure for the
       
  2165   types @{text "ty\<AL>"}$_{1..n}$ by first lifting definitions from the
       
  2166   `raw' level to the quotient level and then by proving facts about
       
  2167   these lifted definitions. All necessary proofs are generated automatically
       
  2168   by custom ML-code.
       
  2169 *}
       
  2170 
       
  2171 
       
  2172 section {* Strong Induction Principles *}
       
  2173 
       
  2174 text {*
       
  2175   In the previous section we derived induction principles for alpha-equated
       
  2176   terms (see \eqref{induct} for the general form and \eqref{inductex} for an
       
  2177   example). This was done by lifting the corresponding inductions principles
       
  2178   for `raw' terms.  We already employed these induction principles for
       
  2179   deriving several facts about alpha-equated terms, including the property that
       
  2180   the free-atom functions and the notion of support coincide. Still, we
       
  2181   call these induction principles \emph{weak}, because for a term-constructor,
       
  2182   say \mbox{@{text "C\<^sup>\<alpha> x\<^isub>1\<dots>x\<^isub>r"}}, the induction
       
  2183   hypothesis requires us to establish (under some assumptions) a property
       
  2184   @{text "P (C\<^sup>\<alpha> x\<^isub>1\<dots>x\<^isub>r)"} for \emph{all} @{text
       
  2185   "x"}$_{1..r}$. The problem with this is that in the presence of binders we cannot make
       
  2186   any assumptions about the atoms that are bound---for example assuming the variable convention. 
       
  2187   One obvious way around this
       
  2188   problem is to rename bound atoms. Unfortunately, this leads to very clunky proofs
       
  2189   and makes formalisations grievous experiences (especially in the context of 
       
  2190   multiple bound atoms).
       
  2191 
       
  2192   For the older versions of Nominal Isabelle we described in \cite{Urban08} a
       
  2193   method for automatically strengthening weak induction principles. These
       
  2194   stronger induction principles allow the user to make additional assumptions
       
  2195   about bound atoms. The advantage of these assumptions is that they make in
       
  2196   most cases any renaming of bound atoms unnecessary.  To explain how the
       
  2197   strengthening works, we use as running example the lambda-calculus with
       
  2198   @{text "Let"}-patterns shown in \eqref{letpat}. Its weak induction principle
       
  2199   is given in \eqref{inductex}.  The stronger induction principle is as
       
  2200   follows:
       
  2201 
       
  2202   \begin{equation}\label{stronginduct}
       
  2203   \mbox{
       
  2204   \begin{tabular}{@ {}c@ {}}
       
  2205   \infer{@{text "P\<^bsub>trm\<^esub> c y\<^isub>1 \<and> P\<^bsub>pat\<^esub> c y\<^isub>2"}}
       
  2206   {\begin{array}{l}
       
  2207    @{text "\<forall>x c. P\<^bsub>trm\<^esub> c (Var\<^sup>\<alpha> x)"}\\
       
  2208    @{text "\<forall>x\<^isub>1 x\<^isub>2 c. (\<forall>d. P\<^bsub>trm\<^esub> d x\<^isub>1) \<and> (\<forall>d. P\<^bsub>trm\<^esub> d x\<^isub>2) \<Rightarrow> P\<^bsub>trm\<^esub> c (App\<^sup>\<alpha> x\<^isub>1 x\<^isub>2)"}\\
       
  2209    @{text "\<forall>x\<^isub>1 x\<^isub>2 c. atom x\<^isub>1 # c \<and> (\<forall>d. P\<^bsub>trm\<^esub> d x\<^isub>2) \<Rightarrow> P\<^bsub>trm\<^esub> c (Lam\<^sup>\<alpha> x\<^isub>1 x\<^isub>2)"}\\
       
  2210    @{text "\<forall>x\<^isub>1 x\<^isub>2 x\<^isub>3 c. (set (bn\<^sup>\<alpha> x\<^isub>1)) #\<^sup>* c \<and>"}\\ 
       
  2211    \hspace{10mm}@{text "(\<forall>d. P\<^bsub>pat\<^esub> d x\<^isub>1) \<and> (\<forall>d. P\<^bsub>trm\<^esub> d x\<^isub>2) \<and> (\<forall>d. P\<^bsub>trm\<^esub> d x\<^isub>3) \<Rightarrow> P\<^bsub>trm\<^esub> c (Let_pat\<^sup>\<alpha> x\<^isub>1 x\<^isub>2 x\<^isub>3)"}\\
       
  2212    @{text "\<forall>x c. P\<^bsub>pat\<^esub> c (PVar\<^sup>\<alpha> x)"}\\
       
  2213    @{text "\<forall>x\<^isub>1 x\<^isub>2 c. (\<forall>d. P\<^bsub>pat\<^esub> d x\<^isub>1) \<and> (\<forall>d. P\<^bsub>pat\<^esub> d x\<^isub>2) \<Rightarrow> P\<^bsub>pat\<^esub> c (PTup\<^sup>\<alpha> x\<^isub>1 x\<^isub>2)"}
       
  2214   \end{array}}
       
  2215   \end{tabular}}
       
  2216   \end{equation}\smallskip
       
  2217 
       
  2218 
       
  2219   \noindent
       
  2220   Notice that instead of establishing two properties of the form @{text "
       
  2221   P\<^bsub>trm\<^esub> y\<^isub>1 \<and> P\<^bsub>pat\<^esub> y\<^isub>2"}, as the
       
  2222   weak one does, the stronger induction principle establishes the properties
       
  2223   of the form @{text " P\<^bsub>trm\<^esub> c y\<^isub>1 \<and>
       
  2224   P\<^bsub>pat\<^esub> c y\<^isub>2"} in which the additional parameter @{text
       
  2225   c} is assumed to be of finite support. The purpose of @{text "c"} is to
       
  2226   `control' which freshness assumptions the binders should satisfy in the
       
  2227   @{text "Lam\<^sup>\<alpha>"} and @{text "Let_pat\<^sup>\<alpha>"} cases: for @{text
       
  2228   "Lam\<^sup>\<alpha>"} we can assume the bound atom @{text "x\<^isub>1"} is fresh
       
  2229   for @{text "c"} (third line); for @{text "Let_pat\<^sup>\<alpha>"} we can assume
       
  2230   all bound atoms from an assignment are fresh for @{text "c"} (fourth
       
  2231   line). In order to see how an instantiation for @{text "c"} in the
       
  2232   conclusion `controls' the premises, one has to take into account that
       
  2233   Isabelle/HOL is a typed logic. That means if @{text "c"} is instantiated
       
  2234   with, for example, a pair, then this type-constraint will be propagated to
       
  2235   the premises. The main point is that if @{text "c"} is instantiated
       
  2236   appropriately, then the user can mimic the usual convenient `pencil-and-paper'
       
  2237   reasoning employing the variable convention about bound and free variables
       
  2238   being distinct \cite{Urban08}.
       
  2239 
       
  2240   In what follows we will show that the weak induction principle in
       
  2241   \eqref{inductex} implies the strong one \eqref{stronginduct}. This fact was established for
       
  2242   single binders in \cite{Urban08} by some quite involved, nevertheless
       
  2243   automated, induction proof. In this paper we simplify the proof by
       
  2244   leveraging the automated proving tools from the function package of
       
  2245   Isabelle/HOL \cite{Krauss09}. The reasoning principle behind these tools
       
  2246   is well-founded induction. To use them in our setting, we have to discharge
       
  2247   two proof obligations: one is that we have well-founded measures (one for
       
  2248   each type @{text "ty"}$^\alpha_{1..n}$) that decrease in every induction
       
  2249   step and the other is that we have covered all cases in the induction
       
  2250   principle. Once these two proof obligations are discharged, the reasoning
       
  2251   infrastructure of the function package will automatically derive the
       
  2252   stronger induction principle. This way of establishing the stronger induction
       
  2253   principle is considerably simpler than the earlier work presented in \cite{Urban08}.
       
  2254 
       
  2255   As measures we can use the size functions @{text "size_ty"}$^\alpha_{1..n}$,
       
  2256   which we lifted in the previous section and which are all well-founded. It
       
  2257   is straightforward to establish that the sizes decrease in every
       
  2258   induction step. What is left to show is that we covered all cases. 
       
  2259   To do so, we have to derive stronger cases lemmas, which look in our
       
  2260   running example as follows:
       
  2261 
       
  2262   \[\mbox{
       
  2263   \begin{tabular}{@ {}c@ {\hspace{4mm}}c@ {}}
       
  2264   \infer{@{text "P\<^bsub>trm\<^esub>"}}
       
  2265   {\begin{array}{@ {}l@ {}}
       
  2266    @{text "\<forall>x. y = Var\<^sup>\<alpha> x \<Rightarrow> P\<^bsub>trm\<^esub>"}\\
       
  2267    @{text "\<forall>x\<^isub>1 x\<^isub>2. y = App\<^sup>\<alpha> x\<^isub>1 x\<^isub>2 \<Rightarrow> P\<^bsub>trm\<^esub>"}\\
       
  2268    @{text "\<forall>x\<^isub>1 x\<^isub>2. atom x\<^isub>1 # c \<and> y = Lam\<^sup>\<alpha> x\<^isub>1 x\<^isub>2 \<Rightarrow> P\<^bsub>trm\<^esub>"}\\
       
  2269    @{text "\<forall>x\<^isub>1 x\<^isub>2 x\<^isub>3. set (bn\<^sup>\<alpha> x\<^isub>1) #\<^sup>* c \<and> y = Let_pat\<^sup>\<alpha> x\<^isub>1 x\<^isub>2 x\<^isub>3 \<Rightarrow> P\<^bsub>trm\<^esub>"}
       
  2270    \end{array}} &
       
  2271 
       
  2272   \infer{@{text "P\<^bsub>pat\<^esub>"}}
       
  2273   {\begin{array}{@ {}l@ {}}
       
  2274    @{text "\<forall>x. y = PVar\<^sup>\<alpha> x \<Rightarrow> P\<^bsub>pat\<^esub>"}\\
       
  2275    @{text "\<forall>x\<^isub>1 x\<^isub>2. y = PTup\<^sup>\<alpha> x\<^isub>1 x\<^isub>2 \<Rightarrow> P\<^bsub>pat\<^esub>"}
       
  2276   \end{array}}
       
  2277   \end{tabular}}
       
  2278   \]\smallskip 
       
  2279 
       
  2280   \noindent
       
  2281   They are stronger in the sense that they allow us to assume in the @{text
       
  2282   "Lam\<^sup>\<alpha>"} and @{text "Let_pat\<^sup>\<alpha>"} cases that the bound atoms
       
  2283   avoid, or are fresh for, a context @{text "c"} (which is assumed to be finitely supported).
       
  2284   
       
  2285   These stronger cases lemmas can be derived from the `weak' cases lemmas
       
  2286   given in \eqref{inductex}. This is trivial in case of patterns (the one on
       
  2287   the right-hand side) since the weak and strong cases lemma coincide (there
       
  2288   is no binding in patterns).  Interesting are only the cases for @{text
       
  2289   "Lam\<^sup>\<alpha>"} and @{text "Let_pat\<^sup>\<alpha>"}, where we have some binders and
       
  2290   therefore have an additional assumption about avoiding @{text "c"}.  Let us
       
  2291   first establish the case for @{text "Lam\<^sup>\<alpha>"}. By the weak cases lemma
       
  2292   \eqref{inductex} we can assume that
       
  2293 
       
  2294   \begin{equation}\label{assm}
       
  2295   @{text "y = Lam\<^sup>\<alpha> x\<^isub>1 x\<^isub>2"}
       
  2296   \end{equation}\smallskip
       
  2297 
       
  2298   \noindent
       
  2299   holds, and need to establish @{text "P\<^bsub>trm\<^esub>"}. The stronger cases lemma has the 
       
  2300   corresponding implication 
       
  2301 
       
  2302   \begin{equation}\label{imp}
       
  2303   @{text "\<forall>x\<^isub>1 x\<^isub>2. atom x\<^isub>1 # c \<and> y = Lam\<^sup>\<alpha> x\<^isub>1 x\<^isub>2 \<Rightarrow> P\<^bsub>trm\<^esub>"}
       
  2304   \end{equation}\smallskip
       
  2305 
       
  2306   \noindent
       
  2307   which we must use in order to infer @{text "P\<^bsub>trm\<^esub>"}. Clearly, we cannot
       
  2308   use this implication directly, because we have no information whether or not @{text
       
  2309   "x\<^isub>1"} is fresh for @{text "c"}.  However, we can use Properties
       
  2310   \ref{supppermeq} and \ref{avoiding} to rename @{text "x\<^isub>1"}. We know
       
  2311   by Theorem~\ref{suppfa} that @{text "{atom x\<^isub>1} #\<^sup>* Lam\<^sup>\<alpha>
       
  2312   x\<^isub>1 x\<^isub>2"} (since its support is @{text "supp x\<^isub>2 -
       
  2313   {atom x\<^isub>1}"}). Property \ref{avoiding} provides us then with a
       
  2314   permutation @{text "\<pi>"}, such that @{text "{atom (\<pi> \<bullet> x\<^isub>1)} #\<^sup>*
       
  2315   c"} and \mbox{@{text "supp (Lam\<^sup>\<alpha> x\<^isub>1 x\<^isub>2) #\<^sup>* \<pi>"}} hold.
       
  2316   By using Property \ref{supppermeq}, we can infer from the latter that 
       
  2317 
       
  2318   \[
       
  2319   @{text "Lam\<^sup>\<alpha> (\<pi> \<bullet> x\<^isub>1) (\<pi> \<bullet> x\<^isub>2) = Lam\<^sup>\<alpha> x\<^isub>1 x\<^isub>2"} 
       
  2320   \]\smallskip
       
  2321 
       
  2322   \noindent
       
  2323   holds. We can use this equation in the assumption \eqref{assm}, and hence
       
  2324   use the implication \eqref{imp} with the renamed @{text "\<pi> \<bullet> x\<^isub>1"}
       
  2325   and @{text "\<pi> \<bullet> x\<^isub>2"} for concluding this case.
       
  2326 
       
  2327   The @{text "Let_pat\<^sup>\<alpha>"}-case involving a deep binder is slightly more complicated.
       
  2328   We have the assumption
       
  2329 
       
  2330   \begin{equation}\label{assmtwo}
       
  2331   @{text "y = Let_pat\<^sup>\<alpha> x\<^isub>1 x\<^isub>2 x\<^isub>3"}
       
  2332   \end{equation}\smallskip
       
  2333 
       
  2334   \noindent
       
  2335   and the implication from the stronger cases lemma
       
  2336 
       
  2337   \begin{equation}\label{impletpat}
       
  2338   @{text "\<forall>x\<^isub>1 x\<^isub>2 x\<^isub>3. set (bn\<^sup>\<alpha> x\<^isub>1) #\<^sup>* c \<and> y = Let_pat\<^sup>\<alpha> x\<^isub>1 x\<^isub>2 x\<^isub>3 \<Rightarrow> P\<^bsub>trm\<^esub>"}
       
  2339   \end{equation}\smallskip
       
  2340 
       
  2341   \noindent
       
  2342   The reason that this case is more complicated is that we cannot directly apply Property 
       
  2343   \ref{avoiding} for obtaining a renaming permutation. Property \ref{avoiding} requires
       
  2344   that the binders are fresh for the term in which we want to perform the renaming. But
       
  2345   this is not true in terms such as (using an informal notation)
       
  2346 
       
  2347   \[
       
  2348   @{text "Let (x, y) := (x, y) in (x, y)"}
       
  2349   \]\smallskip
       
  2350 
       
  2351   \noindent
       
  2352   where @{text x} and @{text y} are bound in the term, but are also free
       
  2353   in the right-hand side of the assignment. We can, however, obtain such a renaming permutation, say
       
  2354   @{text "\<pi>"}, for the abstraction @{term "Abs_lst (bn_al x\<^isub>1)
       
  2355   x\<^isub>3"}. As a result we have \mbox{@{term "set (bn_al (\<pi> \<bullet> x\<^isub>1))
       
  2356   \<sharp>* c"}} and @{term "Abs_lst (bn_al (\<pi> \<bullet> x\<^isub>1)) (\<pi> \<bullet> x\<^isub>3) =
       
  2357   Abs_lst (bn_al x\<^isub>1) x\<^isub>3"} (remember @{text "set"} and @{text
       
  2358   "bn\<^sup>\<alpha>"} are equivariant).  Now the quasi-injective property for @{text
       
  2359   "Let_pat\<^sup>\<alpha>"} states that
       
  2360 
       
  2361   \[
       
  2362   \infer{@{text "Let_pat\<^sup>\<alpha> p t\<^isub>1 t\<^isub>2 = Let_pat\<^sup>\<alpha> p\<PRIME> t\<PRIME>\<^isub>1 t\<PRIME>\<^isub>2"}}
       
  2363   {@{text "[bn\<^sup>\<alpha> p]\<^bsub>list\<^esub>. t\<^isub>2 = [bn\<^sup>\<alpha> p']\<^bsub>list\<^esub>. t\<PRIME>\<^isub>2"}\;\; & 
       
  2364   @{text "p \<approx>\<AL>\<^bsub>bn\<^esub> p\<PRIME>"}\;\; & @{text "t\<^isub>1 = t\<PRIME>\<^isub>1"}}
       
  2365   \]\smallskip
       
  2366 
       
  2367   \noindent
       
  2368   Since all atoms in a pattern are bound by @{text "Let_pat\<^sup>\<alpha>"}, we can infer
       
  2369   that @{text "(\<pi> \<bullet> x\<^isub>1) \<approx>\<AL>\<^bsub>bn\<^esub> x\<^isub>1"} holds for every @{text "\<pi>"}. Therefore we have that
       
  2370 
       
  2371   \[
       
  2372   @{text "Let_pat\<^sup>\<alpha> (\<pi> \<bullet> x\<^isub>1) x\<^isub>2 (\<pi> \<bullet> x\<^isub>3) = Let_pat\<^sup>\<alpha> x\<^isub>1 x\<^isub>2 x\<^isub>3"}  
       
  2373   \]\smallskip
       
  2374   
       
  2375   \noindent
       
  2376   Taking the left-hand side in the assumption shown in \eqref{assmtwo}, we can use
       
  2377   the implication \eqref{impletpat} from the stronger cases lemma to infer @{text "P\<^bsub>trm\<^esub>"}, as needed.
       
  2378 
       
  2379   The remaining difficulty is when a deep binder contains some atoms that are
       
  2380   bound and some that are free. An example is @{text "Let\<^sup>\<alpha>"} in
       
  2381   \eqref{letrecs}.  In such cases @{text "(\<pi> \<bullet> x\<^isub>1)
       
  2382   \<approx>\<AL>\<^bsub>bn\<^esub> x\<^isub>1"} does not hold in general. The idea however is
       
  2383   that @{text "\<pi>"} only renames atoms that become bound. In this way @{text "\<pi>"}
       
  2384   does not affect @{text "\<approx>\<AL>\<^bsub>bn\<^esub>"} (which only tracks alpha-equivalence of terms that are not
       
  2385   under the binder). However, the problem is that the
       
  2386   permutation operation @{text "\<pi> \<bullet> x\<^isub>1"} applies to all atoms in @{text "x\<^isub>1"}. To avoid this
       
  2387   we introduce an auxiliary permutation operations, written @{text "_
       
  2388   \<bullet>\<^bsub>bn\<^esub> _"}, for deep binders that only permutes bound atoms (or
       
  2389   more precisely the atoms specified by the @{text "bn"}-functions) and leaves
       
  2390   the other atoms unchanged. Like the functions @{text "fa_bn"}$_{1..m}$, we
       
  2391   can define these permutation operations over raw terms analysing how the functions @{text
       
  2392   "bn"}$_{1..m}$ are defined. Assuming the user specified a clause
       
  2393 
       
  2394   \[  
       
  2395   @{text "bn (C x\<^isub>1 \<dots> x\<^isub>r) = rhs"}
       
  2396   \]\smallskip
       
  2397 
       
  2398   \noindent
       
  2399   we define @{text "\<pi> \<bullet>\<^bsub>bn\<^esub> (C x\<^isub>1 \<dots> x\<^isub>r) \<equiv> C y\<^isub>1 \<dots> y\<^isub>r"} with @{text "y\<^isub>i"} determined as follows:
       
  2400 
       
  2401   \[\mbox{
       
  2402   \begin{tabular}{c@ {\hspace{2mm}}p{0.9\textwidth}}
       
  2403   $\bullet$ & @{text "y\<^isub>i \<equiv> x\<^isub>i"} provided @{text "x\<^isub>i"} does not occur in @{text "rhs"}\\
       
  2404   $\bullet$ & @{text "y\<^isub>i \<equiv> \<pi> \<bullet>\<^bsub>bn\<^esub> x\<^isub>i"} provided @{text "bn x\<^isub>i"} is in @{text "rhs"}\\
       
  2405   $\bullet$ & @{text "y\<^isub>i \<equiv> \<pi> \<bullet> x\<^isub>i"} otherwise
       
  2406   \end{tabular}}
       
  2407   \]\smallskip
       
  2408 
       
  2409   \noindent
       
  2410   Using again the quotient package  we can lift the auxiliary permutation operations
       
  2411   @{text "_ \<bullet>\<^bsub>bn\<^esub> _"}
       
  2412   to alpha-equated terms. Moreover we can prove the following two properties:
       
  2413 
       
  2414   \begin{lem}\label{permutebn} 
       
  2415   Given a binding function @{text "bn\<^sup>\<alpha>"} and auxiliary equivalence @{text "\<approx>\<AL>\<^bsub>bn\<^esub>"} 
       
  2416   then for all @{text "\<pi>"}\smallskip\\
       
  2417   {\it (i)} @{text "\<pi> \<bullet> (bn\<^sup>\<alpha> x) = bn\<^sup>\<alpha> (\<pi> \<bullet>\<AL>\<^bsub>bn\<^esub> x)"} and\\ 
       
  2418   {\it (ii)} @{text "(\<pi>  \<bullet>\<AL>\<^bsub>bn\<^esub> x) \<approx>\<AL>\<^bsub>bn\<^esub> x"}.
       
  2419   \end{lem}
       
  2420 
       
  2421   \begin{proof} 
       
  2422   By induction on @{text x}. The properties follow by unfolding of the
       
  2423   definitions.
       
  2424   \end{proof}
       
  2425 
       
  2426   \noindent
       
  2427   The first property states that a permutation applied to a binding function
       
  2428   is equivalent to first permuting the binders and then calculating the bound
       
  2429   atoms. The second states that @{text "_ \<bullet>\<AL>\<^bsub>bn\<^esub> _"} preserves
       
  2430   @{text "\<approx>\<AL>\<^bsub>bn\<^esub>"}.  The main point of the auxiliary
       
  2431   permutation functions is that they allow us to rename just the bound atoms in a
       
  2432   term, without changing anything else.
       
  2433   
       
  2434   Having the auxiliary permutation function in place, we can now solve all remaining cases. 
       
  2435   For the @{text "Let\<^sup>\<alpha>"} term-constructor, for example, we can by Property \ref{avoiding} 
       
  2436   obtain a @{text "\<pi>"} such that 
       
  2437 
       
  2438   \[
       
  2439   @{text "(\<pi> \<bullet> (set (bn\<^sup>\<alpha> x\<^isub>1)) #\<^sup>* c"} \hspace{10mm}
       
  2440   @{text "\<pi> \<bullet> [bn\<^sup>\<alpha> x\<^isub>1]\<^bsub>list\<^esub>. x\<^isub>2 = [bn\<^sup>\<alpha> x\<^isub>1]\<^bsub>list\<^esub>. x\<^isub>2"} 
       
  2441   \]\smallskip
       
  2442 
       
  2443   \noindent
       
  2444   hold. Using the first part of Lemma \ref{permutebn}, we can simplify this
       
  2445   to @{text "set (bn\<^sup>\<alpha> (\<pi> \<bullet>\<AL>\<^bsub>bn\<^esub> x\<^isub>1)) #\<^sup>* c"} and 
       
  2446   \mbox{@{text "[bn\<^sup>\<alpha> (\<pi> \<bullet>\<AL>\<^bsub>bn\<^esub> x\<^isub>1)]\<^bsub>list\<^esub>. (\<pi> \<bullet> x\<^isub>2) = [bn\<^sup>\<alpha> x\<^isub>1]\<^bsub>list\<^esub>. x\<^isub>2"}}. Since
       
  2447   @{text "(\<pi>  \<bullet>\<AL>\<^bsub>bn\<^esub> x\<^isub>1) \<approx>\<AL>\<^bsub>bn\<^esub> x\<^isub>1"} holds by the second part,
       
  2448   we can infer that
       
  2449 
       
  2450   \[
       
  2451   @{text "Let\<^sup>\<alpha> (\<pi> \<bullet>\<AL>\<^bsub>bn\<^esub> x\<^isub>1) (\<pi> \<bullet> x\<^isub>2) = Let\<^sup>\<alpha> x\<^isub>1 x\<^isub>2"}  
       
  2452   \]\smallskip
       
  2453 
       
  2454   \noindent
       
  2455   holds. This allows us to use the implication from the strong cases
       
  2456   lemma, and we are done.
       
  2457 
       
  2458   Consequently,  we can discharge all proof-obligations about having `covered all
       
  2459   cases'. This completes the proof establishing that the weak induction principles imply 
       
  2460   the strong induction principles. These strong induction principles have already proved 
       
  2461   being very useful in practice, particularly for proving properties about 
       
  2462   capture-avoiding substitution \cite{Urban08}. 
       
  2463 *}
       
  2464 
       
  2465 
       
  2466 section {* Related Work\label{related} *}
       
  2467 
       
  2468 text {*
       
  2469   To our knowledge the earliest usage of general binders in a theorem prover
       
  2470   is described by Nara\-schew\-ski and Nipkow \cite{NaraschewskiNipkow99} with a
       
  2471   formalisation of the algorithm W. This formalisation implements binding in
       
  2472   type-schemes using a de-Bruijn indices representation. Since type-schemes in
       
  2473   W contain only a single place where variables are bound, different indices
       
  2474   do not refer to different binders (as in the usual de-Bruijn
       
  2475   representation), but to different bound variables. A similar idea has been
       
  2476   recently explored for general binders by Chargu\'eraud \cite{chargueraud09}
       
  2477   in the locally nameless approach to
       
  2478   binding.  There, de-Bruijn indices consist of two
       
  2479   numbers, one referring to the place where a variable is bound, and the other
       
  2480   to which variable is bound. The reasoning infrastructure for both
       
  2481   representations of bindings comes for free in theorem provers like
       
  2482   Isabelle/HOL and Coq, since the corresponding term-calculi can be implemented
       
  2483   as `normal' datatypes.  However, in both approaches it seems difficult to
       
  2484   achieve our fine-grained control over the `semantics' of bindings
       
  2485   (i.e.~whether the order of binders should matter, or vacuous binders should
       
  2486   be taken into account). To do so, one would require additional predicates
       
  2487   that filter out unwanted terms. Our guess is that such predicates result in
       
  2488   rather intricate formal reasoning. We are not aware of any formalisation of 
       
  2489   a non-trivial language that uses Chargu\'eraud's idea.
       
  2490 
       
  2491   Another technique for representing binding is higher-order abstract syntax
       
  2492   (HOAS), which for example is implemented in the Twelf system \cite{pfenningsystem}. 
       
  2493   This representation technique supports very elegantly many aspects of
       
  2494   \emph{single} binding, and impressive work by Lee et al~\cite{LeeCraryHarper07} 
       
  2495   has been done that uses HOAS for mechanising the metatheory of SML. We
       
  2496   are, however, not aware how multiple binders of SML are represented in this
       
  2497   work. Judging from the submitted Twelf-solution for the POPLmark challenge,
       
  2498   HOAS cannot easily deal with binding constructs where the number of bound
       
  2499   variables is not fixed. For example, in the second part of this challenge,
       
  2500   @{text "Let"}s involve patterns that bind multiple variables at once. In
       
  2501   such situations, HOAS seems to have to resort to the
       
  2502   iterated-single-binders-approach with all the unwanted consequences when
       
  2503   reasoning about the resulting terms.
       
  2504 
       
  2505 
       
  2506   Two formalisations involving general binders have been 
       
  2507   performed in older
       
  2508   versions of Nominal Isabelle (one about Psi-calculi and one about algorithm W 
       
  2509   \cite{BengtsonParow09,UrbanNipkow09}).  Both
       
  2510   use the approach based on iterated single binders. Our experience with
       
  2511   the latter formalisation has been disappointing. The major pain arose from
       
  2512   the need to `unbind' bound variables and the resulting formal reasoning turned out to
       
  2513   be rather unpleasant. In contrast, the unbinding can be 
       
  2514   done in one step with our
       
  2515   general binders described in this paper.
       
  2516 
       
  2517   The most closely related work to the one presented here is the Ott-tool by
       
  2518   Sewell et al \cite{ott-jfp} and the C$\alpha$ml language by Pottier
       
  2519   \cite{Pottier06}. Ott is a nifty front-end for creating \LaTeX{} documents
       
  2520   from specifications of term-calculi involving general binders. For a subset
       
  2521   of the specifications Ott can also generate theorem prover code using a `raw'
       
  2522   representation of terms, and in Coq also a locally nameless
       
  2523   representation. The developers of this tool have also put forward (on paper)
       
  2524   a definition for alpha-equivalence and free variables for terms that can be
       
  2525   specified in Ott.  This definition is rather different from ours, not using
       
  2526   any nominal techniques.  To our knowledge there is no concrete mathematical
       
  2527   result concerning this notion of alpha-equivalence and free variables. We
       
  2528   have proved that our definitions lead to alpha-equated terms, whose support
       
  2529   is as expected (that means bound atoms are removed from the support). We
       
  2530   also showed that our specifications lift from `raw' terms to 
       
  2531   alpha-equivalence classes. For this we have established (automatically) that every
       
  2532   term-constructor and function defined for `raw' terms 
       
  2533   is respectful w.r.t.~alpha-equivalence.
       
  2534 
       
  2535   Although we were heavily inspired by the syntax of Ott, its definition of
       
  2536   alpha-equi\-valence is unsuitable for our extension of Nominal
       
  2537   Isabelle. First, it is far too complicated to be a basis for automated
       
  2538   proofs implemented on the ML-level of Isabelle/HOL. Second, it covers cases
       
  2539   of binders depending on other binders, which just do not make sense for our
       
  2540   alpha-equated terms (the corresponding @{text "fa"}-functions would not lift). 
       
  2541   Third, it allows empty types that have no meaning in a
       
  2542   HOL-based theorem prover. We also had to generalise slightly Ott's binding
       
  2543   clauses. In Ott one specifies binding clauses with a single body; we allow
       
  2544   more than one. We have to do this, because this makes a difference for our
       
  2545   notion of alpha-equivalence in case of \isacommand{binds (set)} and
       
  2546   \isacommand{binds (set+)}. Consider the examples
       
  2547   
       
  2548   \[\mbox{
       
  2549   \begin{tabular}{@ {}l@ {\hspace{2mm}}l@ {}}
       
  2550   @{text "Foo\<^isub>1 xs::name fset t::trm s::trm"} &  
       
  2551       \isacommand{binds (set)} @{text "xs"} \isacommand{in} @{text "t s"}\\
       
  2552   @{text "Foo\<^isub>2 xs::name fset t::trm s::trm"} &  
       
  2553       \isacommand{binds (set)} @{text "xs"} \isacommand{in} @{text "t"}, 
       
  2554       \isacommand{binds (set)} @{text "xs"} \isacommand{in} @{text "s"}\\
       
  2555   \end{tabular}}
       
  2556   \]\smallskip
       
  2557   
       
  2558   \noindent
       
  2559   In the first term-constructor we have a single body that happens to be
       
  2560   `spread' over two arguments; in the second term-constructor we have two
       
  2561   independent bodies in which the same variables are bound. As a result we
       
  2562   have\footnote{Assuming @{term "a \<noteq> b"}, there is no permutation that can
       
  2563   make @{text "(a, b)"} equal with both @{text "(a, b)"} and @{text "(b, a)"}, but
       
  2564   there are two permutations so that we can make @{text "(a, b)"} and @{text
       
  2565   "(a, b)"} equal with one permutation, and @{text "(a, b)"} and @{text "(b,
       
  2566   a)"} with the other.}
       
  2567 
       
  2568    
       
  2569   \[\mbox{
       
  2570   \begin{tabular}{r@ {\hspace{1.5mm}}c@ {\hspace{1.5mm}}l}
       
  2571   @{text "Foo\<^isub>1 {a, b} (a, b) (a, b)"} & $\not=$ & 
       
  2572   @{text "Foo\<^isub>1 {a, b} (a, b) (b, a)"}
       
  2573   \end{tabular}}
       
  2574   \]\smallskip
       
  2575  
       
  2576   \noindent
       
  2577   but 
       
  2578 
       
  2579   \[\mbox{
       
  2580   \begin{tabular}{r@ {\hspace{1.5mm}}c@ {\hspace{1.5mm}}l}
       
  2581   @{text "Foo\<^isub>2 {a, b} (a, b) (a, b)"} & $=$ & 
       
  2582   @{text "Foo\<^isub>2 {a, b} (a, b) (b, a)"}\\
       
  2583   \end{tabular}}
       
  2584   \]\smallskip
       
  2585   
       
  2586   \noindent
       
  2587   and therefore need the extra generality to be able to distinguish
       
  2588   between both specifications.  Because of how we set up our
       
  2589   definitions, we also had to impose some restrictions (like a single
       
  2590   binding function for a deep binder) that are not present in Ott. Our
       
  2591   expectation is that we can still cover many interesting term-calculi
       
  2592   from programming language research, for example the Core-Haskell
       
  2593   language from the Introduction. With the work presented in this
       
  2594   paper we can define it formally as shown in
       
  2595   Figure~\ref{nominalcorehas} and then Nominal Isabelle derives
       
  2596   automatically a corresponding reasoning infrastructure. However we
       
  2597   have found out that telescopes seem to not easily be representable
       
  2598   in our framework.  The reason is that we need to be able to lift our
       
  2599   @{text bn}-functions to alpha-equated lambda-terms and therefore
       
  2600   need to restrict what these @{text bn}-functions can return.
       
  2601   Telescopes can be represented in the framework described in
       
  2602   \cite{WeirichYorgeySheard11} using an extension of the usual
       
  2603   locally-nameless representation. 
       
  2604 
       
  2605   \begin{figure}[p]
       
  2606   \begin{boxedminipage}{\linewidth}
       
  2607   \small
       
  2608   \begin{tabular}{l}
       
  2609   \isacommand{atom\_decl}~@{text "var cvar tvar"}\\[1mm]
       
  2610   \isacommand{nominal\_datatype}~@{text "tkind ="}~@{text "KStar"}~$|$~@{text "KFun tkind tkind"}\\ 
       
  2611   \isacommand{and}~@{text "ckind ="}~@{text "CKSim ty ty"}\\
       
  2612   \isacommand{and}~@{text "ty ="}~@{text "TVar tvar"}~$|$~@{text "T string"}~$|$~@{text "TApp ty ty"}\\
       
  2613   $|$~@{text "TFun string ty_list"}~%
       
  2614   $|$~@{text "TAll tv::tvar tkind ty::ty"}\hspace{3mm}\isacommand{binds}~@{text "tv"}~\isacommand{in}~@{text ty}\\
       
  2615   $|$~@{text "TArr ckind ty"}\\
       
  2616   \isacommand{and}~@{text "ty_lst ="}~@{text "TNil"}~$|$~@{text "TCons ty ty_lst"}\\
       
  2617   \isacommand{and}~@{text "cty ="}~@{text "CVar cvar"}~%
       
  2618   $|$~@{text "C string"}~$|$~@{text "CApp cty cty"}~$|$~@{text "CFun string co_lst"}\\
       
  2619   $|$~@{text "CAll cv::cvar ckind cty::cty"}\hspace{3mm}\isacommand{binds}~@{text "cv"}~\isacommand{in}~@{text cty}\\
       
  2620   $|$~@{text "CArr ckind cty"}~$|$~@{text "CRefl ty"}~$|$~@{text "CSym cty"}~$|$~@{text "CCirc cty cty"}\\
       
  2621   $|$~@{text "CAt cty ty"}~$|$~@{text "CLeft cty"}~$|$~@{text "CRight cty"}~$|$~@{text "CSim cty cty"}\\
       
  2622   $|$~@{text "CRightc cty"}~$|$~@{text "CLeftc cty"}~$|$~@{text "Coerce cty cty"}\\
       
  2623   \isacommand{and}~@{text "co_lst ="}~@{text "CNil"}~$|$~@{text "CCons cty co_lst"}\\
       
  2624   \isacommand{and}~@{text "trm ="}~@{text "Var var"}~$|$~@{text "K string"}\\
       
  2625   $|$~@{text "LAM_ty tv::tvar tkind t::trm"}\hspace{3mm}\isacommand{binds}~@{text "tv"}~\isacommand{in}~@{text t}\\
       
  2626   $|$~@{text "LAM_cty cv::cvar ckind t::trm"}\hspace{3mm}\isacommand{binds}~@{text "cv"}~\isacommand{in}~@{text t}\\
       
  2627   $|$~@{text "App_ty trm ty"}~$|$~@{text "App_cty trm cty"}~$|$~@{text "App trm trm"}\\
       
  2628   $|$~@{text "Lam v::var ty t::trm"}\hspace{3mm}\isacommand{binds}~@{text "v"}~\isacommand{in}~@{text t}\\
       
  2629   $|$~@{text "Let x::var ty trm t::trm"}\hspace{3mm}\isacommand{binds}~@{text x}~\isacommand{in}~@{text t}\\
       
  2630   $|$~@{text "Case trm assoc_lst"}~$|$~@{text "Cast trm co"}\\
       
  2631   \isacommand{and}~@{text "assoc_lst ="}~@{text ANil}~%
       
  2632   $|$~@{text "ACons p::pat t::trm assoc_lst"}\hspace{3mm}\isacommand{binds}~@{text "bv p"}~\isacommand{in}~@{text t}\\
       
  2633   \isacommand{and}~@{text "pat ="}~@{text "Kpat string tvtk_lst tvck_lst vt_lst"}\\
       
  2634   \isacommand{and}~@{text "vt_lst ="}~@{text VTNil}~$|$~@{text "VTCons var ty vt_lst"}\\
       
  2635   \isacommand{and}~@{text "tvtk_lst ="}~@{text TVTKNil}~$|$~@{text "TVTKCons tvar tkind tvtk_lst"}\\
       
  2636   \isacommand{and}~@{text "tvck_lst ="}~@{text TVCKNil}~$|$ @{text "TVCKCons cvar ckind tvck_lst"}\\
       
  2637   \isacommand{binder}\\
       
  2638   \;@{text "bv :: pat \<Rightarrow> atom list"}~\isacommand{and}\\
       
  2639   \;@{text "bv\<^isub>1 :: vt_lst \<Rightarrow> atom list"}~\isacommand{and}\\
       
  2640   \;@{text "bv\<^isub>2 :: tvtk_lst \<Rightarrow> atom list"}~\isacommand{and}\\
       
  2641   \;@{text "bv\<^isub>3 :: tvck_lst \<Rightarrow> atom list"}\\
       
  2642   \isacommand{where}\\
       
  2643   \phantom{$|$}~@{text "bv (K s tvts tvcs vs) = (bv\<^isub>3 tvts) @ (bv\<^isub>2 tvcs) @ (bv\<^isub>1 vs)"}\\
       
  2644   $|$~@{text "bv\<^isub>1 VTNil = []"}\\
       
  2645   $|$~@{text "bv\<^isub>1 (VTCons x ty tl) = (atom x)::(bv\<^isub>1 tl)"}\\
       
  2646   $|$~@{text "bv\<^isub>2 TVTKNil = []"}\\
       
  2647   $|$~@{text "bv\<^isub>2 (TVTKCons a ty tl) = (atom a)::(bv\<^isub>2 tl)"}\\
       
  2648   $|$~@{text "bv\<^isub>3 TVCKNil = []"}\\
       
  2649   $|$~@{text "bv\<^isub>3 (TVCKCons c cty tl) = (atom c)::(bv\<^isub>3 tl)"}\\
       
  2650   \end{tabular}
       
  2651   \end{boxedminipage}
       
  2652   \caption{A definition for Core-Haskell in Nominal Isabelle. For the moment we
       
  2653   do not support nested types; therefore we explicitly have to unfold the 
       
  2654   lists @{text "co_lst"}, @{text "assoc_lst"} and so on. Apart from that limitation, the 
       
  2655   definition follows closely the original shown in Figure~\ref{corehas}. The
       
  2656   point of our work is that having made such a definition in Nominal Isabelle,
       
  2657   one obtains automatically a reasoning infrastructure for Core-Haskell.
       
  2658   \label{nominalcorehas}}
       
  2659   \end{figure}
       
  2660   \afterpage{\clearpage}
       
  2661 
       
  2662   Pottier presents a programming language, called C$\alpha$ml, for
       
  2663   representing terms with general binders inside OCaml \cite{Pottier06}. This
       
  2664   language is implemented as a front-end that can be translated to OCaml with
       
  2665   the help of a library. He presents a type-system in which the scope of
       
  2666   general binders can be specified using special markers, written @{text
       
  2667   "inner"} and @{text "outer"}. It seems our and his specifications can be
       
  2668   inter-translated as long as ours use the binding mode \isacommand{binds}
       
  2669   only.  However, we have not proved this. Pottier gives a definition for
       
  2670   alpha-equivalence, which also uses a permutation operation (like ours).
       
  2671   Still, this definition is rather different from ours and he only proves that
       
  2672   it defines an equivalence relation. A complete reasoning infrastructure is
       
  2673   well beyond the purposes of his language. Similar work for Haskell with
       
  2674   similar results was reported by Cheney \cite{Cheney05a} and more recently 
       
  2675   by Weirich et al \cite{WeirichYorgeySheard11}.
       
  2676 
       
  2677   In a slightly different domain (programming with dependent types),
       
  2678   Altenkirch et al \cite{Altenkirch10} present a calculus with a notion of
       
  2679   alpha-equivalence related to our binding mode \isacommand{binds (set+)}.
       
  2680   Their definition is similar to the one by Pottier, except that it has a more
       
  2681   operational flavour and calculates a partial (renaming) map. In this way,
       
  2682   the definition can deal with vacuous binders. However, to our best
       
  2683   knowledge, no concrete mathematical result concerning this definition of
       
  2684   alpha-equivalence has been proved.
       
  2685 *}
       
  2686 
       
  2687 section {* Conclusion *}
       
  2688 
       
  2689 text {*
       
  2690 
       
  2691   We have presented an extension of Nominal Isabelle for dealing with general
       
  2692   binders, that is where term-constructors have multiple bound atoms. For this
       
  2693   extension we introduced new definitions of alpha-equivalence and automated
       
  2694   all necessary proofs in Isabelle/HOL.  To specify general binders we used
       
  2695   the syntax from Ott, but extended it in some places and restricted
       
  2696   it in others so that the definitions make sense in the context of alpha-equated
       
  2697   terms. We also introduced two binding modes (set and set+) that do not exist
       
  2698   in Ott. We have tried out the extension with calculi such as Core-Haskell,
       
  2699   type-schemes and approximately a dozen of other typical examples from
       
  2700   programming language research~\cite{SewellBestiary}. The code will
       
  2701   eventually become part of the Isabelle distribution.\footnote{It 
       
  2702   can be downloaded already from \href{http://isabelle.in.tum.de/nominal/download}
       
  2703   {http://isabelle.in.tum.de/nominal/download}.}
       
  2704 
       
  2705   We have left out a discussion about how functions can be defined over
       
  2706   alpha-equated terms involving general binders. In earlier versions of
       
  2707   Nominal Isabelle this turned out to be a thorny issue.  We hope to do better
       
  2708   this time by using the function package \cite{Krauss09} that has recently
       
  2709   been implemented in Isabelle/HOL and also by restricting function
       
  2710   definitions to equivariant functions (for them we can provide more
       
  2711   automation).
       
  2712 
       
  2713   There are some restrictions we had
       
  2714   to impose in this paper that can be lifted using 
       
  2715   a recent reimplementation \cite{Traytel12} of the datatype package for Isabelle/HOL, which
       
  2716   however is not yet part of the stable distribution.
       
  2717   This reimplementation allows nested
       
  2718   datatype definitions and would allow one to specify, for instance, the function kinds
       
  2719   in Core-Haskell as @{text "TFun string (ty list)"} instead of the unfolded
       
  2720   version @{text "TFun string ty_list"} (see Figure~\ref{nominalcorehas}). We can 
       
  2721   also use it to represent the @{text "Let"}-terms from the Introduction where
       
  2722   the order of @{text "let"}-assignments does not matter. This means we can represent @{text "Let"}s
       
  2723   such that the following two terms are equal
       
  2724 
       
  2725   \[
       
  2726   @{text "Let x\<^isub>1 = t\<^isub>1 and x\<^isub>2 = t\<^isub>2 in s"} \;\;=\;\;
       
  2727   @{text "Let x\<^isub>2 = t\<^isub>2 and x\<^isub>1 = t\<^isub>1 in s"} 
       
  2728   \]\smallskip
       
  2729 
       
  2730   \noindent
       
  2731   For this we have to represent the @{text "Let"}-assignments as finite sets
       
  2732   of pair and a binding function that picks out the left components to be bound in @{text s}.
       
  2733 
       
  2734   One line of future investigation is whether we can go beyond the 
       
  2735   simple-minded form of binding functions that we adopted from Ott. At the moment, binding
       
  2736   functions can only return the empty set, a singleton atom set or unions
       
  2737   of atom sets (similarly for lists). It remains to be seen whether 
       
  2738   properties like
       
  2739   
       
  2740   \[
       
  2741   \mbox{@{text "fa_ty x  =  bn x \<union> fa_bn x"}}
       
  2742   \]\smallskip
       
  2743   
       
  2744   \noindent
       
  2745   allow us to support more interesting binding functions. 
       
  2746   
       
  2747   We have also not yet played with other binding modes. For example we can
       
  2748   imagine that there is need for a binding mode where instead of usual lists,
       
  2749   we abstract lists of distinct elements (the corresponding type @{text
       
  2750   "dlist"} already exists in the library of Isabelle/HOL). We expect the
       
  2751   presented work can be extended to accommodate such binding modes.\medskip
       
  2752   
       
  2753   \noindent
       
  2754   {\bf Acknowledgements:} We are very grateful to Andrew Pitts for many
       
  2755   discussions about Nominal Isabelle. We thank Peter Sewell for making the
       
  2756   informal notes \cite{SewellBestiary} available to us and also for patiently
       
  2757   explaining some of the finer points of the Ott-tool.  Stephanie Weirich
       
  2758   suggested to separate the subgrammars of kinds and types in our Core-Haskell
       
  2759   example. Ramana Kumar and Andrei Popescu helped us with comments for
       
  2760   an earlier version of this paper.
       
  2761 *}
       
  2762 
       
  2763 
       
  2764 (*<*)
       
  2765 end
       
  2766 (*>*)