doc-src/Logics/HOL.tex
author paulson
Thu, 03 Jul 1997 17:17:45 +0200
changeset 3489 afa802078173
parent 3487 62a6a08471e4
child 3881 73be08b4da3f
permissions -rw-r--r--
Added documentation for recdef, and tidied some other material
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
     1
%% $Id$
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
     2
\chapter{Higher-Order Logic}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
     3
\index{higher-order logic|(}
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
     4
\index{HOL system@{\sc hol} system}
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
     5
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
     6
The theory~\thydx{HOL} implements higher-order logic.  It is based on
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
     7
Gordon's~{\sc hol} system~\cite{mgordon-hol}, which itself is based on
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
     8
Church's original paper~\cite{church40}.  Andrews's
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
     9
book~\cite{andrews86} is a full description of the original
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
    10
Church-style higher-order logic.  Experience with the {\sc hol} system
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
    11
has demonstrated that higher-order logic is widely applicable in many
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
    12
areas of mathematics and computer science, not just hardware
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
    13
verification, {\sc hol}'s original \textit{raison d'\^etre\/}.  It is
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
    14
weaker than {\ZF} set theory but for most applications this does not
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
    15
matter.  If you prefer {\ML} to Lisp, you will probably prefer \HOL\ 
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
    16
to~{\ZF}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    17
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
    18
The syntax of \HOL\footnote{Earlier versions of Isabelle's \HOL\ used a
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
    19
different syntax.  Ancient releases of Isabelle included still another version
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
    20
of~\HOL, with explicit type inference rules~\cite{paulson-COLOG}.  This
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
    21
version no longer exists, but \thydx{ZF} supports a similar style of
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
    22
reasoning.} follows $\lambda$-calculus and functional programming.  Function
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
    23
application is curried.  To apply the function~$f$ of type
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
    24
$\tau@1\To\tau@2\To\tau@3$ to the arguments~$a$ and~$b$ in \HOL, you simply
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
    25
write $f\,a\,b$.  There is no `apply' operator as in \thydx{ZF}.  Note that
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
    26
$f(a,b)$ means ``$f$ applied to the pair $(a,b)$'' in \HOL.  We write ordered
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
    27
pairs as $(a,b)$, not $\langle a,b\rangle$ as in {\ZF}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    28
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
    29
\HOL\ has a distinct feel, compared with {\ZF} and {\CTT}.  It
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    30
identifies object-level types with meta-level types, taking advantage of
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    31
Isabelle's built-in type checker.  It identifies object-level functions
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    32
with meta-level functions, so it uses Isabelle's operations for abstraction
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
    33
and application.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    34
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
    35
These identifications allow Isabelle to support \HOL\ particularly
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
    36
nicely, but they also mean that \HOL\ requires more sophistication
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
    37
from the user --- in particular, an understanding of Isabelle's type
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
    38
system.  Beginners should work with \texttt{show_types} (or even
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
    39
\texttt{show_sorts}) set to \texttt{true}.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
    40
%  Gain experience by
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
    41
%working in first-order logic before attempting to use higher-order logic.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
    42
%This chapter assumes familiarity with~{\FOL{}}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    43
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    44
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
    45
\begin{figure}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
    46
\begin{constants}
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
    47
  \it name      &\it meta-type  & \it description \\
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    48
  \cdx{Trueprop}& $bool\To prop$                & coercion to $prop$\\
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
    49
  \cdx{Not}     & $bool\To bool$                & negation ($\neg$) \\
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    50
  \cdx{True}    & $bool$                        & tautology ($\top$) \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    51
  \cdx{False}   & $bool$                        & absurdity ($\bot$) \\
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
    52
  \cdx{If}      & $[bool,\alpha,\alpha]\To\alpha$ & conditional \\
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    53
  \cdx{Let}     & $[\alpha,\alpha\To\beta]\To\beta$ & let binder
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
    54
\end{constants}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    55
\subcaption{Constants}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    56
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
    57
\begin{constants}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    58
\index{"@@{\tt\at} symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    59
\index{*"! symbol}\index{*"? symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    60
\index{*"?"! symbol}\index{*"E"X"! symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    61
  \it symbol &\it name     &\it meta-type & \it description \\
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
    62
  \tt\at & \cdx{Eps}  & $(\alpha\To bool)\To\alpha$ & 
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
    63
        Hilbert description ($\varepsilon$) \\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
    64
  {\tt!~} or \sdx{ALL}  & \cdx{All}  & $(\alpha\To bool)\To bool$ & 
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    65
        universal quantifier ($\forall$) \\
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
    66
  {\tt?~} or \sdx{EX}   & \cdx{Ex}   & $(\alpha\To bool)\To bool$ & 
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    67
        existential quantifier ($\exists$) \\
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
    68
  {\tt?!} or \texttt{EX!}  & \cdx{Ex1}  & $(\alpha\To bool)\To bool$ & 
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
    69
        unique existence ($\exists!$)\\
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
    70
  \texttt{LEAST}  & \cdx{Least}  & $(\alpha::ord \To bool)\To\alpha$ & 
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
    71
        least element
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
    72
\end{constants}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    73
\subcaption{Binders} 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    74
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
    75
\begin{constants}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    76
\index{*"= symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    77
\index{&@{\tt\&} symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    78
\index{*"| symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    79
\index{*"-"-"> symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    80
  \it symbol    & \it meta-type & \it priority & \it description \\ 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    81
  \sdx{o}       & $[\beta\To\gamma,\alpha\To\beta]\To (\alpha\To\gamma)$ & 
1234
56ee5cc35510 updated "o" in HOL: (infixl 55)
nipkow
parents: 1163
diff changeset
    82
        Left 55 & composition ($\circ$) \\
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
    83
  \tt =         & $[\alpha,\alpha]\To bool$ & Left 50 & equality ($=$) \\
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    84
  \tt <         & $[\alpha::ord,\alpha]\To bool$ & Left 50 & less than ($<$) \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    85
  \tt <=        & $[\alpha::ord,\alpha]\To bool$ & Left 50 & 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    86
                less than or equals ($\leq$)\\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    87
  \tt \&        & $[bool,bool]\To bool$ & Right 35 & conjunction ($\conj$) \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    88
  \tt |         & $[bool,bool]\To bool$ & Right 30 & disjunction ($\disj$) \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    89
  \tt -->       & $[bool,bool]\To bool$ & Right 25 & implication ($\imp$)
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
    90
\end{constants}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    91
\subcaption{Infixes}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
    92
\caption{Syntax of \texttt{HOL}} \label{hol-constants}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    93
\end{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    94
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    95
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    96
\begin{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    97
\index{*let symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    98
\index{*in symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
    99
\dquotes
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   100
\[\begin{array}{rclcl}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   101
    term & = & \hbox{expression of class~$term$} \\
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   102
         & | & "\at~" id " . " formula \\
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   103
         & | & 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   104
    \multicolumn{3}{l}{"let"~id~"="~term";"\dots";"~id~"="~term~"in"~term} \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   105
         & | & 
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   106
    \multicolumn{3}{l}{"if"~formula~"then"~term~"else"~term} \\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   107
         & | & "LEAST"~ id " . " formula \\[2ex]
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   108
 formula & = & \hbox{expression of type~$bool$} \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   109
         & | & term " = " term \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   110
         & | & term " \ttilde= " term \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   111
         & | & term " < " term \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   112
         & | & term " <= " term \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   113
         & | & "\ttilde\ " formula \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   114
         & | & formula " \& " formula \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   115
         & | & formula " | " formula \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   116
         & | & formula " --> " formula \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   117
         & | & "!~~~" id~id^* " . " formula 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   118
         & | & "ALL~" id~id^* " . " formula \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   119
         & | & "?~~~" id~id^* " . " formula 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   120
         & | & "EX~~" id~id^* " . " formula \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   121
         & | & "?!~~" id~id^* " . " formula 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   122
         & | & "EX!~" id~id^* " . " formula
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   123
  \end{array}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   124
\]
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
   125
\caption{Full grammar for \HOL} \label{hol-grammar}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   126
\end{figure} 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   127
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   128
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   129
\section{Syntax}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   130
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
   131
Figure~\ref{hol-constants} lists the constants (including infixes and
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
   132
binders), while Fig.\ts\ref{hol-grammar} presents the grammar of
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   133
higher-order logic.  Note that $a$\verb|~=|$b$ is translated to
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   134
$\neg(a=b)$.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   135
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   136
\begin{warn}
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
   137
  \HOL\ has no if-and-only-if connective; logical equivalence is expressed
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   138
  using equality.  But equality has a high priority, as befitting a
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   139
  relation, while if-and-only-if typically has the lowest priority.  Thus,
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   140
  $\neg\neg P=P$ abbreviates $\neg\neg (P=P)$ and not $(\neg\neg P)=P$.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   141
  When using $=$ to mean logical equivalence, enclose both operands in
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   142
  parentheses.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   143
\end{warn}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   144
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   145
\subsection{Types and classes}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   146
The universal type class of higher-order terms is called~\cldx{term}.
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   147
By default, explicit type variables have class \cldx{term}.  In
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   148
particular the equality symbol and quantifiers are polymorphic over
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   149
class \texttt{term}.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   150
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   151
The type of formulae, \tydx{bool}, belongs to class \cldx{term}; thus,
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   152
formulae are terms.  The built-in type~\tydx{fun}, which constructs
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   153
function types, is overloaded with arity {\tt(term,\thinspace
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   154
  term)\thinspace term}.  Thus, $\sigma\To\tau$ belongs to class~{\tt
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   155
  term} if $\sigma$ and~$\tau$ do, allowing quantification over
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   156
functions.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   157
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   158
\HOL\ offers various methods for introducing new types.
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   159
See~\S\ref{sec:HOL:Types} and~\S\ref{sec:HOL:datatype}.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   160
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   161
Theory \thydx{Ord} defines the syntactic class \cldx{ord} of order
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   162
signatures; the relations $<$ and $\leq$ are polymorphic over this
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   163
class, as are the functions \cdx{mono}, \cdx{min} and \cdx{max}, and
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   164
the \cdx{LEAST} operator. \thydx{Ord} also defines a subclass
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   165
\cldx{order} of \cldx{ord} which axiomatizes partially ordered types
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   166
(w.r.t.\ $\le$).
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   167
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   168
Three other syntactic type classes --- \cldx{plus}, \cldx{minus} and
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   169
\cldx{times} --- permit overloading of the operators {\tt+},\index{*"+
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   170
  symbol} {\tt-}\index{*"- symbol} and {\tt*}.\index{*"* symbol} In
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   171
particular, {\tt-} is instantiated for set difference and subtraction
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   172
on natural numbers.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   173
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   174
If you state a goal containing overloaded functions, you may need to include
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   175
type constraints.  Type inference may otherwise make the goal more
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   176
polymorphic than you intended, with confusing results.  For example, the
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   177
variables $i$, $j$ and $k$ in the goal $i \le j \Imp i \le j+k$ have type
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   178
$\alpha::\{ord,plus\}$, although you may have expected them to have some
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   179
numeric type, e.g. $nat$.  Instead you should have stated the goal as
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   180
$(i::nat) \le j \Imp i \le j+k$, which causes all three variables to have
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   181
type $nat$.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   182
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   183
\begin{warn}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   184
  If resolution fails for no obvious reason, try setting
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   185
  \ttindex{show_types} to \texttt{true}, causing Isabelle to display
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   186
  types of terms.  Possibly set \ttindex{show_sorts} to \texttt{true} as
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   187
  well, causing Isabelle to display type classes and sorts.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   188
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   189
  \index{unification!incompleteness of}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   190
  Where function types are involved, Isabelle's unification code does not
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   191
  guarantee to find instantiations for type variables automatically.  Be
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   192
  prepared to use \ttindex{res_inst_tac} instead of \texttt{resolve_tac},
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   193
  possibly instantiating type variables.  Setting
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   194
  \ttindex{Unify.trace_types} to \texttt{true} causes Isabelle to report
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   195
  omitted search paths during unification.\index{tracing!of unification}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   196
\end{warn}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   197
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   198
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   199
\subsection{Binders}
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
   200
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
   201
Hilbert's {\bf description} operator~$\varepsilon x.P[x]$ stands for
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   202
some~$x$ satisfying~$P$, if such exists.  Since all terms in \HOL\ 
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   203
denote something, a description is always meaningful, but we do not
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   204
know its value unless $P$ defines it uniquely.  We may write
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   205
descriptions as \cdx{Eps}($\lambda x.P[x]$) or use the syntax
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   206
\hbox{\tt \at $x$.$P[x]$}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   207
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   208
Existential quantification is defined by
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   209
\[ \exists x.P~x \;\equiv\; P(\varepsilon x.P~x). \]
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   210
The unique existence quantifier, $\exists!x.P$, is defined in terms
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   211
of~$\exists$ and~$\forall$.  An Isabelle binder, it admits nested
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   212
quantifications.  For instance, $\exists!x\,y.P\,x\,y$ abbreviates
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
   213
$\exists!x. \exists!y.P\,x\,y$; note that this does not mean that there
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
   214
exists a unique pair $(x,y)$ satisfying~$P\,x\,y$.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   215
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
   216
\index{*"! symbol}\index{*"? symbol}\index{HOL system@{\sc hol} system}
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
   217
Quantifiers have two notations.  As in Gordon's {\sc hol} system, \HOL\
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   218
uses~{\tt!}\ and~{\tt?}\ to stand for $\forall$ and $\exists$.  The
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   219
existential quantifier must be followed by a space; thus {\tt?x} is an
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   220
unknown, while \verb'? x.f x=y' is a quantification.  Isabelle's usual
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   221
notation for quantifiers, \sdx{ALL} and \sdx{EX}, is also
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   222
available.  Both notations are accepted for input.  The {\ML} reference
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   223
\ttindexbold{HOL_quantifiers} governs the output notation.  If set to {\tt
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   224
true}, then~{\tt!}\ and~{\tt?}\ are displayed; this is the default.  If set
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   225
to \texttt{false}, then~{\tt ALL} and~{\tt EX} are displayed.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   226
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   227
If $\tau$ is a type of class \cldx{ord}, $P$ a formula and $x$ a
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   228
variable of type $\tau$, then the term \cdx{LEAST}~$x.P[x]$ is defined
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   229
to be the least (w.r.t.\ $\le$) $x$ such that $P~x$ holds (see
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   230
Fig.~\ref{hol-defs}).  The definition uses Hilbert's $\varepsilon$
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
   231
choice operator, so \texttt{Least} is always meaningful, but may yield
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
   232
nothing useful in case there is not a unique least element satisfying
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
   233
$P$.\footnote{Class $ord$ does not require much of its instances, so
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
   234
  $\le$ need not be a well-ordering, not even an order at all!}
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   235
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   236
\medskip All these binders have priority 10.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   237
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   238
\begin{warn}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   239
The low priority of binders means that they need to be enclosed in
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   240
parenthesis when they occur in the context of other operations.  For example,
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   241
instead of $P \land \forall x.Q$ you need to write $P \land (\forall x.Q)$.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   242
\end{warn}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   243
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   244
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   245
\subsection{The \sdx{let} and \sdx{case} constructions}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   246
Local abbreviations can be introduced by a \texttt{let} construct whose
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
   247
syntax appears in Fig.\ts\ref{hol-grammar}.  Internally it is translated into
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   248
the constant~\cdx{Let}.  It can be expanded by rewriting with its
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   249
definition, \tdx{Let_def}.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   250
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
   251
\HOL\ also defines the basic syntax
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   252
\[\dquotes"case"~e~"of"~c@1~"=>"~e@1~"|" \dots "|"~c@n~"=>"~e@n\] 
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   253
as a uniform means of expressing \texttt{case} constructs.  Therefore \texttt{case}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   254
and \sdx{of} are reserved words.  Initially, this is mere syntax and has no
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   255
logical meaning.  By declaring translations, you can cause instances of the
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   256
{\tt case} construct to denote applications of particular case operators.
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   257
This is what happens automatically for each \texttt{datatype} definition
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   258
(see~\S\ref{sec:HOL:datatype}).
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   259
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   260
\begin{warn}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   261
Both \texttt{if} and \texttt{case} constructs have as low a priority as
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   262
quantifiers, which requires additional enclosing parentheses in the context
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   263
of most other operations.  For example, instead of $f~x = if \dots then \dots
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   264
else \dots$ you need to write $f~x = (if \dots then \dots else
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   265
\dots)$.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   266
\end{warn}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   267
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   268
\section{Rules of inference}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   269
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   270
\begin{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   271
\begin{ttbox}\makeatother
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   272
\tdx{refl}           t = (t::'a)
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   273
\tdx{subst}          [| s = t; P s |] ==> P (t::'a)
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   274
\tdx{ext}            (!!x::'a. (f x :: 'b) = g x) ==> (\%x.f x) = (\%x.g x)
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   275
\tdx{impI}           (P ==> Q) ==> P-->Q
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   276
\tdx{mp}             [| P-->Q;  P |] ==> Q
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   277
\tdx{iff}            (P-->Q) --> (Q-->P) --> (P=Q)
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   278
\tdx{selectI}        P(x::'a) ==> P(@x.P x)
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   279
\tdx{True_or_False}  (P=True) | (P=False)
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   280
\end{ttbox}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   281
\caption{The \texttt{HOL} rules} \label{hol-rules}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   282
\end{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   283
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
   284
Figure~\ref{hol-rules} shows the primitive inference rules of~\HOL{},
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
   285
with their~{\ML} names.  Some of the rules deserve additional
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
   286
comments:
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   287
\begin{ttdescription}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   288
\item[\tdx{ext}] expresses extensionality of functions.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   289
\item[\tdx{iff}] asserts that logically equivalent formulae are
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   290
  equal.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   291
\item[\tdx{selectI}] gives the defining property of the Hilbert
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   292
  $\varepsilon$-operator.  It is a form of the Axiom of Choice.  The derived rule
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   293
  \tdx{select_equality} (see below) is often easier to use.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   294
\item[\tdx{True_or_False}] makes the logic classical.\footnote{In
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   295
    fact, the $\varepsilon$-operator already makes the logic classical, as
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   296
    shown by Diaconescu; see Paulson~\cite{paulson-COLOG} for details.}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   297
\end{ttdescription}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   298
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   299
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   300
\begin{figure}\hfuzz=4pt%suppress "Overfull \hbox" message
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   301
\begin{ttbox}\makeatother
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   302
\tdx{True_def}   True     == ((\%x::bool.x)=(\%x.x))
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   303
\tdx{All_def}    All      == (\%P. P = (\%x.True))
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   304
\tdx{Ex_def}     Ex       == (\%P. P(@x.P x))
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   305
\tdx{False_def}  False    == (!P.P)
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   306
\tdx{not_def}    not      == (\%P. P-->False)
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   307
\tdx{and_def}    op &     == (\%P Q. !R. (P-->Q-->R) --> R)
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   308
\tdx{or_def}     op |     == (\%P Q. !R. (P-->R) --> (Q-->R) --> R)
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   309
\tdx{Ex1_def}    Ex1      == (\%P. ? x. P x & (! y. P y --> y=x))
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   310
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   311
\tdx{o_def}      op o     == (\%(f::'b=>'c) g x::'a. f(g x))
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   312
\tdx{if_def}     If P x y ==
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   313
              (\%P x y. @z::'a.(P=True --> z=x) & (P=False --> z=y))
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   314
\tdx{Let_def}    Let s f  == f s
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   315
\tdx{Least_def}  Least P  == @x. P(x) & (ALL y. P(y) --> x <= y)"
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   316
\end{ttbox}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   317
\caption{The \texttt{HOL} definitions} \label{hol-defs}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   318
\end{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   319
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   320
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
   321
\HOL{} follows standard practice in higher-order logic: only a few
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   322
connectives are taken as primitive, with the remainder defined obscurely
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
   323
(Fig.\ts\ref{hol-defs}).  Gordon's {\sc hol} system expresses the
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   324
corresponding definitions \cite[page~270]{mgordon-hol} using
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   325
object-equality~({\tt=}), which is possible because equality in
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   326
higher-order logic may equate formulae and even functions over formulae.
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
   327
But theory~\HOL{}, like all other Isabelle theories, uses
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   328
meta-equality~({\tt==}) for definitions.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   329
\begin{warn}
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
   330
The definitions above should never be expanded and are shown for completeness
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   331
only.  Instead users should reason in terms of the derived rules shown below
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   332
or, better still, using high-level tactics
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   333
(see~\S\ref{sec:HOL:generic-packages}).
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   334
\end{warn}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   335
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   336
Some of the rules mention type variables; for example, \texttt{refl}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   337
mentions the type variable~{\tt'a}.  This allows you to instantiate
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   338
type variables explicitly by calling \texttt{res_inst_tac}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   339
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   340
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   341
\begin{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   342
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   343
\tdx{sym}         s=t ==> t=s
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   344
\tdx{trans}       [| r=s; s=t |] ==> r=t
1489
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   345
\tdx{ssubst}      [| t=s; P s |] ==> P t
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   346
\tdx{box_equals}  [| a=b;  a=c;  b=d |] ==> c=d  
1489
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   347
\tdx{arg_cong}    x = y ==> f x = f y
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   348
\tdx{fun_cong}    f = g ==> f x = g x
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   349
\tdx{cong}        [| f = g; x = y |] ==> f x = g y
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   350
\tdx{not_sym}     t ~= s ==> s ~= t
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   351
\subcaption{Equality}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   352
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   353
\tdx{TrueI}       True 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   354
\tdx{FalseE}      False ==> P
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   355
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   356
\tdx{conjI}       [| P; Q |] ==> P&Q
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   357
\tdx{conjunct1}   [| P&Q |] ==> P
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   358
\tdx{conjunct2}   [| P&Q |] ==> Q 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   359
\tdx{conjE}       [| P&Q;  [| P; Q |] ==> R |] ==> R
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   360
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   361
\tdx{disjI1}      P ==> P|Q
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   362
\tdx{disjI2}      Q ==> P|Q
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   363
\tdx{disjE}       [| P | Q; P ==> R; Q ==> R |] ==> R
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   364
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   365
\tdx{notI}        (P ==> False) ==> ~ P
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   366
\tdx{notE}        [| ~ P;  P |] ==> R
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   367
\tdx{impE}        [| P-->Q;  P;  Q ==> R |] ==> R
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   368
\subcaption{Propositional logic}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   369
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   370
\tdx{iffI}        [| P ==> Q;  Q ==> P |] ==> P=Q
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   371
\tdx{iffD1}       [| P=Q; P |] ==> Q
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   372
\tdx{iffD2}       [| P=Q; Q |] ==> P
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   373
\tdx{iffE}        [| P=Q; [| P --> Q; Q --> P |] ==> R |] ==> R
1489
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   374
%
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   375
%\tdx{eqTrueI}     P ==> P=True 
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   376
%\tdx{eqTrueE}     P=True ==> P 
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   377
\subcaption{Logical equivalence}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   378
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   379
\end{ttbox}
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
   380
\caption{Derived rules for \HOL} \label{hol-lemmas1}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   381
\end{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   382
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   383
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   384
\begin{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   385
\begin{ttbox}\makeatother
1489
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   386
\tdx{allI}      (!!x. P x) ==> !x. P x
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   387
\tdx{spec}      !x.P x ==> P x
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   388
\tdx{allE}      [| !x.P x;  P x ==> R |] ==> R
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   389
\tdx{all_dupE}  [| !x.P x;  [| P x; !x.P x |] ==> R |] ==> R
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   390
1489
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   391
\tdx{exI}       P x ==> ? x. P x
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   392
\tdx{exE}       [| ? x. P x; !!x. P x ==> Q |] ==> Q
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   393
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   394
\tdx{ex1I}      [| P a;  !!x. P x ==> x=a |] ==> ?! x. P x
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   395
\tdx{ex1E}      [| ?! x.P x;  !!x. [| P x;  ! y. P y --> y=x |] ==> R 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   396
          |] ==> R
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   397
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   398
\tdx{select_equality} [| P a;  !!x. P x ==> x=a |] ==> (@x.P x) = a
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   399
\subcaption{Quantifiers and descriptions}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   400
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   401
\tdx{ccontr}          (~P ==> False) ==> P
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   402
\tdx{classical}       (~P ==> P) ==> P
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   403
\tdx{excluded_middle} ~P | P
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   404
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   405
\tdx{disjCI}          (~Q ==> P) ==> P|Q
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   406
\tdx{exCI}            (! x. ~ P x ==> P a) ==> ? x.P x
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   407
\tdx{impCE}           [| P-->Q; ~ P ==> R; Q ==> R |] ==> R
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   408
\tdx{iffCE}           [| P=Q;  [| P;Q |] ==> R;  [| ~P; ~Q |] ==> R |] ==> R
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   409
\tdx{notnotD}         ~~P ==> P
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   410
\tdx{swap}            ~P ==> (~Q ==> P) ==> Q
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   411
\subcaption{Classical logic}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   412
1489
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   413
%\tdx{if_True}         (if True then x else y) = x
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   414
%\tdx{if_False}        (if False then x else y) = y
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
   415
\tdx{if_P}            P ==> (if P then x else y) = x
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
   416
\tdx{if_not_P}        ~ P ==> (if P then x else y) = y
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   417
\tdx{expand_if}       P(if Q then x else y) = ((Q --> P x) & (~Q --> P y))
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   418
\subcaption{Conditionals}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   419
\end{ttbox}
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
   420
\caption{More derived rules} \label{hol-lemmas2}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   421
\end{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   422
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
   423
Some derived rules are shown in Figures~\ref{hol-lemmas1}
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
   424
and~\ref{hol-lemmas2}, with their {\ML} names.  These include natural rules
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   425
for the logical connectives, as well as sequent-style elimination rules for
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   426
conjunctions, implications, and universal quantifiers.  
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   427
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   428
Note the equality rules: \tdx{ssubst} performs substitution in
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   429
backward proofs, while \tdx{box_equals} supports reasoning by
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   430
simplifying both sides of an equation.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   431
1489
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   432
The following simple tactics are occasionally useful:
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   433
\begin{ttdescription}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   434
\item[\ttindexbold{strip_tac} $i$] applies \texttt{allI} and \texttt{impI}
1489
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   435
  repeatedly to remove all outermost universal quantifiers and implications
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   436
  from subgoal $i$.
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   437
\item[\ttindexbold{case_tac} {\tt"}$P${\tt"} $i$] performs case distinction
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   438
  on $P$ for subgoal $i$: the latter is replaced by two identical subgoals
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   439
  with the added assumptions $P$ and $\neg P$, respectively.
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   440
\end{ttdescription}
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   441
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   442
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   443
\begin{figure} 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   444
\begin{center}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   445
\begin{tabular}{rrr}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   446
  \it name      &\it meta-type  & \it description \\ 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   447
\index{{}@\verb'{}' symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   448
  \verb|{}|     & $\alpha\,set$         & the empty set \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   449
  \cdx{insert}  & $[\alpha,\alpha\,set]\To \alpha\,set$
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   450
        & insertion of element \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   451
  \cdx{Collect} & $(\alpha\To bool)\To\alpha\,set$
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   452
        & comprehension \\
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
   453
  \cdx{Compl}   & $\alpha\,set\To\alpha\,set$
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   454
        & complement \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   455
  \cdx{INTER} & $[\alpha\,set,\alpha\To\beta\,set]\To\beta\,set$
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   456
        & intersection over a set\\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   457
  \cdx{UNION} & $[\alpha\,set,\alpha\To\beta\,set]\To\beta\,set$
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   458
        & union over a set\\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   459
  \cdx{Inter} & $(\alpha\,set)set\To\alpha\,set$
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   460
        &set of sets intersection \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   461
  \cdx{Union} & $(\alpha\,set)set\To\alpha\,set$
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   462
        &set of sets union \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   463
  \cdx{Pow}   & $\alpha\,set \To (\alpha\,set)set$
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   464
        & powerset \\[1ex]
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   465
  \cdx{range}   & $(\alpha\To\beta )\To\beta\,set$
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   466
        & range of a function \\[1ex]
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   467
  \cdx{Ball}~~\cdx{Bex} & $[\alpha\,set,\alpha\To bool]\To bool$
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   468
        & bounded quantifiers
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   469
\end{tabular}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   470
\end{center}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   471
\subcaption{Constants}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   472
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   473
\begin{center}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   474
\begin{tabular}{llrrr} 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   475
  \it symbol &\it name     &\it meta-type & \it priority & \it description \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   476
  \sdx{INT}  & \cdx{INTER1}  & $(\alpha\To\beta\,set)\To\beta\,set$ & 10 & 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   477
        intersection over a type\\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   478
  \sdx{UN}  & \cdx{UNION1}  & $(\alpha\To\beta\,set)\To\beta\,set$ & 10 & 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   479
        union over a type
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   480
\end{tabular}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   481
\end{center}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   482
\subcaption{Binders} 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   483
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   484
\begin{center}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   485
\index{*"`"` symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   486
\index{*": symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   487
\index{*"<"= symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   488
\begin{tabular}{rrrr} 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   489
  \it symbol    & \it meta-type & \it priority & \it description \\ 
3161
d2c6f15f38f4 minor tuning;
wenzelm
parents: 3160
diff changeset
   490
  \tt ``        & $[\alpha\To\beta ,\alpha\,set]\To  \beta\,set$
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   491
        & Left 90 & image \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   492
  \sdx{Int}     & $[\alpha\,set,\alpha\,set]\To\alpha\,set$
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   493
        & Left 70 & intersection ($\int$) \\
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   494
  \sdx{Un}      & $[\alpha\,set,\alpha\,set]\To\alpha\,set$
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   495
        & Left 65 & union ($\un$) \\
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   496
  \tt:          & $[\alpha ,\alpha\,set]\To bool$       
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   497
        & Left 50 & membership ($\in$) \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   498
  \tt <=        & $[\alpha\,set,\alpha\,set]\To bool$
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   499
        & Left 50 & subset ($\subseteq$) 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   500
\end{tabular}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   501
\end{center}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   502
\subcaption{Infixes}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   503
\caption{Syntax of the theory \texttt{Set}} \label{hol-set-syntax}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   504
\end{figure} 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   505
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   506
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   507
\begin{figure} 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   508
\begin{center} \tt\frenchspacing
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   509
\index{*"! symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   510
\begin{tabular}{rrr} 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   511
  \it external          & \it internal  & \it description \\ 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   512
  $a$ \ttilde: $b$      & \ttilde($a$ : $b$)    & \rm non-membership\\
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   513
  {\ttlbrace}$a@1$, $\ldots${\ttrbrace}  &  insert $a@1$ $\ldots$ {\ttlbrace}{\ttrbrace} & \rm finite set \\
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   514
  {\ttlbrace}$x$.$P[x]${\ttrbrace}        &  Collect($\lambda x.P[x]$) &
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   515
        \rm comprehension \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   516
  \sdx{INT} $x$:$A$.$B[x]$      & INTER $A$ $\lambda x.B[x]$ &
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   517
        \rm intersection \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   518
  \sdx{UN}{\tt\ }  $x$:$A$.$B[x]$      & UNION $A$ $\lambda x.B[x]$ &
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   519
        \rm union \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   520
  \tt ! $x$:$A$.$P[x]$ or \sdx{ALL} $x$:$A$.$P[x]$ & 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   521
        Ball $A$ $\lambda x.P[x]$ & 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   522
        \rm bounded $\forall$ \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   523
  \sdx{?} $x$:$A$.$P[x]$ or \sdx{EX}{\tt\ } $x$:$A$.$P[x]$ & 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   524
        Bex $A$ $\lambda x.P[x]$ & \rm bounded $\exists$
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   525
\end{tabular}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   526
\end{center}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   527
\subcaption{Translations}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   528
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   529
\dquotes
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   530
\[\begin{array}{rclcl}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   531
    term & = & \hbox{other terms\ldots} \\
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   532
         & | & "{\ttlbrace}{\ttrbrace}" \\
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   533
         & | & "{\ttlbrace} " term\; ("," term)^* " {\ttrbrace}" \\
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   534
         & | & "{\ttlbrace} " id " . " formula " {\ttrbrace}" \\
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   535
         & | & term " `` " term \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   536
         & | & term " Int " term \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   537
         & | & term " Un " term \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   538
         & | & "INT~~"  id ":" term " . " term \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   539
         & | & "UN~~~"  id ":" term " . " term \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   540
         & | & "INT~~"  id~id^* " . " term \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   541
         & | & "UN~~~"  id~id^* " . " term \\[2ex]
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   542
 formula & = & \hbox{other formulae\ldots} \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   543
         & | & term " : " term \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   544
         & | & term " \ttilde: " term \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   545
         & | & term " <= " term \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   546
         & | & "!~" id ":" term " . " formula 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   547
         & | & "ALL " id ":" term " . " formula \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   548
         & | & "?~" id ":" term " . " formula 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   549
         & | & "EX~~" id ":" term " . " formula
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   550
  \end{array}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   551
\]
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   552
\subcaption{Full Grammar}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   553
\caption{Syntax of the theory \texttt{Set} (continued)} \label{hol-set-syntax2}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   554
\end{figure} 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   555
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   556
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   557
\section{A formulation of set theory}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   558
Historically, higher-order logic gives a foundation for Russell and
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   559
Whitehead's theory of classes.  Let us use modern terminology and call them
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   560
{\bf sets}, but note that these sets are distinct from those of {\ZF} set
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   561
theory, and behave more like {\ZF} classes.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   562
\begin{itemize}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   563
\item
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   564
Sets are given by predicates over some type~$\sigma$.  Types serve to
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   565
define universes for sets, but type checking is still significant.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   566
\item
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   567
There is a universal set (for each type).  Thus, sets have complements, and
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   568
may be defined by absolute comprehension.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   569
\item
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   570
Although sets may contain other sets as elements, the containing set must
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   571
have a more complex type.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   572
\end{itemize}
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
   573
Finite unions and intersections have the same behaviour in \HOL\ as they
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
   574
do in~{\ZF}.  In \HOL\ the intersection of the empty set is well-defined,
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   575
denoting the universal set for the given type.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   576
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   577
\subsection{Syntax of set theory}\index{*set type}
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
   578
\HOL's set theory is called \thydx{Set}.  The type $\alpha\,set$ is
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   579
essentially the same as $\alpha\To bool$.  The new type is defined for
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   580
clarity and to avoid complications involving function types in unification.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   581
The isomorphisms between the two types are declared explicitly.  They are
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   582
very natural: \texttt{Collect} maps $\alpha\To bool$ to $\alpha\,set$, while
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   583
\hbox{\tt op :} maps in the other direction (ignoring argument order).
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   584
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
   585
Figure~\ref{hol-set-syntax} lists the constants, infixes, and syntax
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
   586
translations.  Figure~\ref{hol-set-syntax2} presents the grammar of the new
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   587
constructs.  Infix operators include union and intersection ($A\un B$
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   588
and $A\int B$), the subset and membership relations, and the image
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   589
operator~{\tt``}\@.  Note that $a$\verb|~:|$b$ is translated to
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   590
$\neg(a\in b)$.  
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   591
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   592
The $\{a@1,\ldots\}$ notation abbreviates finite sets constructed in
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   593
the obvious manner using~{\tt insert} and~$\{\}$:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   594
\begin{eqnarray*}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   595
  \{a, b, c\} & \equiv &
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   596
  \texttt{insert} \, a \, ({\tt insert} \, b \, ({\tt insert} \, c \, \{\}))
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   597
\end{eqnarray*}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   598
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   599
The set \hbox{\tt{\ttlbrace}$x$.$P[x]${\ttrbrace}} consists of all $x$ (of suitable type)
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   600
that satisfy~$P[x]$, where $P[x]$ is a formula that may contain free
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   601
occurrences of~$x$.  This syntax expands to \cdx{Collect}$(\lambda
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   602
x.P[x])$.  It defines sets by absolute comprehension, which is impossible
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   603
in~{\ZF}; the type of~$x$ implicitly restricts the comprehension.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   604
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   605
The set theory defines two {\bf bounded quantifiers}:
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   606
\begin{eqnarray*}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   607
   \forall x\in A.P[x] &\hbox{abbreviates}& \forall x. x\in A\imp P[x] \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   608
   \exists x\in A.P[x] &\hbox{abbreviates}& \exists x. x\in A\conj P[x]
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   609
\end{eqnarray*}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   610
The constants~\cdx{Ball} and~\cdx{Bex} are defined
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   611
accordingly.  Instead of \texttt{Ball $A$ $P$} and \texttt{Bex $A$ $P$} we may
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   612
write\index{*"! symbol}\index{*"? symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   613
\index{*ALL symbol}\index{*EX symbol} 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   614
%
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   615
\hbox{\tt !~$x$:$A$.$P[x]$} and \hbox{\tt ?~$x$:$A$.$P[x]$}.  Isabelle's
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   616
usual quantifier symbols, \sdx{ALL} and \sdx{EX}, are also accepted
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   617
for input.  As with the primitive quantifiers, the {\ML} reference
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   618
\ttindex{HOL_quantifiers} specifies which notation to use for output.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   619
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   620
Unions and intersections over sets, namely $\bigcup@{x\in A}B[x]$ and
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   621
$\bigcap@{x\in A}B[x]$, are written 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   622
\sdx{UN}~\hbox{\tt$x$:$A$.$B[x]$} and
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   623
\sdx{INT}~\hbox{\tt$x$:$A$.$B[x]$}.  
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   624
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   625
Unions and intersections over types, namely $\bigcup@x B[x]$ and $\bigcap@x
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   626
B[x]$, are written \sdx{UN}~\hbox{\tt$x$.$B[x]$} and
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   627
\sdx{INT}~\hbox{\tt$x$.$B[x]$}.  They are equivalent to the previous
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   628
union and intersection operators when $A$ is the universal set.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   629
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   630
The operators $\bigcup A$ and $\bigcap A$ act upon sets of sets.  They are
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   631
not binders, but are equal to $\bigcup@{x\in A}x$ and $\bigcap@{x\in A}x$,
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   632
respectively.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   633
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   634
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   635
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   636
\begin{figure} \underscoreon
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   637
\begin{ttbox}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   638
\tdx{mem_Collect_eq}    (a : {\ttlbrace}x.P x{\ttrbrace}) = P a
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   639
\tdx{Collect_mem_eq}    {\ttlbrace}x.x:A{\ttrbrace} = A
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   640
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   641
\tdx{empty_def}         {\ttlbrace}{\ttrbrace}          == {\ttlbrace}x.False{\ttrbrace}
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   642
\tdx{insert_def}        insert a B  == {\ttlbrace}x.x=a{\ttrbrace} Un B
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   643
\tdx{Ball_def}          Ball A P    == ! x. x:A --> P x
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   644
\tdx{Bex_def}           Bex A P     == ? x. x:A & P x
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   645
\tdx{subset_def}        A <= B      == ! x:A. x:B
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   646
\tdx{Un_def}            A Un B      == {\ttlbrace}x.x:A | x:B{\ttrbrace}
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   647
\tdx{Int_def}           A Int B     == {\ttlbrace}x.x:A & x:B{\ttrbrace}
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   648
\tdx{set_diff_def}      A - B       == {\ttlbrace}x.x:A & x~:B{\ttrbrace}
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   649
\tdx{Compl_def}         Compl A     == {\ttlbrace}x. ~ x:A{\ttrbrace}
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   650
\tdx{INTER_def}         INTER A B   == {\ttlbrace}y. ! x:A. y: B x{\ttrbrace}
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   651
\tdx{UNION_def}         UNION A B   == {\ttlbrace}y. ? x:A. y: B x{\ttrbrace}
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   652
\tdx{INTER1_def}        INTER1 B    == INTER {\ttlbrace}x.True{\ttrbrace} B 
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   653
\tdx{UNION1_def}        UNION1 B    == UNION {\ttlbrace}x.True{\ttrbrace} B 
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   654
\tdx{Inter_def}         Inter S     == (INT x:S. x)
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   655
\tdx{Union_def}         Union S     == (UN  x:S. x)
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   656
\tdx{Pow_def}           Pow A       == {\ttlbrace}B. B <= A{\ttrbrace}
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   657
\tdx{image_def}         f``A        == {\ttlbrace}y. ? x:A. y=f x{\ttrbrace}
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   658
\tdx{range_def}         range f     == {\ttlbrace}y. ? x. y=f x{\ttrbrace}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   659
\end{ttbox}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   660
\caption{Rules of the theory \texttt{Set}} \label{hol-set-rules}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   661
\end{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   662
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   663
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   664
\begin{figure} \underscoreon
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   665
\begin{ttbox}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   666
\tdx{CollectI}        [| P a |] ==> a : {\ttlbrace}x.P x{\ttrbrace}
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   667
\tdx{CollectD}        [| a : {\ttlbrace}x.P x{\ttrbrace} |] ==> P a
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   668
\tdx{CollectE}        [| a : {\ttlbrace}x.P x{\ttrbrace};  P a ==> W |] ==> W
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   669
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   670
\tdx{ballI}           [| !!x. x:A ==> P x |] ==> ! x:A. P x
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   671
\tdx{bspec}           [| ! x:A. P x;  x:A |] ==> P x
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   672
\tdx{ballE}           [| ! x:A. P x;  P x ==> Q;  ~ x:A ==> Q |] ==> Q
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   673
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   674
\tdx{bexI}            [| P x;  x:A |] ==> ? x:A. P x
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   675
\tdx{bexCI}           [| ! x:A. ~ P x ==> P a;  a:A |] ==> ? x:A.P x
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   676
\tdx{bexE}            [| ? x:A. P x;  !!x. [| x:A; P x |] ==> Q  |] ==> Q
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   677
\subcaption{Comprehension and Bounded quantifiers}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   678
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   679
\tdx{subsetI}         (!!x.x:A ==> x:B) ==> A <= B
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   680
\tdx{subsetD}         [| A <= B;  c:A |] ==> c:B
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   681
\tdx{subsetCE}        [| A <= B;  ~ (c:A) ==> P;  c:B ==> P |] ==> P
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   682
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   683
\tdx{subset_refl}     A <= A
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   684
\tdx{subset_trans}    [| A<=B;  B<=C |] ==> A<=C
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   685
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   686
\tdx{equalityI}       [| A <= B;  B <= A |] ==> A = B
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   687
\tdx{equalityD1}      A = B ==> A<=B
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   688
\tdx{equalityD2}      A = B ==> B<=A
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   689
\tdx{equalityE}       [| A = B;  [| A<=B; B<=A |] ==> P |]  ==>  P
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   690
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   691
\tdx{equalityCE}      [| A = B;  [| c:A; c:B |] ==> P;  
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   692
                           [| ~ c:A; ~ c:B |] ==> P 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   693
                |]  ==>  P
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   694
\subcaption{The subset and equality relations}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   695
\end{ttbox}
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
   696
\caption{Derived rules for set theory} \label{hol-set1}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   697
\end{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   698
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   699
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   700
\begin{figure} \underscoreon
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   701
\begin{ttbox}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   702
\tdx{emptyE}   a : {\ttlbrace}{\ttrbrace} ==> P
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   703
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   704
\tdx{insertI1} a : insert a B
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   705
\tdx{insertI2} a : B ==> a : insert b B
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   706
\tdx{insertE}  [| a : insert b A;  a=b ==> P;  a:A ==> P |] ==> P
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   707
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   708
\tdx{ComplI}   [| c:A ==> False |] ==> c : Compl A
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   709
\tdx{ComplD}   [| c : Compl A |] ==> ~ c:A
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   710
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   711
\tdx{UnI1}     c:A ==> c : A Un B
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   712
\tdx{UnI2}     c:B ==> c : A Un B
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   713
\tdx{UnCI}     (~c:B ==> c:A) ==> c : A Un B
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   714
\tdx{UnE}      [| c : A Un B;  c:A ==> P;  c:B ==> P |] ==> P
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   715
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   716
\tdx{IntI}     [| c:A;  c:B |] ==> c : A Int B
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   717
\tdx{IntD1}    c : A Int B ==> c:A
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   718
\tdx{IntD2}    c : A Int B ==> c:B
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   719
\tdx{IntE}     [| c : A Int B;  [| c:A; c:B |] ==> P |] ==> P
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   720
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   721
\tdx{UN_I}     [| a:A;  b: B a |] ==> b: (UN x:A. B x)
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   722
\tdx{UN_E}     [| b: (UN x:A. B x);  !!x.[| x:A;  b:B x |] ==> R |] ==> R
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   723
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   724
\tdx{INT_I}    (!!x. x:A ==> b: B x) ==> b : (INT x:A. B x)
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   725
\tdx{INT_D}    [| b: (INT x:A. B x);  a:A |] ==> b: B a
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   726
\tdx{INT_E}    [| b: (INT x:A. B x);  b: B a ==> R;  ~ a:A ==> R |] ==> R
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   727
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   728
\tdx{UnionI}   [| X:C;  A:X |] ==> A : Union C
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   729
\tdx{UnionE}   [| A : Union C;  !!X.[| A:X;  X:C |] ==> R |] ==> R
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   730
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   731
\tdx{InterI}   [| !!X. X:C ==> A:X |] ==> A : Inter C
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   732
\tdx{InterD}   [| A : Inter C;  X:C |] ==> A:X
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   733
\tdx{InterE}   [| A : Inter C;  A:X ==> R;  ~ X:C ==> R |] ==> R
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   734
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   735
\tdx{PowI}     A<=B ==> A: Pow B
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   736
\tdx{PowD}     A: Pow B ==> A<=B
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   737
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   738
\tdx{imageI}   [| x:A |] ==> f x : f``A
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   739
\tdx{imageE}   [| b : f``A;  !!x.[| b=f x;  x:A |] ==> P |] ==> P
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   740
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   741
\tdx{rangeI}   f x : range f
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   742
\tdx{rangeE}   [| b : range f;  !!x.[| b=f x |] ==> P |] ==> P
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   743
\end{ttbox}
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
   744
\caption{Further derived rules for set theory} \label{hol-set2}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   745
\end{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   746
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   747
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   748
\subsection{Axioms and rules of set theory}
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
   749
Figure~\ref{hol-set-rules} presents the rules of theory \thydx{Set}.  The
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   750
axioms \tdx{mem_Collect_eq} and \tdx{Collect_mem_eq} assert
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   751
that the functions \texttt{Collect} and \hbox{\tt op :} are isomorphisms.  Of
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   752
course, \hbox{\tt op :} also serves as the membership relation.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   753
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   754
All the other axioms are definitions.  They include the empty set, bounded
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   755
quantifiers, unions, intersections, complements and the subset relation.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   756
They also include straightforward constructions on functions: image~({\tt``})
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   757
and \texttt{range}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   758
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   759
%The predicate \cdx{inj_onto} is used for simulating type definitions.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   760
%The statement ${\tt inj_onto}~f~A$ asserts that $f$ is injective on the
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   761
%set~$A$, which specifies a subset of its domain type.  In a type
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   762
%definition, $f$ is the abstraction function and $A$ is the set of valid
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   763
%representations; we should not expect $f$ to be injective outside of~$A$.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   764
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   765
%\begin{figure} \underscoreon
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   766
%\begin{ttbox}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   767
%\tdx{Inv_f_f}    inj f ==> Inv f (f x) = x
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   768
%\tdx{f_Inv_f}    y : range f ==> f(Inv f y) = y
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   769
%
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   770
%\tdx{Inv_injective}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   771
%    [| Inv f x=Inv f y; x: range f;  y: range f |] ==> x=y
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   772
%
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   773
%
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   774
%\tdx{monoI}      [| !!A B. A <= B ==> f A <= f B |] ==> mono f
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   775
%\tdx{monoD}      [| mono f;  A <= B |] ==> f A <= f B
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   776
%
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   777
%\tdx{injI}       [| !! x y. f x = f y ==> x=y |] ==> inj f
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   778
%\tdx{inj_inverseI}              (!!x. g(f x) = x) ==> inj f
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   779
%\tdx{injD}       [| inj f; f x = f y |] ==> x=y
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   780
%
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   781
%\tdx{inj_ontoI}  (!!x y. [| f x=f y; x:A; y:A |] ==> x=y) ==> inj_onto f A
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   782
%\tdx{inj_ontoD}  [| inj_onto f A;  f x=f y;  x:A;  y:A |] ==> x=y
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   783
%
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   784
%\tdx{inj_onto_inverseI}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   785
%    (!!x. x:A ==> g(f x) = x) ==> inj_onto f A
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   786
%\tdx{inj_onto_contraD}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   787
%    [| inj_onto f A;  x~=y;  x:A;  y:A |] ==> ~ f x=f y
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   788
%\end{ttbox}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   789
%\caption{Derived rules involving functions} \label{hol-fun}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   790
%\end{figure}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   791
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   792
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   793
\begin{figure} \underscoreon
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   794
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   795
\tdx{Union_upper}     B:A ==> B <= Union A
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   796
\tdx{Union_least}     [| !!X. X:A ==> X<=C |] ==> Union A <= C
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   797
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   798
\tdx{Inter_lower}     B:A ==> Inter A <= B
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   799
\tdx{Inter_greatest}  [| !!X. X:A ==> C<=X |] ==> C <= Inter A
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   800
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   801
\tdx{Un_upper1}       A <= A Un B
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   802
\tdx{Un_upper2}       B <= A Un B
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   803
\tdx{Un_least}        [| A<=C;  B<=C |] ==> A Un B <= C
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   804
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   805
\tdx{Int_lower1}      A Int B <= A
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   806
\tdx{Int_lower2}      A Int B <= B
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   807
\tdx{Int_greatest}    [| C<=A;  C<=B |] ==> C <= A Int B
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   808
\end{ttbox}
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
   809
\caption{Derived rules involving subsets} \label{hol-subset}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   810
\end{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   811
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   812
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   813
\begin{figure} \underscoreon   \hfuzz=4pt%suppress "Overfull \hbox" message
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   814
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   815
\tdx{Int_absorb}        A Int A = A
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   816
\tdx{Int_commute}       A Int B = B Int A
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   817
\tdx{Int_assoc}         (A Int B) Int C  =  A Int (B Int C)
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   818
\tdx{Int_Un_distrib}    (A Un B)  Int C  =  (A Int C) Un (B Int C)
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   819
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   820
\tdx{Un_absorb}         A Un A = A
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   821
\tdx{Un_commute}        A Un B = B Un A
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   822
\tdx{Un_assoc}          (A Un B)  Un C  =  A Un (B Un C)
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   823
\tdx{Un_Int_distrib}    (A Int B) Un C  =  (A Un C) Int (B Un C)
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   824
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   825
\tdx{Compl_disjoint}    A Int (Compl A) = {\ttlbrace}x.False{\ttrbrace}
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   826
\tdx{Compl_partition}   A Un  (Compl A) = {\ttlbrace}x.True{\ttrbrace}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   827
\tdx{double_complement} Compl(Compl A) = A
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   828
\tdx{Compl_Un}          Compl(A Un B)  = (Compl A) Int (Compl B)
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   829
\tdx{Compl_Int}         Compl(A Int B) = (Compl A) Un (Compl B)
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   830
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   831
\tdx{Union_Un_distrib}  Union(A Un B) = (Union A) Un (Union B)
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   832
\tdx{Int_Union}         A Int (Union B) = (UN C:B. A Int C)
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   833
\tdx{Un_Union_image}    (UN x:C.(A x) Un (B x)) = Union(A``C) Un Union(B``C)
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   834
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   835
\tdx{Inter_Un_distrib}  Inter(A Un B) = (Inter A) Int (Inter B)
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   836
\tdx{Un_Inter}          A Un (Inter B) = (INT C:B. A Un C)
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   837
\tdx{Int_Inter_image}   (INT x:C.(A x) Int (B x)) = Inter(A``C) Int Inter(B``C)
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   838
\end{ttbox}
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
   839
\caption{Set equalities} \label{hol-equalities}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   840
\end{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   841
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   842
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
   843
Figures~\ref{hol-set1} and~\ref{hol-set2} present derived rules.  Most are
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   844
obvious and resemble rules of Isabelle's {\ZF} set theory.  Certain rules,
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   845
such as \tdx{subsetCE}, \tdx{bexCI} and \tdx{UnCI},
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   846
are designed for classical reasoning; the rules \tdx{subsetD},
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   847
\tdx{bexI}, \tdx{Un1} and~\tdx{Un2} are not
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   848
strictly necessary but yield more natural proofs.  Similarly,
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   849
\tdx{equalityCE} supports classical reasoning about extensionality,
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   850
after the fashion of \tdx{iffCE}.  See the file \texttt{HOL/Set.ML} for
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   851
proofs pertaining to set theory.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   852
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
   853
Figure~\ref{hol-subset} presents lattice properties of the subset relation.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   854
Unions form least upper bounds; non-empty intersections form greatest lower
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   855
bounds.  Reasoning directly about subsets often yields clearer proofs than
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   856
reasoning about the membership relation.  See the file \texttt{HOL/subset.ML}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   857
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
   858
Figure~\ref{hol-equalities} presents many common set equalities.  They
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   859
include commutative, associative and distributive laws involving unions,
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   860
intersections and complements.  For a complete listing see the file {\tt
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   861
HOL/equalities.ML}.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   862
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   863
\begin{warn}
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
   864
\texttt{Blast_tac} proves many set-theoretic theorems automatically.
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
   865
Hence you seldom need to refer to the theorems above.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   866
\end{warn}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   867
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   868
\begin{figure}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   869
\begin{center}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   870
\begin{tabular}{rrr}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   871
  \it name      &\it meta-type  & \it description \\ 
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   872
  \cdx{inj}~~\cdx{surj}& $(\alpha\To\beta )\To bool$
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   873
        & injective/surjective \\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   874
  \cdx{inj_onto}        & $[\alpha\To\beta ,\alpha\,set]\To bool$
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   875
        & injective over subset\\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   876
  \cdx{inv} & $(\alpha\To\beta)\To(\beta\To\alpha)$ & inverse function
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   877
\end{tabular}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   878
\end{center}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   879
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   880
\underscoreon
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   881
\begin{ttbox}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   882
\tdx{inj_def}           inj f        == ! x y. f x=f y --> x=y
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   883
\tdx{surj_def}          surj f       == ! y. ? x. y=f x
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   884
\tdx{inj_onto_def}      inj_onto f A == !x:A. !y:A. f x=f y --> x=y
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   885
\tdx{inv_def}           inv f        == (\%y. @x. f(x)=y)
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   886
\end{ttbox}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   887
\caption{Theory \thydx{Fun}} \label{fig:HOL:Fun}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   888
\end{figure}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   889
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   890
\subsection{Properties of functions}\nopagebreak
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   891
Figure~\ref{fig:HOL:Fun} presents a theory of simple properties of functions.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   892
Note that ${\tt inv}~f$ uses Hilbert's $\varepsilon$ to yield an inverse
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   893
of~$f$.  See the file \texttt{HOL/Fun.ML} for a complete listing of the derived
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   894
rules.  Reasoning about function composition (the operator~\sdx{o}) and the
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   895
predicate~\cdx{surj} is done simply by expanding the definitions.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   896
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   897
There is also a large collection of monotonicity theorems for constructions
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   898
on sets in the file \texttt{HOL/mono.ML}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   899
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   900
\section{Generic packages}
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   901
\label{sec:HOL:generic-packages}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   902
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
   903
\HOL\ instantiates most of Isabelle's generic packages, making available the
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
   904
simplifier and the classical reasoner.
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   905
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   906
\subsection{Simplification and substitution}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   907
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   908
The simplifier is available in \HOL.  Tactics such as {\tt
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   909
  Asm_simp_tac} and \texttt{Full_simp_tac} use the default simpset
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   910
({\tt!simpset}), which works for most purposes.  A quite minimal
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   911
simplification set for higher-order logic is~\ttindexbold{HOL_ss},
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   912
even more frugal is \ttindexbold{HOL_basic_ss}.  Equality~($=$), which
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   913
also expresses logical equivalence, may be used for rewriting.  See
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   914
the file \texttt{HOL/simpdata.ML} for a complete listing of the basic
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   915
simplification rules.
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   916
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   917
See \iflabelundefined{chap:classical}{the {\em Reference Manual\/}}%
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   918
{Chaps.\ts\ref{substitution} and~\ref{simp-chap}} for details of substitution
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   919
and simplification.
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   920
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
   921
\begin{warn}\index{simplification!of conjunctions}%
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
   922
  Reducing $a=b\conj P(a)$ to $a=b\conj P(b)$ is sometimes advantageous.  The
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
   923
  left part of a conjunction helps in simplifying the right part.  This effect
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
   924
  is not available by default: it can be slow.  It can be obtained by
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
   925
  including \ttindex{conj_cong} in a simpset, \verb$addcongs [conj_cong]$.
1234
56ee5cc35510 updated "o" in HOL: (infixl 55)
nipkow
parents: 1163
diff changeset
   926
\end{warn}
56ee5cc35510 updated "o" in HOL: (infixl 55)
nipkow
parents: 1163
diff changeset
   927
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   928
If the simplifier cannot use a certain rewrite rule --- either because
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   929
of nontermination or because its left-hand side is too flexible ---
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   930
then you might try \texttt{stac}:
1489
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   931
\begin{ttdescription}
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   932
\item[\ttindexbold{stac} $thm$ $i,$] where $thm$ is of the form $lhs = rhs$,
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   933
  replaces in subgoal $i$ instances of $lhs$ by corresponding instances of
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   934
  $rhs$.  In case of multiple instances of $lhs$ in subgoal $i$, backtracking
1489
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   935
  may be necessary to select the desired ones.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   936
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   937
If $thm$ is a conditional equality, the instantiated condition becomes an
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   938
additional (first) subgoal.
1489
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   939
\end{ttdescription}
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   940
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
   941
 \HOL{} provides the tactic \ttindex{hyp_subst_tac}, which substitutes
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
   942
  for an equality throughout a subgoal and its hypotheses.  This tactic uses
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
   943
  \HOL's general substitution rule.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   944
1489
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   945
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   946
\subsection{Classical reasoning}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   947
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
   948
\HOL\ derives classical introduction rules for $\disj$ and~$\exists$, as
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   949
well as classical elimination rules for~$\imp$ and~$\bimp$, and the swap
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
   950
rule; recall Fig.\ts\ref{hol-lemmas2} above.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   951
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   952
The classical reasoner is installed.  Tactics such as \texttt{Blast_tac} and {\tt
2495
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
   953
Best_tac} use the default claset ({\tt!claset}), which works for most
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
   954
purposes.  Named clasets include \ttindexbold{prop_cs}, which includes the
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   955
propositional rules, and \ttindexbold{HOL_cs}, which also includes quantifier
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   956
rules.  See the file \texttt{HOL/cladata.ML} for lists of the classical rules,
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   957
and \iflabelundefined{chap:classical}{the {\em Reference Manual\/}}%
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   958
{Chap.\ts\ref{chap:classical}} for more discussion of classical proof methods.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   959
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   960
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   961
\section{Types}\label{sec:HOL:Types}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   962
This section describes \HOL's basic predefined types ($\alpha \times
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   963
\beta$, $\alpha + \beta$, $nat$ and $\alpha \; list$) and ways for
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   964
introducing new types in general.  The most important type
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
   965
construction, the \texttt{datatype}, is treated separately in
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   966
\S\ref{sec:HOL:datatype}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   967
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   968
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   969
\subsection{Product and sum types}\index{*"* type}\index{*"+ type}
2994
3bb5d1b9c3aa Tuple patterns are allowed now in `case'
nipkow
parents: 2975
diff changeset
   970
\label{subsec:prod-sum}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   971
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   972
\begin{figure}[htbp]
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   973
\begin{constants}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   974
  \it symbol    & \it meta-type &           & \it description \\ 
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   975
  \cdx{Pair}    & $[\alpha,\beta]\To \alpha\times\beta$
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   976
        & & ordered pairs $(a,b)$ \\
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   977
  \cdx{fst}     & $\alpha\times\beta \To \alpha$        & & first projection\\
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   978
  \cdx{snd}     & $\alpha\times\beta \To \beta$         & & second projection\\
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   979
  \cdx{split}   & $[[\alpha,\beta]\To\gamma, \alpha\times\beta] \To \gamma$ 
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   980
        & & generalized projection\\
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   981
  \cdx{Sigma}  & 
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   982
        $[\alpha\,set, \alpha\To\beta\,set]\To(\alpha\times\beta)set$ &
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   983
        & general sum of sets
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   984
\end{constants}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   985
\begin{ttbox}\makeatletter
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   986
%\tdx{fst_def}      fst p     == @a. ? b. p = (a,b)
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   987
%\tdx{snd_def}      snd p     == @b. ? a. p = (a,b)
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   988
%\tdx{split_def}    split c p == c (fst p) (snd p)
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
   989
\tdx{Sigma_def}    Sigma A B == UN x:A. UN y:B x. {\ttlbrace}(x,y){\ttrbrace}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   990
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   991
\tdx{Pair_eq}      ((a,b) = (a',b')) = (a=a' & b=b')
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   992
\tdx{Pair_inject}  [| (a, b) = (a',b');  [| a=a';  b=b' |] ==> R |] ==> R
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   993
\tdx{PairE}        [| !!x y. p = (x,y) ==> Q |] ==> Q
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   994
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   995
\tdx{fst_conv}     fst (a,b) = a
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   996
\tdx{snd_conv}     snd (a,b) = b
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   997
\tdx{surjective_pairing}  p = (fst p,snd p)
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   998
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
   999
\tdx{split}        split c (a,b) = c a b
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1000
\tdx{expand_split} R(split c p) = (! x y. p = (x,y) --> R(c x y))
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1001
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  1002
\tdx{SigmaI}    [| a:A;  b:B a |] ==> (a,b) : Sigma A B
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  1003
\tdx{SigmaE}    [| c:Sigma A B; !!x y.[| x:A; y:B x; c=(x,y) |] ==> P |] ==> P
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1004
\end{ttbox}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1005
\caption{Type $\alpha\times\beta$}\label{hol-prod}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1006
\end{figure} 
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1007
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1008
Theory \thydx{Prod} (Fig.\ts\ref{hol-prod}) defines the product type
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1009
$\alpha\times\beta$, with the ordered pair syntax $(a, b)$.  General
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1010
tuples are simulated by pairs nested to the right:
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1011
\begin{center}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1012
\begin{tabular}{|c|c|}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1013
\hline
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1014
external & internal \\
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1015
\hline
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1016
$\tau@1 \times \dots \times \tau@n$ & $\tau@1 \times (\dots (\tau@{n-1} \times \tau@n)\dots)$ \\
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1017
\hline
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1018
$(t@1,\dots,t@n)$ & $(t@1,(\dots,(t@{n-1},t@n)\dots)$ \\
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1019
\hline
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1020
\end{tabular}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1021
\end{center}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1022
In addition, it is possible to use tuples
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1023
as patterns in abstractions:
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1024
\begin{center}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1025
{\tt\%($x$,$y$).$t$} \quad stands for\quad \texttt{split(\%$x$\thinspace$y$.$t$)} 
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1026
\end{center}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1027
Nested patterns are also supported.  They are translated stepwise:
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1028
{\tt\%($x$,$y$,$z$).$t$} $\leadsto$ {\tt\%($x$,($y$,$z$)).$t$} $\leadsto$
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1029
{\tt split(\%$x$.\%($y$,$z$).$t$)} $\leadsto$ \texttt{split(\%$x$.split(\%$y$
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1030
  $z$.$t$))}.  The reverse translation is performed upon printing.
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1031
\begin{warn}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1032
  The translation between patterns and \texttt{split} is performed automatically
1448
77379ae9ff0d Stylistic changes to discussion of pattern-matching
paulson
parents: 1429
diff changeset
  1033
  by the parser and printer.  Thus the internal and external form of a term
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1034
  may differ, which can affects proofs.  For example the term {\tt
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1035
  (\%(x,y).(y,x))(a,b)} requires the theorem \texttt{split} (which is in the
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1036
  default simpset) to rewrite to {\tt(b,a)}.
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1037
\end{warn}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1038
In addition to explicit $\lambda$-abstractions, patterns can be used in any
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1039
variable binding construct which is internally described by a
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1040
$\lambda$-abstraction.  Some important examples are
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1041
\begin{description}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1042
\item[Let:] \texttt{let {\it pattern} = $t$ in $u$}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1043
\item[Quantifiers:] \texttt{!~{\it pattern}:$A$.~$P$}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1044
\item[Choice:] {\underscoreon \tt @~{\it pattern}~.~$P$}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1045
\item[Set operations:] \texttt{UN~{\it pattern}:$A$.~$B$}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1046
\item[Sets:] \texttt{{\ttlbrace}~{\it pattern}~.~$P$~{\ttrbrace}}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1047
\end{description}
1471
b088c0a1f2bd documented split_all_tac in HOL.
nipkow
parents: 1448
diff changeset
  1048
b088c0a1f2bd documented split_all_tac in HOL.
nipkow
parents: 1448
diff changeset
  1049
There is a simple tactic which supports reasoning about patterns:
b088c0a1f2bd documented split_all_tac in HOL.
nipkow
parents: 1448
diff changeset
  1050
\begin{ttdescription}
b088c0a1f2bd documented split_all_tac in HOL.
nipkow
parents: 1448
diff changeset
  1051
\item[\ttindexbold{split_all_tac} $i$] replaces in subgoal $i$ all
b088c0a1f2bd documented split_all_tac in HOL.
nipkow
parents: 1448
diff changeset
  1052
  {\tt!!}-quantified variables of product type by individual variables for
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1053
  each component.  A simple example:
1471
b088c0a1f2bd documented split_all_tac in HOL.
nipkow
parents: 1448
diff changeset
  1054
\begin{ttbox}
b088c0a1f2bd documented split_all_tac in HOL.
nipkow
parents: 1448
diff changeset
  1055
{\out 1. !!p. (\%(x,y,z). (x, y, z)) p = p}
b088c0a1f2bd documented split_all_tac in HOL.
nipkow
parents: 1448
diff changeset
  1056
by(split_all_tac 1);
b088c0a1f2bd documented split_all_tac in HOL.
nipkow
parents: 1448
diff changeset
  1057
{\out 1. !!x xa ya. (\%(x,y,z). (x, y, z)) (x, xa, ya) = (x, xa, ya)}
b088c0a1f2bd documented split_all_tac in HOL.
nipkow
parents: 1448
diff changeset
  1058
\end{ttbox}
b088c0a1f2bd documented split_all_tac in HOL.
nipkow
parents: 1448
diff changeset
  1059
\end{ttdescription}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1060
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1061
Theory \texttt{Prod} also introduces the degenerate product type \texttt{unit}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1062
which contains only a single element named {\tt()} with the property
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1063
\begin{ttbox}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1064
\tdx{unit_eq}       u = ()
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1065
\end{ttbox}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1066
\bigskip
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1067
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1068
Theory \thydx{Sum} (Fig.~\ref{hol-sum}) defines the sum type $\alpha+\beta$
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1069
which associates to the right and has a lower priority than $*$: $\tau@1 +
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1070
\tau@2 + \tau@3*\tau@4$ means $\tau@1 + (\tau@2 + (\tau@3*\tau@4))$.
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1071
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1072
The definition of products and sums in terms of existing types is not
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1073
shown.  The constructions are fairly standard and can be found in the
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1074
respective theory files.
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1075
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1076
\begin{figure}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1077
\begin{constants}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1078
  \it symbol    & \it meta-type &           & \it description \\ 
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1079
  \cdx{Inl}     & $\alpha \To \alpha+\beta$    & & first injection\\
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1080
  \cdx{Inr}     & $\beta \To \alpha+\beta$     & & second injection\\
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1081
  \cdx{sum_case} & $[\alpha\To\gamma, \beta\To\gamma, \alpha+\beta] \To\gamma$
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1082
        & & conditional
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1083
\end{constants}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1084
\begin{ttbox}\makeatletter
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1085
%\tdx{sum_case_def}   sum_case == (\%f g p. @z. (!x. p=Inl x --> z=f x) &
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1086
%                                        (!y. p=Inr y --> z=g y))
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1087
%
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1088
\tdx{Inl_not_Inr}    Inl a ~= Inr b
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1089
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1090
\tdx{inj_Inl}        inj Inl
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1091
\tdx{inj_Inr}        inj Inr
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1092
1489
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
  1093
\tdx{sumE}           [| !!x. P(Inl x);  !!y. P(Inr y) |] ==> P s
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1094
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1095
\tdx{sum_case_Inl}   sum_case f g (Inl x) = f x
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1096
\tdx{sum_case_Inr}   sum_case f g (Inr x) = g x
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1097
1489
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
  1098
\tdx{surjective_sum} sum_case (\%x. f(Inl x)) (\%y. f(Inr y)) s = f s
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1099
\tdx{expand_sum_case} R(sum_case f g s) = ((! x. s = Inl(x) --> R(f(x))) &
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1100
                                     (! y. s = Inr(y) --> R(g(y))))
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1101
\end{ttbox}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1102
\caption{Type $\alpha+\beta$}\label{hol-sum}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1103
\end{figure}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1104
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1105
\begin{figure}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1106
\index{*"< symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1107
\index{*"* symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1108
\index{*div symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1109
\index{*mod symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1110
\index{*"+ symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1111
\index{*"- symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1112
\begin{constants}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1113
  \it symbol    & \it meta-type & \it priority & \it description \\ 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1114
  \cdx{0}       & $nat$         & & zero \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1115
  \cdx{Suc}     & $nat \To nat$ & & successor function\\
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1116
% \cdx{nat_case} & $[\alpha, nat\To\alpha, nat] \To\alpha$ & & conditional\\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1117
% \cdx{nat_rec} & $[nat, \alpha, [nat, \alpha]\To\alpha] \To \alpha$
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1118
%        & & primitive recursor\\
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1119
  \tt *         & $[nat,nat]\To nat$    &  Left 70      & multiplication \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1120
  \tt div       & $[nat,nat]\To nat$    &  Left 70      & division\\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1121
  \tt mod       & $[nat,nat]\To nat$    &  Left 70      & modulus\\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1122
  \tt +         & $[nat,nat]\To nat$    &  Left 65      & addition\\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1123
  \tt -         & $[nat,nat]\To nat$    &  Left 65      & subtraction
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1124
\end{constants}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1125
\subcaption{Constants and infixes}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1126
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1127
\begin{ttbox}\makeatother
3045
4ef28e05781b Added 'induct_tac'
nipkow
parents: 2994
diff changeset
  1128
\tdx{nat_induct}     [| P 0; !!n. P n ==> P(Suc n) |]  ==> P n
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1129
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1130
\tdx{Suc_not_Zero}   Suc m ~= 0
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1131
\tdx{inj_Suc}        inj Suc
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1132
\tdx{n_not_Suc_n}    n~=Suc n
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1133
\subcaption{Basic properties}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1134
\end{ttbox}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1135
\caption{The type of natural numbers, \tydx{nat}} \label{hol-nat1}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1136
\end{figure}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1137
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1138
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1139
\begin{figure}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1140
\begin{ttbox}\makeatother
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1141
              0+n           = n
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1142
              (Suc m)+n     = Suc(m+n)
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1143
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1144
              m-0           = m
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1145
              0-n           = n
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1146
              Suc(m)-Suc(n) = m-n
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1147
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1148
              0*n           = 0
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1149
              Suc(m)*n      = n + m*n
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1150
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1151
\tdx{mod_less}      m<n ==> m mod n = m
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1152
\tdx{mod_geq}       [| 0<n;  ~m<n |] ==> m mod n = (m-n) mod n
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1153
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1154
\tdx{div_less}      m<n ==> m div n = 0
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1155
\tdx{div_geq}       [| 0<n;  ~m<n |] ==> m div n = Suc((m-n) div n)
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1156
\end{ttbox}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1157
\caption{Recursion equations for the arithmetic operators} \label{hol-nat2}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1158
\end{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1159
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1160
\subsection{The type of natural numbers, \textit{nat}}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1161
\index{nat@{\textit{nat}} type|(}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1162
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1163
The theory \thydx{NatDef} defines the natural numbers in a roundabout but
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1164
traditional way.  The axiom of infinity postulates a type~\tydx{ind} of
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1165
individuals, which is non-empty and closed under an injective operation.  The
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1166
natural numbers are inductively generated by choosing an arbitrary individual
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1167
for~0 and using the injective operation to take successors.  This is a least
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1168
fixedpoint construction.  For details see the file \texttt{NatDef.thy}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1169
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1170
Type~\tydx{nat} is an instance of class~\cldx{ord}, which makes the
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1171
overloaded functions of this class (esp.\ \cdx{<} and \cdx{<=}, but also
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1172
\cdx{min}, \cdx{max} and \cdx{LEAST}) available on \tydx{nat}.  Theory
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1173
\thydx{Nat} builds on \texttt{NatDef} and shows that {\tt<=} is a partial order,
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1174
so \tydx{nat} is also an instance of class \cldx{order}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1175
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1176
Theory \thydx{Arith} develops arithmetic on the natural numbers.  It defines
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1177
addition, multiplication and subtraction.  Theory \thydx{Divides} defines
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1178
division, remainder and the ``divides'' relation.  The numerous theorems
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1179
proved include commutative, associative, distributive, identity and
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1180
cancellation laws.  See Figs.\ts\ref{hol-nat1} and~\ref{hol-nat2}.  The
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1181
recursion equations for the operators \texttt{+}, \texttt{-} and \texttt{*} on
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1182
\texttt{nat} are part of the default simpset.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1183
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1184
Functions on \tydx{nat} can be defined by primitive or well-founded recursion;
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1185
see \S\ref{sec:HOL:recursive}.  A simple example is addition.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1186
Here, \texttt{op +} is the name of the infix operator~\texttt{+}, following
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1187
the standard convention.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1188
\begin{ttbox}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1189
\sdx{primrec} "op +" nat 
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1190
  "    0 + n = n"
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1191
  "Suc m + n = Suc(m + n)"
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1192
\end{ttbox}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1193
There is also a \sdx{case}-construct
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1194
of the form
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1195
\begin{ttbox}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1196
case \(e\) of 0 => \(a\) | Suc \(m\) => \(b\)
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1197
\end{ttbox}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1198
Note that Isabelle insists on precisely this format; you may not even change
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1199
the order of the two cases.
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1200
Both \texttt{primrec} and \texttt{case} are realized by a recursion operator
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1201
\cdx{nat_rec}, the details of which can be found in theory \texttt{NatDef}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1202
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1203
%The predecessor relation, \cdx{pred_nat}, is shown to be well-founded.
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1204
%Recursion along this relation resembles primitive recursion, but is
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1205
%stronger because we are in higher-order logic; using primitive recursion to
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1206
%define a higher-order function, we can easily Ackermann's function, which
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1207
%is not primitive recursive \cite[page~104]{thompson91}.
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1208
%The transitive closure of \cdx{pred_nat} is~$<$.  Many functions on the
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1209
%natural numbers are most easily expressed using recursion along~$<$.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1210
3045
4ef28e05781b Added 'induct_tac'
nipkow
parents: 2994
diff changeset
  1211
Tactic {\tt\ttindex{induct_tac} "$n$" $i$} performs induction on variable~$n$
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1212
in subgoal~$i$ using theorem \texttt{nat_induct}.  There is also the derived
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1213
theorem \tdx{less_induct}:
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1214
\begin{ttbox}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1215
[| !!n. [| ! m. m<n --> P m |] ==> P n |]  ==>  P n
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1216
\end{ttbox}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1217
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1218
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1219
Reasoning about arithmetic inequalities can be tedious.  A minimal amount of
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1220
automation is provided by the tactic \ttindex{trans_tac} of type \texttt{int ->
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1221
tactic} that deals with simple inequalities.  Note that it only knows about
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1222
{\tt 0}, \texttt{Suc}, {\tt<} and {\tt<=}.  The following goals are all solved by
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1223
{\tt trans_tac 1}:
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1224
\begin{ttbox}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1225
{\out  1. \dots ==> m <= Suc(Suc m)}
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1226
{\out  1. [| \dots i <= j \dots Suc j <= k \dots |] ==> i < k}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1227
{\out  1. [| \dots Suc m <= n \dots ~ m < n \dots |] ==> \dots}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1228
\end{ttbox}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1229
For a complete description of the limitations of the tactic and how to avoid
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1230
some of them, see the comments at the start of the file {\tt
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1231
Provers/nat_transitive.ML}.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1232
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1233
If \texttt{trans_tac} fails you, try to find relevant arithmetic results in
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1234
the library.  The theory \texttt{NatDef} contains theorems about {\tt<} and
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1235
{\tt<=}, the theory \texttt{Arith} contains theorems about \texttt{+},
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1236
\texttt{-} and \texttt{*}, and theory \texttt{Divides} contains theorems about
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1237
\texttt{div} and \texttt{mod}.  Use the \texttt{find}-functions to locate them
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1238
(see the {\em Reference Manual\/}).
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1239
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1240
\begin{figure}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1241
\index{#@{\tt[]} symbol}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1242
\index{#@{\tt\#} symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1243
\index{"@@{\tt\at} symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1244
\begin{constants}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1245
  \it symbol & \it meta-type & \it priority & \it description \\
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1246
  \tt[]    & $\alpha\,list$ & & empty list\\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1247
  \tt \#   & $[\alpha,\alpha\,list]\To \alpha\,list$ & Right 65 & 
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1248
        list constructor \\
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1249
  \cdx{null}    & $\alpha\,list \To bool$ & & emptiness test\\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1250
  \cdx{hd}      & $\alpha\,list \To \alpha$ & & head \\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1251
  \cdx{tl}      & $\alpha\,list \To \alpha\,list$ & & tail \\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1252
  \cdx{ttl}     & $\alpha\,list \To \alpha\,list$ & & total tail \\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1253
  \tt\at  & $[\alpha\,list,\alpha\,list]\To \alpha\,list$ & Left 65 & append \\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1254
  \cdx{map}     & $(\alpha\To\beta) \To (\alpha\,list \To \beta\,list)$
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1255
        & & apply to all\\
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1256
  \cdx{filter}  & $(\alpha \To bool) \To (\alpha\,list \To \alpha\,list)$
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1257
        & & filter functional\\
3487
62a6a08471e4 set_of_list -> set
nipkow
parents: 3315
diff changeset
  1258
  \cdx{set}& $\alpha\,list \To \alpha\,set$ & & elements\\
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1259
  \sdx{mem}  & $[\alpha,\alpha\,list]\To bool$    &  Left 55   & membership\\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1260
  \cdx{foldl}   & $(\beta\To\alpha\To\beta) \To \beta \To \alpha\,list \To \beta$ &
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1261
  & iteration \\
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1262
  \cdx{concat}   & $(\alpha\,list)list\To \alpha\,list$ & & concatenation \\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1263
  \cdx{rev}     & $\alpha\,list \To \alpha\,list$ & & reverse \\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1264
  \cdx{length}  & $\alpha\,list \To nat$ & & length \\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1265
  \cdx{nth}  & $nat \To \alpha\,list \To \alpha$ & & indexing \\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1266
  \cdx{take}, \cdx{drop} & $nat \To \alpha\,list \To \alpha\,list$ &&
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1267
    take or drop a prefix \\
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1268
  \cdx{takeWhile},\\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1269
  \cdx{dropWhile} &
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1270
    $(\alpha \To bool) \To \alpha\,list \To \alpha\,list$ &&
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1271
    take or drop a prefix
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1272
\end{constants}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1273
\subcaption{Constants and infixes}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1274
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1275
\begin{center} \tt\frenchspacing
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1276
\begin{tabular}{rrr} 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1277
  \it external        & \it internal  & \it description \\{}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1278
  [$x@1$, $\dots$, $x@n$]  &  $x@1$ \# $\cdots$ \# $x@n$ \# [] &
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1279
        \rm finite list \\{}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1280
  [$x$:$l$. $P$]  & filter ($\lambda x{.}P$) $l$ & 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1281
        \rm list comprehension
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1282
\end{tabular}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1283
\end{center}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1284
\subcaption{Translations}
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
  1285
\caption{The theory \thydx{List}} \label{hol-list}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1286
\end{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1287
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1288
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1289
\begin{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1290
\begin{ttbox}\makeatother
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1291
null [] = True
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1292
null (x#xs) = False
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1293
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1294
hd (x#xs) = x
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1295
tl (x#xs) = xs
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1296
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1297
[] @ ys = ys
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1298
(x#xs) @ ys = x # xs @ ys
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1299
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1300
map f [] = []
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1301
map f (x#xs) = f x # map f xs
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1302
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1303
filter P [] = []
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1304
filter P (x#xs) = (if P x then x#filter P xs else filter P xs)
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1305
3487
62a6a08471e4 set_of_list -> set
nipkow
parents: 3315
diff changeset
  1306
set [] = \ttlbrace\ttrbrace
62a6a08471e4 set_of_list -> set
nipkow
parents: 3315
diff changeset
  1307
set (x#xs) = insert x (set xs)
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1308
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1309
x mem [] = False
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1310
x mem (y#ys) = (if y=x then True else x mem ys)
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1311
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1312
foldl f a [] = a
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1313
foldl f a (x#xs) = foldl f (f a x) xs
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1314
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1315
concat([]) = []
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1316
concat(x#xs) = x @ concat(xs)
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1317
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1318
rev([]) = []
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1319
rev(x#xs) = rev(xs) @ [x]
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1320
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1321
length([]) = 0
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1322
length(x#xs) = Suc(length(xs))
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1323
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1324
nth 0 xs = hd xs
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1325
nth (Suc n) xs = nth n (tl xs)
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1326
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1327
take n [] = []
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1328
take n (x#xs) = (case n of 0 => [] | Suc(m) => x # take m xs)
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1329
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1330
drop n [] = []
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1331
drop n (x#xs) = (case n of 0 => x#xs | Suc(m) => drop m xs)
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1332
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1333
takeWhile P [] = []
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1334
takeWhile P (x#xs) = (if P x then x#takeWhile P xs else [])
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1335
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1336
dropWhile P [] = []
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1337
dropWhile P (x#xs) = (if P x then dropWhile P xs else xs)
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1338
\end{ttbox}
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1339
\caption{Recursions equations for list processing functions}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1340
\label{fig:HOL:list-simps}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1341
\end{figure}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1342
\index{nat@{\textit{nat}} type|)}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1343
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1344
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1345
\subsection{The type constructor for lists, \textit{list}}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1346
\index{list@{\textit{list}} type|(}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1347
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1348
Figure~\ref{hol-list} presents the theory \thydx{List}: the basic list
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1349
operations with their types and syntax.  Type $\alpha \; list$ is
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1350
defined as a \texttt{datatype} with the constructors {\tt[]} and {\tt\#}.
3287
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1351
As a result the generic structural induction and case analysis tactics
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1352
\texttt{induct\_tac} and \texttt{exhaust\_tac} also become available for
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1353
lists.  A \sdx{case} construct of the form
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1354
\begin{center}\tt
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1355
case $e$ of [] => $a$  |  \(x\)\#\(xs\) => b
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1356
\end{center}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1357
is defined by translation.  For details see~\S\ref{sec:HOL:datatype}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1358
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1359
{\tt List} provides a basic library of list processing functions defined by
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1360
primitive recursion (see~\S\ref{sec:HOL:primrec}).  The recursion equations
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1361
are shown in Fig.\ts\ref{fig:HOL:list-simps}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1362
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1363
\index{list@{\textit{list}} type|)}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1364
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1365
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1366
\subsection{Introducing new types} \label{sec:typedef}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1367
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1368
The \HOL-methodology dictates that all extensions to a theory should
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1369
be \textbf{definitional}.  The type definition mechanism that
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1370
meets this criterion is \ttindex{typedef}.  Note that \emph{type synonyms},
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1371
which are inherited from {\Pure} and described elsewhere, are just
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1372
syntactic abbreviations that have no logical meaning.
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1373
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1374
\begin{warn}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1375
  Types in \HOL\ must be non-empty; otherwise the quantifier rules would be
1429
1f0009009219 Modified non-empty-types warning in HOL.
nipkow
parents: 1422
diff changeset
  1376
  unsound, because $\exists x. x=x$ is a theorem \cite[\S7]{paulson-COLOG}.
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1377
\end{warn}
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1378
A \bfindex{type definition} identifies the new type with a subset of
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1379
an existing type.  More precisely, the new type is defined by
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1380
exhibiting an existing type~$\tau$, a set~$A::\tau\,set$, and a
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1381
theorem of the form $x:A$.  Thus~$A$ is a non-empty subset of~$\tau$,
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1382
and the new type denotes this subset.  New functions are defined that
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1383
establish an isomorphism between the new type and the subset.  If
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1384
type~$\tau$ involves type variables $\alpha@1$, \ldots, $\alpha@n$,
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1385
then the type definition creates a type constructor
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1386
$(\alpha@1,\ldots,\alpha@n)ty$ rather than a particular type.
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1387
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1388
\begin{figure}[htbp]
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1389
\begin{rail}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1390
typedef  : 'typedef' ( () | '(' name ')') type '=' set witness;
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1391
type    : typevarlist name ( () | '(' infix ')' );
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1392
set     : string;
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1393
witness : () | '(' id ')';
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1394
\end{rail}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1395
\caption{Syntax of type definitions}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1396
\label{fig:HOL:typedef}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1397
\end{figure}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1398
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1399
The syntax for type definitions is shown in Fig.~\ref{fig:HOL:typedef}.  For
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1400
the definition of `typevarlist' and `infix' see
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1401
\iflabelundefined{chap:classical}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1402
{the appendix of the {\em Reference Manual\/}}%
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1403
{Appendix~\ref{app:TheorySyntax}}.  The remaining nonterminals have the
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1404
following meaning:
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1405
\begin{description}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1406
\item[\it type:] the new type constructor $(\alpha@1,\dots,\alpha@n)ty$ with
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1407
  optional infix annotation.
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1408
\item[\it name:] an alphanumeric name $T$ for the type constructor
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1409
  $ty$, in case $ty$ is a symbolic name.  Defaults to $ty$.
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1410
\item[\it set:] the representing subset $A$.
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1411
\item[\it witness:] name of a theorem of the form $a:A$ proving
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1412
  non-emptiness.  It can be omitted in case Isabelle manages to prove
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1413
  non-emptiness automatically.
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1414
\end{description}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1415
If all context conditions are met (no duplicate type variables in
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1416
`typevarlist', no extra type variables in `set', and no free term variables
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1417
in `set'), the following components are added to the theory:
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1418
\begin{itemize}
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1419
\item a type $ty :: (term,\dots,term)term$
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1420
\item constants
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1421
\begin{eqnarray*}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1422
T &::& \tau\;set \\
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1423
Rep_T &::& (\alpha@1,\dots,\alpha@n)ty \To \tau \\
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1424
Abs_T &::& \tau \To (\alpha@1,\dots,\alpha@n)ty
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1425
\end{eqnarray*}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1426
\item a definition and three axioms
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1427
\[
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1428
\begin{array}{ll}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1429
T{\tt_def} & T \equiv A \\
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1430
{\tt Rep_}T & Rep_T\,x \in T \\
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1431
{\tt Rep_}T{\tt_inverse} & Abs_T\,(Rep_T\,x) = x \\
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1432
{\tt Abs_}T{\tt_inverse} & y \in T \Imp Rep_T\,(Abs_T\,y) = y
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1433
\end{array}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1434
\]
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1435
stating that $(\alpha@1,\dots,\alpha@n)ty$ is isomorphic to $A$ by $Rep_T$
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1436
and its inverse $Abs_T$.
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1437
\end{itemize}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1438
Below are two simple examples of \HOL\ type definitions.  Non-emptiness
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1439
is proved automatically here.
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1440
\begin{ttbox}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1441
typedef unit = "{\ttlbrace}True{\ttrbrace}"
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1442
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1443
typedef (prod)
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1444
  ('a, 'b) "*"    (infixr 20)
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1445
      = "{\ttlbrace}f . EX (a::'a) (b::'b). f = (\%x y. x = a & y = b){\ttrbrace}"
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1446
\end{ttbox}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1447
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1448
Type definitions permit the introduction of abstract data types in a safe
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1449
way, namely by providing models based on already existing types.  Given some
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1450
abstract axiomatic description $P$ of a type, this involves two steps:
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1451
\begin{enumerate}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1452
\item Find an appropriate type $\tau$ and subset $A$ which has the desired
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  1453
  properties $P$, and make a type definition based on this representation.
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1454
\item Prove that $P$ holds for $ty$ by lifting $P$ from the representation.
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1455
\end{enumerate}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1456
You can now forget about the representation and work solely in terms of the
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1457
abstract properties $P$.
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1458
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1459
\begin{warn}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1460
If you introduce a new type (constructor) $ty$ axiomatically, i.e.\ by
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1461
declaring the type and its operations and by stating the desired axioms, you
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1462
should make sure the type has a non-empty model.  You must also have a clause
1429
1f0009009219 Modified non-empty-types warning in HOL.
nipkow
parents: 1422
diff changeset
  1463
\par
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1464
\begin{ttbox}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1465
arities \(ty\) :: (term,\thinspace\(\dots\),{\thinspace}term){\thinspace}term
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1466
\end{ttbox}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1467
in your theory file to tell Isabelle that $ty$ is in class \texttt{term}, the
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1468
class of all \HOL\ types.
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1469
\end{warn}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1470
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1471
\section{Datatype declarations}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1472
\label{sec:HOL:datatype}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1473
\index{*datatype|(}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1474
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1475
Inductive datatypes, similar to those of \ML, frequently appear in
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1476
non-trivial applications of \HOL.  In principle, such types could be
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1477
defined by hand via \texttt{typedef} (see \S\ref{sec:typedef}), but
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1478
this would be far too tedious.  The \ttindex{datatype} definition
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1479
package of \HOL\ automates such chores.  It generates freeness theorems
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1480
and induction rules from a very simple description of the new type
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1481
provided by the user.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1482
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1483
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1484
\subsection{Basics}
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1485
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1486
The general \HOL\ \texttt{datatype} definition is of the following form:
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1487
\[
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1488
\mathtt{datatype}~(\alpha@1, \dots, \alpha@n) \, t ~=~
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1489
C@1~\tau@{11}~\dots~\tau@{1k@1} ~\mid~ \dots ~\mid~
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1490
C@m~\tau@{m1}~\dots~\tau@{mk@m}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1491
\]
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1492
where $\alpha@i$ are type variables, $C@i$ are distinct constructor
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1493
names and $\tau@{ij}$ are types.  The latter may be one of the
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1494
following:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1495
\begin{itemize}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1496
\item type variables $\alpha@1, \dots, \alpha@n$,
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1497
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1498
\item types $(\beta@1, \dots, \beta@l) \, t'$ where $t'$ is a
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1499
  previously declared type constructor or type synonym and $\{\beta@1,
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1500
  \dots, \beta@l\} \subseteq \{\alpha@1, \dots, \alpha@n\}$,
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1501
  
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1502
\item the newly defined type $(\alpha@1, \dots, \alpha@n) \, t$.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1503
\end{itemize}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1504
Recursive occurences of $(\alpha@1, \dots, \alpha@n) \, t$ are quite
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1505
restricted.  To ensure that the new type is non-empty, at least one
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1506
constructor must consist of only non-recursive type components.  If
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1507
you would like one of the $\tau@{ij}$ to be a complex type expression
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1508
$\tau$ you need to declare a new type synonym $syn = \tau$ first and
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1509
use $syn$ in place of $\tau$.  Of course this does not work if $\tau$
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1510
mentions the recursive type itself, thus ruling out problematic cases
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1511
like $\mathtt{datatype}~ t ~=~ C \, (t \To t)$, but also unproblematic
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1512
ones like $\mathtt{datatype}~ t ~=~ C \, (t~list)$.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1513
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1514
The constructors are automatically defined as functions of their respective
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1515
type:
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1516
\[ C@j :: [\tau@{j1},\dots,\tau@{jk@j}] \To (\alpha@1,\dots,\alpha@n)t \]
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1517
These functions have certain {\em freeness} properties --- they are
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1518
distinct:
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1519
\[
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1520
C@i~x@1~\dots~x@{k@i} \neq C@j~y@1~\dots~y@{k@j} \qquad
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1521
\mbox{for all}~ i \neq j.
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1522
\]
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1523
and they are injective:
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1524
\[
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1525
(C@j~x@1~\dots~x@{k@j} = C@j~y@1~\dots~y@{k@j}) =
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1526
(x@1 = y@1 \land \dots \land x@{k@j} = y@{k@j})
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1527
\]
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1528
Because the number of inequalities is quadratic in the number of
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1529
constructors, a different representation is used if there are $7$ or
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1530
more of them.  In that case every constructor term is mapped to a
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1531
natural number:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1532
\[
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1533
t_ord \, (C@i \, x@1 \, \dots \, x@{k@i}) = i - 1
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1534
\]
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1535
Then distinctness of constructor terms is expressed by:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1536
\[
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1537
t_ord \, x \neq t_ord \, y \Imp x \neq y.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1538
\]
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1539
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1540
\medskip Generally, the following structural induction rule is
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1541
provided:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1542
\[
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1543
\infer{P \, x}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1544
{\begin{array}{lcl}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1545
\Forall x@1\dots x@{k@1}.
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1546
  \List{P~x@{r@{11}}; \dots; P~x@{r@{1l@1}}} &
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1547
  \Imp  & P \, (C@1~x@1~\dots~x@{k@1}) \\
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1548
 & \vdots & \\
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1549
\Forall x@1\dots x@{k@m}.
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1550
  \List{P~x@{r@{m1}}; \dots; P~x@{r@{ml@m}}} &
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1551
  \Imp & P \, (C@m~x@1~\dots~x@{k@m})
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1552
\end{array}}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1553
\]
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1554
where $\{r@{j1},\dots,r@{jl@j}\} = \{i \in \{1,\dots k@j\} ~\mid~ \tau@{ji}
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1555
= (\alpha@1,\dots,\alpha@n)t \} =: Rec@j$, i.e.\ the property $P$ can be
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1556
assumed for all arguments of the recursive type.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1557
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1558
For convenience, the following additional constructions are predefined for
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1559
each datatype.
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1560
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1561
\subsubsection{The \sdx{case} construct}
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1562
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1563
The type comes with an \ML-like \texttt{case}-construct:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1564
\[
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1565
\begin{array}{rrcl}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1566
\mbox{\tt case}~e~\mbox{\tt of} & C@1~x@{11}~\dots~x@{1k@1} & \To & e@1 \\
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1567
                           \vdots \\
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1568
                           \mid & C@m~x@{m1}~\dots~x@{mk@m} & \To & e@m
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1569
\end{array}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1570
\]
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1571
where the $x@{ij}$ are either identifiers or nested tuple patterns as in
2994
3bb5d1b9c3aa Tuple patterns are allowed now in `case'
nipkow
parents: 2975
diff changeset
  1572
\S\ref{subsec:prod-sum}.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1573
\begin{warn}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1574
In contrast to \ML, {\em all} constructors must be present, their order is
2994
3bb5d1b9c3aa Tuple patterns are allowed now in `case'
nipkow
parents: 2975
diff changeset
  1575
fixed, and nested patterns are not supported (with the exception of tuples).
3bb5d1b9c3aa Tuple patterns are allowed now in `case'
nipkow
parents: 2975
diff changeset
  1576
Violating this restriction results in strange error messages.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1577
\end{warn}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1578
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1579
\subsubsection{The function \cdx{size}}\label{sec:HOL:size}
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1580
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1581
Theory \texttt{Arith} declares an overloaded function \texttt{size} of type
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1582
$\alpha\To nat$.  Each datatype defines a particular instance of \texttt{size}
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1583
according to the following scheme:
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1584
\[
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1585
size(C@j~x@{j1}~\dots~x@{jk@1}) =
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1586
\left\{
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1587
\begin{array}{ll}
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1588
0 & \mbox{if $Rec@j = \emptyset$} \\
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1589
size(x@{r@{j1}}) + \cdots + size(x@{r@{jl@j}}) + 1 &
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1590
 \mbox{if $Rec@j = \{r@{j1},\dots,r@{jl@j}\}$}
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1591
\end{array}
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1592
\right.
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1593
\]
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1594
where $Rec@j$ is defined above.  Viewing datatypes as generalized trees, the
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1595
size of a leaf is 0 and the size of a node is the sum of the sizes of its
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1596
subtrees $+1$.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1597
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1598
\subsection{Defining datatypes}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1599
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1600
A datatype is defined in a theory definition file using the keyword
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1601
{\tt datatype}.  The definition following this must conform to the
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1602
syntax of {\em typedecl} specified in Fig.~\ref{datatype-grammar} and
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1603
must obey the rules in the previous section.  As a result the theory is
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1604
extended with the new type, the constructors, and the theorems listed
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1605
in the previous section.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1606
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1607
\begin{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1608
\begin{rail}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1609
typedecl : typevarlist id '=' (cons + '|')
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1610
         ;
1581
a82618a900e5 updated syntax of datatype declaration
clasohm
parents: 1578
diff changeset
  1611
cons     : name (typ *) ( () | mixfix )
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1612
         ;
1581
a82618a900e5 updated syntax of datatype declaration
clasohm
parents: 1578
diff changeset
  1613
typ      : id | tid | ('(' typevarlist id ')')
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1614
         ;
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1615
\end{rail}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1616
\caption{Syntax of datatype declarations}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1617
\label{datatype-grammar}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1618
\end{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1619
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1620
\begin{warn}
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1621
  Every theory containing a datatype declaration must be based, directly or
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1622
  indirectly, on the theory \texttt{Arith}, if necessary by including it
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1623
  explicitly as a parent.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1624
\end{warn}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1625
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1626
Most of the theorems about the datatype become part of the default simpset
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1627
and you never need to see them again because the simplifier applies them
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1628
automatically.  Only induction is invoked by hand:
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1629
\begin{ttdescription}
3045
4ef28e05781b Added 'induct_tac'
nipkow
parents: 2994
diff changeset
  1630
\item[\ttindexbold{induct_tac} {\tt"}$x${\tt"} $i$]
4ef28e05781b Added 'induct_tac'
nipkow
parents: 2994
diff changeset
  1631
 applies structural induction on variable $x$ to subgoal $i$, provided the
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1632
 type of $x$ is a datatype or type \tydx{nat}.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1633
\end{ttdescription}
3287
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1634
In some cases, induction is overkill and a case distinction over all
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1635
constructors of the datatype suffices:
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1636
\begin{ttdescription}
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1637
\item[\ttindexbold{exhaust_tac} {\tt"}$u${\tt"} $i$]
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1638
 performs an exhaustive case analysis for the term $u$ whose type
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1639
 must be a datatype or type \tydx{nat}.  If the datatype has $n$ constructors
3287
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1640
 $C@1$, \dots $C@n$, subgoal $i$ is replaced by $n$ new subgoals which
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1641
 contain the additional assumption $u = C@j~x@1~\dots~x@{k@j}$ for
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1642
 $j=1$, $\dots$,~$n$.
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1643
\end{ttdescription}
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1644
\begin{warn}
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1645
  Induction is only allowed on a free variable that should not occur among
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1646
  the premises of the subgoal.  Exhaustion is works for arbitrary terms.
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1647
\end{warn}
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1648
\bigskip
3287
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1649
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1650
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1651
For the technically minded, we give a more detailed description.
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1652
Reading the theory file produces an \ML\ structure which, in addition to the
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1653
usual components, contains a structure named $t$ for each datatype $t$
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1654
defined in the file.  Each structure $t$ contains the following
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1655
elements:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1656
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1657
val distinct : thm list
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1658
val inject : thm list
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1659
val induct : thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1660
val cases : thm list
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1661
val simps : thm list
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1662
val induct_tac : string -> int -> tactic
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1663
\end{ttbox}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1664
{\tt distinct}, \texttt{inject} and \texttt{induct} contain the theorems
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1665
described above.  For user convenience, \texttt{distinct} contains
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1666
inequalities in both directions.  The reduction rules of the {\tt
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1667
  case}-construct are in \texttt{cases}.  All theorems from {\tt
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1668
  distinct}, \texttt{inject} and \texttt{cases} are combined in \texttt{simps}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1669
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1670
\subsection{Examples}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1671
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1672
\subsubsection{The datatype $\alpha~mylist$}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1673
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1674
We want to define the type $\alpha~mylist$.\footnote{This is just an
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1675
  example, there is already a list type in \HOL, of course.} To do
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1676
this we have to build a new theory that contains the type definition.
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1677
We start from the basic \texttt{HOL} theory.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1678
\begin{ttbox}
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
  1679
MyList = HOL +
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1680
  datatype 'a mylist = Nil | Cons 'a ('a mylist)
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1681
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1682
\end{ttbox}
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1683
After loading the theory (with \verb$use_thy "MyList"$), we can prove
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1684
$Cons~x~xs\neq xs$.  To ease the induction applied below, we state the
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1685
goal with $x$ quantified at the object-level.  This will be stripped
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1686
later using \ttindex{qed_spec_mp}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1687
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1688
goal MyList.thy "!x. Cons x xs ~= xs";
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1689
{\out Level 0}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1690
{\out ! x. Cons x xs ~= xs}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1691
{\out  1. ! x. Cons x xs ~= xs}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1692
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1693
This can be proved by the structural induction tactic:
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1694
\begin{ttbox}
3045
4ef28e05781b Added 'induct_tac'
nipkow
parents: 2994
diff changeset
  1695
by (induct_tac "xs" 1);
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1696
{\out Level 1}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1697
{\out ! x. Cons x xs ~= xs}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1698
{\out  1. ! x. Cons x Nil ~= Nil}
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1699
{\out  2. !!a mylist.}
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1700
{\out        ! x. Cons x mylist ~= mylist ==>}
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1701
{\out        ! x. Cons x (Cons a mylist) ~= Cons a mylist}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1702
\end{ttbox}
2495
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1703
The first subgoal can be proved using the simplifier.
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1704
Isabelle has already added the freeness properties of lists to the 
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1705
default simplification set.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1706
\begin{ttbox}
2495
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1707
by (Simp_tac 1);
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1708
{\out Level 2}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1709
{\out ! x. Cons x xs ~= xs}
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1710
{\out  1. !!a mylist.}
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1711
{\out        ! x. Cons x mylist ~= mylist ==>}
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1712
{\out        ! x. Cons x (Cons a mylist) ~= Cons a mylist}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1713
\end{ttbox}
2495
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1714
Similarly, we prove the remaining goal.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1715
\begin{ttbox}
2495
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1716
by (Asm_simp_tac 1);
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1717
{\out Level 3}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1718
{\out ! x. Cons x xs ~= xs}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1719
{\out No subgoals!}
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1720
\ttbreak
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1721
qed_spec_mp "not_Cons_self";
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1722
{\out val not_Cons_self = "Cons x xs ~= xs";}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1723
\end{ttbox}
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1724
Because both subgoals could have been proved by \texttt{Asm_simp_tac}
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1725
we could have done that in one step:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1726
\begin{ttbox}
2495
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1727
by (ALLGOALS Asm_simp_tac);
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1728
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1729
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1730
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1731
\subsubsection{The datatype $\alpha~mylist$ with mixfix syntax}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1732
3181
wenzelm
parents: 3180
diff changeset
  1733
In this example we define the type $\alpha~mylist$ again but this time
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1734
we want to write \texttt{[]} for \texttt{Nil} and we want to use infix
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1735
notation \verb|#| for \texttt{Cons}.  To do this we simply add mixfix
3181
wenzelm
parents: 3180
diff changeset
  1736
annotations after the constructor declarations as follows:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1737
\begin{ttbox}
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
  1738
MyList = HOL +
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1739
  datatype 'a mylist =
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1740
    Nil ("[]")  |
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1741
    Cons 'a ('a mylist)  (infixr "#" 70)
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1742
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1743
\end{ttbox}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1744
Now the theorem in the previous example can be written \verb|x#xs ~= xs|.  The
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1745
proof is the same.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1746
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1747
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1748
\subsubsection{A datatype for weekdays}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1749
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1750
This example shows a datatype that consists of 7 constructors:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1751
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1752
Days = Arith +
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1753
  datatype days = Mon | Tue | Wed | Thu | Fri | Sat | Sun
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1754
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1755
\end{ttbox}
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1756
Because there are more than 6 constructors, the theory must be based
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1757
on \texttt{Arith}.  Inequality is expressed via a function
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1758
\verb|days_ord|.  The theorem \verb|Mon ~= Tue| is not directly
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1759
contained among the distinctness theorems, but the simplifier can
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1760
prove it thanks to rewrite rules inherited from theory \texttt{Arith}:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1761
\begin{ttbox}
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1762
goal Days.thy "Mon ~= Tue";
2495
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1763
by (Simp_tac 1);
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1764
\end{ttbox}
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1765
You need not derive such inequalities explicitly: the simplifier will dispose
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1766
of them automatically.
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1767
\index{*datatype|)}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1768
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1769
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1770
\section{Recursive function definitions}\label{sec:HOL:recursive}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1771
\index{recursive functions|see{recursion}}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1772
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1773
Isabelle/HOL provides two means of declaring recursive functions.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1774
\begin{itemize}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1775
\item \textbf{Primitive recursion} is available only for datatypes, and it is
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1776
  highly restrictive.  Recursive calls are only allowed on the argument's
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1777
  immediate constituents.  On the other hand, it is the form of recursion most
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1778
  often wanted, and it is easy to use.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1779
  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1780
\item \textbf{Well-founded recursion} requires that you supply a well-founded
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1781
  relation that governs the recursion.  Recursive calls are only allowed if
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1782
  they make the argument decrease under the relation.  Complicated recursion
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1783
  forms, such as nested recursion, can be dealt with.  Termination can even be
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1784
  proved at a later time, though having unsolved termination conditions around
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1785
  can make work difficult.%
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1786
  \footnote{This facility is based on Konrad Slind's TFL
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1787
    package~\cite{slind-tfl}.  Thanks are due to Konrad for implementing TFL
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1788
    and assisting with its installation.}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1789
\end{itemize}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1790
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1791
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1792
A theory file may contain any number of recursive function definitions, which
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1793
may be intermixed with other declarations.  Every recursive function must
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1794
already have been declared as a constant.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1795
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1796
These declarations do not assert new axioms.  Instead, they define the
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1797
function using a recursion operator.  Both HOL and ZF derive the theory of
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1798
well-founded recursion from first principles~\cite{paulson-set-II}.  Primitive
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1799
recursion over some datatype relies on the recursion operator provided by the
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1800
datatype package.  With either form of function definition, Isabelle proves
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1801
the desired recursion equations as theorems.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1802
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1803
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1804
\subsection{Primitive recursive functions}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1805
\label{sec:HOL:primrec}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1806
\index{recursion!primitive|(}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1807
\index{*primrec|(}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1808
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1809
Datatypes come with a uniform way of defining functions, {\bf
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1810
  primitive recursion}.  In principle, one can define
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1811
primitive recursive functions by asserting their reduction rules as
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1812
new axioms.  Here is an example:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1813
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1814
Append = MyList +
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1815
consts app :: ['a mylist, 'a mylist] => 'a mylist
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1816
rules 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1817
   app_Nil   "app [] ys = ys"
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
  1818
   app_Cons  "app (x#xs) ys = x#app xs ys"
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1819
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1820
\end{ttbox}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1821
But asserting axioms brings the danger of accidentally asserting an
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1822
inconsistency, as in \verb$app [] ys = us$.
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1823
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1824
The \ttindex{primrec} declaration is a safe means of defining primitive
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1825
recursive functions on datatypes:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1826
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1827
Append = MyList +
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1828
consts app :: ['a mylist, 'a mylist] => 'a mylist
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1829
primrec app MyList.mylist
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1830
   "app [] ys = ys"
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1831
   "app (x#xs) ys = x#app xs ys"
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1832
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1833
\end{ttbox}
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1834
Isabelle will now check that the two rules do indeed form a primitive
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1835
recursive definition, preserving consistency.  For example
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1836
\begin{ttbox}
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1837
primrec app MyList.mylist
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1838
    "app [] ys = us"
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1839
\end{ttbox}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1840
is rejected with an error message \texttt{Extra variables on rhs}.
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1841
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1842
\bigskip
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1843
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1844
The general form of a primitive recursive definition is
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1845
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1846
primrec {\it function} {\it type}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1847
    {\it reduction rules}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1848
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1849
where
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1850
\begin{itemize}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1851
\item \textit{function} is the name of the function, either as an \textit{id}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1852
  or a \textit{string}.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1853
\item \textit{type} is the name of the datatype, either as an \textit{id} or
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1854
  in the long form \texttt{$T$.$t$} ($T$ is the name of the theory
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1855
  where the datatype has been declared, $t$ the name of the datatype).
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1856
  The long form is required if the \texttt{datatype} and the {\tt
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1857
    primrec} sections are in different theories.
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1858
\item \textit{reduction rules} specify one or more equations of the form
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1859
  \[ f \, x@1 \, \dots \, x@m \, (C \, y@1 \, \dots \, y@k) \, z@1 \,
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1860
  \dots \, z@n = r \] such that $C$ is a constructor of the datatype,
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1861
  $r$ contains only the free variables on the left-hand side, and all
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1862
  recursive calls in $r$ are of the form $f \, \dots \, y@i \, \dots$
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1863
  for some $i$.  There must be exactly one reduction rule for each
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1864
  constructor.  The order is immaterial.  Also note that all reduction
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1865
  rules are added to the default simpset!
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1866
  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1867
  If you would like to refer to some rule by name, then you must prefix
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1868
  \emph{each} rule with an identifier.  These identifiers, like those in the
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1869
  \texttt{rules} section of a theory, will be visible at the \ML\ level.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1870
\end{itemize}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1871
2495
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1872
The primitive recursive function can have infix or mixfix syntax:
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1873
\begin{ttbox}\underscoreon
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1874
Append = MyList +
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1875
consts "@"  :: ['a mylist, 'a mylist] => 'a mylist  (infixr 60)
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1876
primrec "op @" MyList.mylist
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1877
   "[] @ ys = ys"
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1878
   "(x#xs) @ ys = x#(xs @ ys)"
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1879
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1880
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1881
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1882
The reduction rules for {\tt\at} become part of the default simpset, which
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1883
leads to short proofs:
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1884
\begin{ttbox}\underscoreon
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1885
goal Append.thy "(xs @ ys) @ zs = xs @ (ys @ zs)";
3045
4ef28e05781b Added 'induct_tac'
nipkow
parents: 2994
diff changeset
  1886
by (induct\_tac "xs" 1);
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1887
by (ALLGOALS Asm\_simp\_tac);
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1888
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1889
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1890
\index{recursion!primitive|)}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1891
\index{*primrec|)}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1892
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1893
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1894
\subsection{Well-founded recursive functions}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1895
\label{sec:HOL:recdef}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1896
\index{primitive recursion|(}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1897
\index{*recdef|(}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1898
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1899
Well-founded recursion can express any function whose termination can be
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1900
proved by showing that each recursive call makes the argument smaller in a
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1901
suitable sense.  The recursion need not involve datatypes and there are few
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1902
syntactic restrictions.  Nested recursion and pattern-matching are allowed.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1903
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1904
Here is a simple example, the Fibonacci function.  The first line declares
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1905
\texttt{fib} to be a constant.  The well-founded relation is simply~$<$ (on
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1906
the natural numbers).  Pattern-matching is used here: \texttt{1} is a
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1907
macro for \texttt{Suc~0}.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1908
\begin{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1909
consts fib  :: "nat => nat"
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1910
recdef fib "less_than"
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1911
    "fib 0 = 0"
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1912
    "fib 1 = 1"
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1913
    "fib (Suc(Suc x)) = (fib x + fib (Suc x))"
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1914
\end{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1915
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1916
The well-founded relation defines a notion of ``smaller'' for the function's
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1917
argument type.  The relation $\prec$ is \textbf{well-founded} provided it
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1918
admits no infinitely decreasing chains
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1919
\[ \cdots\prec x@n\prec\cdots\prec x@1. \]
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1920
If the function's argument has type~$\tau$, then $\prec$ should be a relation
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1921
over~$\tau$: it must have type $(\tau\times\tau)set$.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1922
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1923
Proving well-foundedness can be tricky, so {\HOL} provides a collection of
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1924
operators for building well-founded relations.  The package recognizes these
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1925
operators and automatically proves that the constructed relation is
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1926
well-founded.  Here are those operators, in order of importance:
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1927
\begin{itemize}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1928
\item \texttt{less_than} is ``less than'' on the natural numbers.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1929
  (It has type $(nat\times nat)set$, while $<$ has type $[nat,nat]\To bool$.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1930
  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1931
\item $\mathop{\mathtt{measure}} f$, where $f$ has type $\tau\To nat$, is the
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1932
  relation~$\prec$ on type~$\tau$ such that $x\prec y$ iff $f(x)<f(y)$.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1933
  Typically, $f$ takes the recursive function's arguments (as a tuple) and
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1934
  returns a result expressed in terms of the function \texttt{size}.  It is
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1935
  called a \textbf{measure function}.  Recall that \texttt{size} is overloaded
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1936
  and is defined on all datatypes (see \S\ref{sec:HOL:size}).
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1937
                                                    
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1938
\item $\mathop{\mathtt{inv_image}} f\;R$ is a generalization of
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1939
  \texttt{measure}.  It specifies a relation such that $x\prec y$ iff $f(x)$
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1940
  is less than $f(y)$ according to~$R$, which must itself be a well-founded
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1941
  relation.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1942
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1943
\item $R@1\texttt{**}R@2$ is the lexicographic product of two relations.  It
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1944
  is a relation on pairs and satisfies $(x@1,x@2)\prec(y@1,y@2)$ iff $x@1$
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1945
  is less than $y@1$ according to~$R@1$ or $x@1=y@1$ and $x@2$
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1946
  is less than $y@2$ according to~$R@2$.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1947
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1948
\item \texttt{finite_psubset} is the proper subset relation on finite sets.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1949
\end{itemize}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1950
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1951
We can use \texttt{measure} to declare Euclid's algorithm for the greatest
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1952
common divisor.  The measure function, $\lambda(m,n).n$, specifies that the
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1953
recursion terminates because argument~$n$ decreases.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1954
\begin{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1955
recdef gcd "measure ((\%(m,n).n) ::nat*nat=>nat)"
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1956
    "gcd (m, n) = (if n=0 then m else gcd(n, m mod n))"
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1957
\end{ttbox}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1958
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1959
The general form of a primitive recursive definition is
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1960
\begin{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1961
recdef {\it function} {\it rel}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1962
    congs   {\it congruence rules}      {\bf(optional)}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1963
    simpset {\it simplification set}      {\bf(optional)}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1964
   {\it reduction rules}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1965
\end{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1966
where
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1967
\begin{itemize}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1968
\item \textit{function} is the name of the function, either as an \textit{id}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1969
  or a \textit{string}.  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1970
  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1971
\item \textit{rel} is a {\HOL} expression for the well-founded termination
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1972
  relation.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1973
  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1974
\item \textit{congruence rules} are required only in highly exceptional
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1975
  circumstances.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1976
  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1977
\item the \textit{simplification set} is used to prove that the supplied
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1978
  relation is well-founded.  It is also used to prove the \textbf{termination
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1979
    conditions}: assertions that arguments of recursive calls decrease under
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1980
  \textit{rel}.  By default, simplification uses \texttt{!simpset}, which
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1981
  is sufficient to prove well-foundedness for the built-in relations listed
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1982
  above. 
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1983
  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1984
\item \textit{reduction rules} specify one or more recursion equations.  Each
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1985
  left-hand side must have the form $f\,t$, where $f$ is the function and $t$
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1986
  is a tuple of distinct variables.  If more than one equation is present then
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1987
  $f$ is defined by pattern-matching on components of its argument whose type
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1988
  is a \texttt{datatype}.  The patterns must be exhaustive and
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1989
  non-overlapping.  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1990
  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1991
  Unlike with \texttt{primrec}, the reduction rules are not added to the
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1992
  default simpset, and individual rules may not be labelled with identifiers.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1993
  However, the identifier $f$\texttt{.rules} is visible at the \ML\ level
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1994
  as a list of theorems.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1995
\end{itemize}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1996
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1997
With the definition of \texttt{gcd} shown above, Isabelle is unable to prove
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1998
one termination condition.  It remains as a precondition of the recursion
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1999
theorems.  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2000
\begin{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2001
gcd.rules;
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2002
{\out ["! m n. n ~= 0 --> m mod n < n}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2003
{\out   ==> gcd (?m, ?n) = (if ?n = 0 then ?m else gcd (?n, ?m mod ?n))"] }
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2004
{\out : thm list}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2005
\end{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2006
The theory \texttt{Primes} (on the examples directory \texttt{HOL/ex})
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2007
illustrates how to prove termination conditions afterwards.  The function
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2008
\texttt{Tfl.tgoalw} is like the standard function \texttt{goalw}, which sets
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2009
up a goal to prove, but its argument should be the identifier
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2010
$f$\texttt{.rules} and its effect is to set up a proof of the termination
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2011
conditions: 
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2012
\begin{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2013
Tfl.tgoalw thy [] gcd.rules;
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2014
{\out Level 0}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2015
{\out ! m n. n ~= 0 --> m mod n < n}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2016
{\out  1. ! m n. n ~= 0 --> m mod n < n}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2017
\end{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2018
This subgoal has a one-step proof using \texttt{simp_tac}.  Once the theorem
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2019
is proved, it can be used to eliminate the termination conditions from
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2020
elements of \texttt{gcd.rules}.  Theory \texttt{Unify} on directory
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2021
\texttt{HOL/Subst} is a much more complicated example of this process, where
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2022
the termination conditions can only be proved by complicated reasoning
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2023
involving the recursive function itself.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2024
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2025
Isabelle can prove the \texttt{gcd} function's termination condition
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2026
automatically if supplied with the right simpset.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2027
\begin{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2028
recdef gcd "measure ((\%(m,n).n) ::nat*nat=>nat)"
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2029
  simpset "!simpset addsimps [mod_less_divisor, zero_less_eq]"
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2030
    "gcd (m, n) = (if n=0 then m else gcd(n, m mod n))"
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2031
\end{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2032
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2033
A \texttt{recdef} definition also returns an induction rule specialized for
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2034
the recursive function.  For the \texttt{gcd} function above, the induction
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2035
rule is
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2036
\begin{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2037
gcd.induct;
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2038
{\out "(!!m n. n ~= 0 --> ?P n (m mod n) ==> ?P m n) ==> ?P ?u ?v" : thm}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2039
\end{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2040
This rule should be used to reason inductively about the \texttt{gcd}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2041
function.  It usually makes the induction hypothesis available at all
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2042
recursive calls, leading to very direct proofs.  If any termination
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2043
conditions remain unproved, they will be additional premises of this rule.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2044
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2045
\index{recursion!general|)}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2046
\index{*recdef|)}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2047
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2048
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2049
\section{Inductive and coinductive definitions}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2050
\index{*inductive|(}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2051
\index{*coinductive|(}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2052
2975
230f456956a2 Corrected the informal description of coinductive definition
paulson
parents: 2933
diff changeset
  2053
An {\bf inductive definition} specifies the least set~$R$ closed under given
230f456956a2 Corrected the informal description of coinductive definition
paulson
parents: 2933
diff changeset
  2054
rules.  (Applying a rule to elements of~$R$ yields a result within~$R$.)  For
230f456956a2 Corrected the informal description of coinductive definition
paulson
parents: 2933
diff changeset
  2055
example, a structural operational semantics is an inductive definition of an
230f456956a2 Corrected the informal description of coinductive definition
paulson
parents: 2933
diff changeset
  2056
evaluation relation.  Dually, a {\bf coinductive definition} specifies the
230f456956a2 Corrected the informal description of coinductive definition
paulson
parents: 2933
diff changeset
  2057
greatest set~$R$ consistent with given rules.  (Every element of~$R$ can be
230f456956a2 Corrected the informal description of coinductive definition
paulson
parents: 2933
diff changeset
  2058
seen as arising by applying a rule to elements of~$R$.)  An important example
230f456956a2 Corrected the informal description of coinductive definition
paulson
parents: 2933
diff changeset
  2059
is using bisimulation relations to formalize equivalence of processes and
230f456956a2 Corrected the informal description of coinductive definition
paulson
parents: 2933
diff changeset
  2060
infinite data structures.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2061
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2062
A theory file may contain any number of inductive and coinductive
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2063
definitions.  They may be intermixed with other declarations; in
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2064
particular, the (co)inductive sets {\bf must} be declared separately as
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2065
constants, and may have mixfix syntax or be subject to syntax translations.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2066
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2067
Each (co)inductive definition adds definitions to the theory and also
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  2068
proves some theorems.  Each definition creates an \ML\ structure, which is a
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2069
substructure of the main theory structure.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2070
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2071
This package is derived from the \ZF\ one, described in a separate
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2072
paper,%
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2073
\footnote{It appeared in CADE~\cite{paulson-CADE}; a longer version is
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2074
  distributed with Isabelle.}  %
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2075
which you should refer to in case of difficulties.  The package is simpler
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2076
than \ZF's thanks to \HOL's automatic type-checking.  The type of the
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2077
(co)inductive determines the domain of the fixedpoint definition, and the
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2078
package does not use inference rules for type-checking.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2079
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2080
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2081
\subsection{The result structure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2082
Many of the result structure's components have been discussed in the paper;
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2083
others are self-explanatory.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2084
\begin{description}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2085
\item[\tt thy] is the new theory containing the recursive sets.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2086
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2087
\item[\tt defs] is the list of definitions of the recursive sets.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2088
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2089
\item[\tt mono] is a monotonicity theorem for the fixedpoint operator.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2090
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2091
\item[\tt unfold] is a fixedpoint equation for the recursive set (the union of
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2092
the recursive sets, in the case of mutual recursion).
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2093
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2094
\item[\tt intrs] is the list of introduction rules, now proved as theorems, for
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2095
the recursive sets.  The rules are also available individually, using the
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2096
names given them in the theory file. 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2097
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2098
\item[\tt elim] is the elimination rule.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2099
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2100
\item[\tt mk_cases] is a function to create simplified instances of {\tt
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2101
elim}, using freeness reasoning on some underlying datatype.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2102
\end{description}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2103
2933
f842a75d9624 Updated discussion and references for inductive definitions
paulson
parents: 2926
diff changeset
  2104
For an inductive definition, the result structure contains two induction
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2105
rules, \texttt{induct} and \verb|mutual_induct|.  (To save storage, the latter
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2106
rule is just \texttt{True} unless more than one set is being defined.)  For a
2933
f842a75d9624 Updated discussion and references for inductive definitions
paulson
parents: 2926
diff changeset
  2107
coinductive definition, it contains the rule \verb|coinduct|.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2108
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2109
Figure~\ref{def-result-fig} summarizes the two result signatures,
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2110
specifying the types of all these components.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2111
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2112
\begin{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2113
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2114
sig
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2115
val thy          : theory
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2116
val defs         : thm list
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2117
val mono         : thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2118
val unfold       : thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2119
val intrs        : thm list
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2120
val elim         : thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2121
val mk_cases     : thm list -> string -> thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2122
{\it(Inductive definitions only)} 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2123
val induct       : thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2124
val mutual_induct: thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2125
{\it(Coinductive definitions only)}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2126
val coinduct    : thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2127
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2128
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2129
\hrule
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2130
\caption{The result of a (co)inductive definition} \label{def-result-fig}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2131
\end{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2132
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2133
\subsection{The syntax of a (co)inductive definition}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2134
An inductive definition has the form
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2135
\begin{ttbox}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2136
inductive    \textit{inductive sets}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2137
  intrs      \textit{introduction rules}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2138
  monos      \textit{monotonicity theorems}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2139
  con_defs   \textit{constructor definitions}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2140
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2141
A coinductive definition is identical, except that it starts with the keyword
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2142
{\tt coinductive}.  
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2143
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2144
The \texttt{monos} and \texttt{con_defs} sections are optional.  If present,
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2145
each is specified as a string, which must be a valid \ML{} expression
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2146
of type \texttt{thm list}.  It is simply inserted into the generated
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2147
\ML{} file that is generated from the theory definition; if it is
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2148
ill-formed, it will trigger ML error messages.  You can then inspect
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2149
the file on your directory.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2150
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2151
\begin{itemize}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2152
\item The \textit{inductive sets} are specified by one or more strings.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2153
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2154
\item The \textit{introduction rules} specify one or more introduction rules in
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2155
  the form \textit{ident\/}~\textit{string}, where the identifier gives the name of
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2156
  the rule in the result structure.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2157
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2158
\item The \textit{monotonicity theorems} are required for each operator
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2159
  applied to a recursive set in the introduction rules.  There {\bf must}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2160
  be a theorem of the form $A\subseteq B\Imp M(A)\subseteq M(B)$, for each
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2161
  premise $t\in M(R@i)$ in an introduction rule!
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2162
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2163
\item The \textit{constructor definitions} contain definitions of constants
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2164
  appearing in the introduction rules.  In most cases it can be omitted.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2165
\end{itemize}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2166
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2167
The package has a few notable restrictions:
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2168
\begin{itemize}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2169
\item The theory must separately declare the recursive sets as
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2170
  constants.
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2171
  
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2172
\item The names of the recursive sets must be alphanumeric
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2173
  identifiers.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2174
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2175
\item Side-conditions must not be conjunctions.  However, an introduction rule
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2176
may contain any number of side-conditions.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2177
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2178
\item Side-conditions of the form $x=t$, where the variable~$x$ does not
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2179
  occur in~$t$, will be substituted through the rule \verb|mutual_induct|.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2180
\end{itemize}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2181
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2182
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2183
\subsection{Example of an inductive definition}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2184
Two declarations, included in a theory file, define the finite powerset
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2185
operator.  First we declare the constant~{\tt Fin}.  Then we declare it
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2186
inductively, with two introduction rules:
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2187
\begin{ttbox}
1389
fbe857ddc80d removed quotes from consts and syntax sections
clasohm
parents: 1234
diff changeset
  2188
consts Fin :: 'a set => 'a set set
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2189
inductive "Fin A"
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2190
  intrs
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2191
    emptyI  "{\ttlbrace}{\ttrbrace} : Fin A"
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2192
    insertI "[| a: A;  b: Fin A |] ==> insert a b : Fin A"
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2193
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2194
The resulting theory structure contains a substructure, called~{\tt Fin}.
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2195
It contains the \texttt{Fin}$~A$ introduction rules as the list \texttt{Fin.intrs},
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2196
and also individually as \texttt{Fin.emptyI} and \texttt{Fin.consI}.  The induction
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2197
rule is \texttt{Fin.induct}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2198
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2199
For another example, here is a theory file defining the accessible
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2200
part of a relation.  The main thing to note is the use of~{\tt Pow} in
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2201
the sole introduction rule, and the corresponding mention of the rule
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2202
\verb|Pow_mono| in the \texttt{monos} list.  The paper
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2203
\cite{paulson-CADE} discusses a \ZF\ version of this example in more
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2204
detail.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2205
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2206
Acc = WF + 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2207
consts pred :: "['b, ('a * 'b)set] => 'a set"   (*Set of predecessors*)
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2208
       acc  :: "('a * 'a)set => 'a set"         (*Accessible part*)
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2209
defs   pred_def  "pred x r == {y. (y,x):r}"
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2210
inductive "acc r"
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2211
  intrs
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2212
     pred "pred a r: Pow(acc r) ==> a: acc r"
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2213
  monos   "[Pow_mono]"
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2214
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2215
\end{ttbox}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2216
The \HOL{} distribution contains many other inductive definitions.
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2217
Simple examples are collected on subdirectory \texttt{Induct}.  The
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2218
theory \texttt{HOL/Induct/LList.thy} contains coinductive definitions.
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2219
Larger examples may be found on other subdirectories, such as {\tt
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2220
  IMP}, \texttt{Lambda} and \texttt{Auth}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2221
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2222
\index{*coinductive|)} \index{*inductive|)}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2223
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2224
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2225
\section{The examples directories}
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2226
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2227
Directory \texttt{HOL/Auth} contains theories for proving the correctness of 
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2228
cryptographic protocols.  The approach is based upon operational 
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2229
semantics~\cite{paulson-security} rather than the more usual belief logics.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2230
On the same directory are proofs for some standard examples, such as the 
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2231
Needham-Schroeder public-key authentication protocol~\cite{paulson-ns} 
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2232
and the Otway-Rees protocol.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2233
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2234
Directory \texttt{HOL/IMP} contains a formalization of various denotational,
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2235
operational and axiomatic semantics of a simple while-language, the necessary
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2236
equivalence proofs, soundness and completeness of the Hoare rules with respect
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2237
to the 
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2238
denotational semantics, and soundness and completeness of a verification
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2239
condition generator.  Much of development is taken from
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2240
Winskel~\cite{winskel93}.  For details see~\cite{nipkow-IMP}.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2241
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2242
Directory \texttt{HOL/Hoare} contains a user friendly surface syntax for Hoare
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2243
logic, including a tactic for generating verification-conditions.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2244
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2245
Directory \texttt{HOL/MiniML} contains a formalization of the type system of the
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2246
core functional language Mini-ML and a correctness proof for its type
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2247
inference algorithm $\cal W$~\cite{milner78,nazareth-nipkow}.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2248
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2249
Directory \texttt{HOL/Lambda} contains a formalization of untyped
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2250
$\lambda$-calculus in de~Bruijn notation and Church-Rosser proofs for $\beta$
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2251
and $\eta$ reduction~\cite{Nipkow-CR}.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2252
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2253
Directory \texttt{HOL/Subst} contains Martin Coen's mechanization of a theory of
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2254
substitutions and unifiers.  It is based on Paulson's previous
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2255
mechanisation in {\LCF}~\cite{paulson85} of Manna and Waldinger's
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2256
theory~\cite{mw81}.  It demonstrates a complicated use of \texttt{recdef},
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2257
with nested recursion.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2258
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2259
Directory \texttt{HOL/Induct} presents simple examples of (co)inductive
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2260
definitions.  
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2261
\begin{itemize}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2262
\item Theory \texttt{PropLog} proves the soundness and completeness of
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2263
  classical propositional logic, given a truth table semantics.  The only
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2264
  connective is $\imp$.  A Hilbert-style axiom system is specified, and its
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2265
  set of theorems defined inductively.  A similar proof in \ZF{} is
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2266
  described elsewhere~\cite{paulson-set-II}.
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2267
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2268
\item Theory \texttt{Term} develops an experimental recursive type definition;
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2269
  the recursion goes through the type constructor~\tydx{list}.
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2270
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2271
\item Theory \texttt{Simult} constructs mutually recursive sets of trees and
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2272
  forests, including induction and recursion rules.
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2273
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2274
\item The definition of lazy lists demonstrates methods for handling
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2275
  infinite data structures and coinduction in higher-order
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2276
  logic~\cite{paulson-coind}.%
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2277
\footnote{To be precise, these lists are \emph{potentially infinite} rather
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2278
  than lazy.  Lazy implies a particular operational semantics.}
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2279
  Theory \thydx{LList} defines an operator for
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2280
  corecursion on lazy lists, which is used to define a few simple functions
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2281
  such as map and append.   A coinduction principle is defined
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2282
  for proving equations on lazy lists.
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2283
  
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2284
\item Theory \thydx{LFilter} defines the filter functional for lazy lists.
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2285
  This functional is notoriously difficult to define because finding the next
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2286
  element meeting the predicate requires possibly unlimited search.  It is not
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2287
  computable, but can be expressed using a combination of induction and
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2288
  corecursion.  
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2289
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2290
\item Theory \thydx{Exp} illustrates the use of iterated inductive definitions
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2291
  to express a programming language semantics that appears to require mutual
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2292
  induction.  Iterated induction allows greater modularity.
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2293
\end{itemize}
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2294
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2295
Directory \texttt{HOL/ex} contains other examples and experimental proofs in
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2296
{\HOL}.  
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2297
\begin{itemize}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2298
\item Theory \texttt{Recdef} presents many examples of using \texttt{recdef}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2299
  to define recursive functions.  Another example is \texttt{Fib}, which
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2300
  defines the Fibonacci function.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2301
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2302
\item Theory \texttt{Primes} defines the Greatest Common Divisor of two
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2303
  natural numbers and proves a key lemma of the Fundamental Theorem of
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2304
  Arithmetic: if $p$ is prime and $p$ divides $m\times n$ then $p$ divides~$m$
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2305
  or $p$ divides~$n$.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2306
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2307
\item Theory \texttt{Primrec} develops some computation theory.  It
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2308
  inductively defines the set of primitive recursive functions and presents a
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2309
  proof that Ackermann's function is not primitive recursive.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2310
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2311
\item File \texttt{cla.ML} demonstrates the classical reasoner on over sixty
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2312
  predicate calculus theorems, ranging from simple tautologies to
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2313
  moderately difficult problems involving equality and quantifiers.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2314
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2315
\item File \texttt{meson.ML} contains an experimental implementation of the {\sc
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2316
    meson} proof procedure, inspired by Plaisted~\cite{plaisted90}.  It is
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2317
  much more powerful than Isabelle's classical reasoner.  But it is less
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2318
  useful in practice because it works only for pure logic; it does not
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2319
  accept derived rules for the set theory primitives, for example.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2320
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2321
\item File \texttt{mesontest.ML} contains test data for the {\sc meson} proof
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2322
  procedure.  These are mostly taken from Pelletier \cite{pelletier86}.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2323
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2324
\item File \texttt{set.ML} proves Cantor's Theorem, which is presented in
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
  2325
  \S\ref{sec:hol-cantor} below, and the Schr\"oder-Bernstein Theorem.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2326
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2327
\item Theory \texttt{MT} contains Jacob Frost's formalization~\cite{frost93} of
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2328
  Milner and Tofte's coinduction example~\cite{milner-coind}.  This
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2329
  substantial proof concerns the soundness of a type system for a simple
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2330
  functional language.  The semantics of recursion is given by a cyclic
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2331
  environment, which makes a coinductive argument appropriate.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2332
\end{itemize}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2333
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2334
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2335
\goodbreak
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
  2336
\section{Example: Cantor's Theorem}\label{sec:hol-cantor}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2337
Cantor's Theorem states that every set has more subsets than it has
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2338
elements.  It has become a favourite example in higher-order logic since
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2339
it is so easily expressed:
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2340
\[  \forall f::\alpha \To \alpha \To bool. \exists S::\alpha\To bool.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2341
    \forall x::\alpha. f~x \not= S 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2342
\] 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2343
%
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2344
Viewing types as sets, $\alpha\To bool$ represents the powerset
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2345
of~$\alpha$.  This version states that for every function from $\alpha$ to
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2346
its powerset, some subset is outside its range.  
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2347
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
  2348
The Isabelle proof uses \HOL's set theory, with the type $\alpha\,set$ and
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2349
the operator \cdx{range}.  The set~$S$ is given as an unknown instead of a
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2350
quantified variable so that we may inspect the subset found by the proof.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2351
\begin{ttbox}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2352
goal Set.thy "?S ~: range\thinspace(f :: 'a=>'a set)";
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2353
{\out Level 0}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2354
{\out ?S ~: range f}
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2355
{\out  1. ?S ~: range f}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2356
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2357
The first two steps are routine.  The rule \tdx{rangeE} replaces
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2358
$\Var{S}\in \texttt{range} \, f$ by $\Var{S}=f~x$ for some~$x$.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2359
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2360
by (resolve_tac [notI] 1);
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2361
{\out Level 1}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2362
{\out ?S ~: range f}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2363
{\out  1. ?S : range f ==> False}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2364
\ttbreak
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2365
by (eresolve_tac [rangeE] 1);
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2366
{\out Level 2}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2367
{\out ?S ~: range f}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2368
{\out  1. !!x. ?S = f x ==> False}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2369
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2370
Next, we apply \tdx{equalityCE}, reasoning that since $\Var{S}=f~x$,
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2371
we have $\Var{c}\in \Var{S}$ if and only if $\Var{c}\in f~x$ for
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2372
any~$\Var{c}$.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2373
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2374
by (eresolve_tac [equalityCE] 1);
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2375
{\out Level 3}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2376
{\out ?S ~: range f}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2377
{\out  1. !!x. [| ?c3 x : ?S; ?c3 x : f x |] ==> False}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2378
{\out  2. !!x. [| ?c3 x ~: ?S; ?c3 x ~: f x |] ==> False}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2379
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2380
Now we use a bit of creativity.  Suppose that~$\Var{S}$ has the form of a
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2381
comprehension.  Then $\Var{c}\in\{x.\Var{P}~x\}$ implies
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2382
$\Var{P}~\Var{c}$.   Destruct-resolution using \tdx{CollectD}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2383
instantiates~$\Var{S}$ and creates the new assumption.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2384
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2385
by (dresolve_tac [CollectD] 1);
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2386
{\out Level 4}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2387
{\out {\ttlbrace}x. ?P7 x{\ttrbrace} ~: range f}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2388
{\out  1. !!x. [| ?c3 x : f x; ?P7(?c3 x) |] ==> False}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2389
{\out  2. !!x. [| ?c3 x ~: {\ttlbrace}x. ?P7 x{\ttrbrace}; ?c3 x ~: f x |] ==> False}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2390
\end{ttbox}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2391
Forcing a contradiction between the two assumptions of subgoal~1
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2392
completes the instantiation of~$S$.  It is now the set $\{x. x\not\in
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2393
f~x\}$, which is the standard diagonal construction.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2394
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2395
by (contr_tac 1);
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2396
{\out Level 5}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2397
{\out {\ttlbrace}x. x ~: f x{\ttrbrace} ~: range f}
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2398
{\out  1. !!x. [| x ~: {\ttlbrace}x. x ~: f x{\ttrbrace}; x ~: f x |] ==> False}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2399
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2400
The rest should be easy.  To apply \tdx{CollectI} to the negated
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2401
assumption, we employ \ttindex{swap_res_tac}:
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2402
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2403
by (swap_res_tac [CollectI] 1);
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2404
{\out Level 6}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2405
{\out {\ttlbrace}x. x ~: f x{\ttrbrace} ~: range f}
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2406
{\out  1. !!x. [| x ~: f x; ~ False |] ==> x ~: f x}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2407
\ttbreak
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2408
by (assume_tac 1);
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2409
{\out Level 7}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2410
{\out {\ttlbrace}x. x ~: f x{\ttrbrace} ~: range f}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2411
{\out No subgoals!}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2412
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2413
How much creativity is required?  As it happens, Isabelle can prove this
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2414
theorem automatically.  The default classical set {\tt!claset} contains rules
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
  2415
for most of the constructs of \HOL's set theory.  We must augment it with
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2416
\tdx{equalityCE} to break up set equalities, and then apply best-first
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2417
search.  Depth-first search would diverge, but best-first search
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2418
successfully navigates through the large search space.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2419
\index{search!best-first}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2420
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2421
choplev 0;
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2422
{\out Level 0}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2423
{\out ?S ~: range f}
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2424
{\out  1. ?S ~: range f}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2425
\ttbreak
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2426
by (best_tac (!claset addSEs [equalityCE]) 1);
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2427
{\out Level 1}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2428
{\out {\ttlbrace}x. x ~: f x{\ttrbrace} ~: range f}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2429
{\out No subgoals!}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2430
\end{ttbox}
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2431
If you run this example interactively, make sure your current theory contains
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2432
theory \texttt{Set}, for example by executing
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2433
\ttindex{set_current_thy}~{\tt"Set"}.  Otherwise the default claset may not
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2434
contain the rules for set theory.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2435
\index{higher-order logic|)}