doc-src/Logics/HOL.tex
author wenzelm
Thu, 18 Jun 1998 18:35:07 +0200
changeset 5052 bbe3584b515b
parent 4877 7a046198610e
child 5151 1e944fe5ce96
permissions -rw-r--r--
fixed comment;
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
3959
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   263
of most other operations.  For example, instead of $f~x = {\tt if\dots
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   264
then\dots else}\dots$ you need to write $f~x = ({\tt if\dots then\dots
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   265
else\dots})$.
2926
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
4834
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   417
\tdx{split_if}        P(if Q then x else y) = ((Q --> P x) & (~Q --> P y))
1113
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
4834
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   759
%The predicate \cdx{inj_on} is used for simulating type definitions.
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   760
%The statement ${\tt inj_on}~f~A$ asserts that $f$ is injective on the
2926
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
%
4834
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   781
%\tdx{inj_onI}  (!!x y. [| f x=f y; x:A; y:A |] ==> x=y) ==> inj_on f A
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   782
%\tdx{inj_onD}  [| inj_on f A;  f x=f y;  x:A;  y:A |] ==> x=y
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
   783
%
4834
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   784
%\tdx{inj_on_inverseI}
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   785
%    (!!x. x:A ==> g(f x) = x) ==> inj_on f A
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   786
%\tdx{inj_on_contraD}
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   787
%    [| inj_on f A;  x~=y;  x:A;  y:A |] ==> ~ f x=f y
2926
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 \\
4834
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   874
  \cdx{inj_on}        & $[\alpha\To\beta ,\alpha\,set]\To bool$
2926
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}
4834
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   882
\tdx{inj_def}         inj f      == ! x y. f x=f y --> x=y
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   883
\tdx{surj_def}        surj f     == ! y. ? x. y=f x
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   884
\tdx{inj_on_def}      inj_on f A == !x:A. !y:A. f x=f y --> x=y
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   885
\tdx{inv_def}         inv f      == (\%y. @x. f(x)=y)
2926
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
4877
7a046198610e fixed simpset(), claset();
wenzelm
parents: 4834
diff changeset
   910
({\tt simpset()}), which works for most purposes.  A quite minimal
3152
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
3959
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   945
\subsubsection{Case splitting}
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   946
\label{subsec:HOL:case:splitting}
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   947
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   948
\HOL{} also provides convenient means for case splitting during
4834
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   949
rewriting. Goals containing a subterm of the form {\tt if}~$b$~{\tt
3959
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   950
then\dots else\dots} often require a case distinction on $b$. This is
4834
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   951
expressed by the theorem \tdx{split_if}:
3959
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   952
$$
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   953
\Var{P}(\mbox{\tt if}~\Var{b}~{\tt then}~\Var{x}~\mbox{\tt else}~\Var{y})~=~
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   954
((\Var{b} \to \Var{P}(\Var{x})) \land (\neg \Var{b} \to \Var{P}(\Var{y})))
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   955
\eqno{(*)}
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   956
$$
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   957
For example, a simple instance of $(*)$ is
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   958
\[
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   959
x \in (\mbox{\tt if}~x \in A~{\tt then}~A~\mbox{\tt else}~\{x\})~=~
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   960
((x \in A \to x \in A) \land (x \notin A \to x \in \{x\}))
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   961
\]
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   962
Because $(*)$ is too general as a rewrite rule for the simplifier (the
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   963
left-hand side is not a higher-order pattern in the sense of
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   964
\iflabelundefined{chap:simplification}{the {\em Reference Manual\/}}%
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   965
{Chap.\ts\ref{chap:simplification}}), there is a special infix function 
4834
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   966
\ttindexbold{addsplits} of type \texttt{simpset * thm list -> simpset}
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   967
(analogous to \texttt{addsimps}) that adds rules such as $(*)$ to a
3959
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   968
simpset, as in
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   969
\begin{ttbox}
4877
7a046198610e fixed simpset(), claset();
wenzelm
parents: 4834
diff changeset
   970
by(simp_tac (simpset() addsplits [split_if]) 1);
3959
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   971
\end{ttbox}
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   972
The effect is that after each round of simplification, one occurrence of
4834
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   973
\texttt{if} is split acording to \texttt{split_if}, until all occurences of
3959
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   974
\texttt{if} have been eliminated.
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   975
4834
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   976
It turns out that using \texttt{split_if} is almost always the right thing to
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   977
do. Hence \texttt{split_if} is already included in the default simpset. If
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   978
you want to delete it from a simpset, use \ttindexbold{delsplits}, which is
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   979
the inverse of \texttt{addsplits}:
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   980
\begin{ttbox}
4877
7a046198610e fixed simpset(), claset();
wenzelm
parents: 4834
diff changeset
   981
by(simp_tac (simpset() delsplits [split_if]) 1);
4834
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   982
\end{ttbox}
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   983
3959
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   984
In general, \texttt{addsplits} accepts rules of the form
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   985
\[
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   986
\Var{P}(c~\Var{x@1}~\dots~\Var{x@n})~=~ rhs
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   987
\]
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   988
where $c$ is a constant and $rhs$ is arbitrary. Note that $(*)$ is of the
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   989
right form because internally the left-hand side is
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   990
$\Var{P}(\mathtt{If}~\Var{b}~\Var{x}~~\Var{y})$. Important further examples
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   991
are splitting rules for \texttt{case} expressions (see~\S\ref{subsec:list}
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
   992
and~\S\ref{subsec:datatype:basics}).
1489
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
   993
4834
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   994
Analogous to \texttt{Addsimps} and \texttt{Delsimps}, there are also
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   995
imperative versions of \texttt{addsplits} and \texttt{delsplits}
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   996
\begin{ttbox}
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   997
\ttindexbold{Addsplits}: thm list -> unit
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   998
\ttindexbold{Delsplits}: thm list -> unit
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
   999
\end{ttbox}
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
  1000
for adding splitting rules to, and deleting them from the current simpset.
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
  1001
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1002
\subsection{Classical reasoning}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1003
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
  1004
\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
  1005
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
  1006
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
  1007
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1008
The classical reasoner is installed.  Tactics such as \texttt{Blast_tac} and {\tt
4877
7a046198610e fixed simpset(), claset();
wenzelm
parents: 4834
diff changeset
  1009
Best_tac} refer to the default claset ({\tt claset()}), which works for most
2495
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1010
purposes.  Named clasets include \ttindexbold{prop_cs}, which includes the
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1011
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
  1012
rules.  See the file \texttt{HOL/cladata.ML} for lists of the classical rules,
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1013
and \iflabelundefined{chap:classical}{the {\em Reference Manual\/}}%
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1014
{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
  1015
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1016
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1017
\section{Types}\label{sec:HOL:Types}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1018
This section describes \HOL's basic predefined types ($\alpha \times
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1019
\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
  1020
introducing new types in general.  The most important type
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1021
construction, the \texttt{datatype}, is treated separately in
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1022
\S\ref{sec:HOL:datatype}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1023
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1024
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1025
\subsection{Product and sum types}\index{*"* type}\index{*"+ type}
2994
3bb5d1b9c3aa Tuple patterns are allowed now in `case'
nipkow
parents: 2975
diff changeset
  1026
\label{subsec:prod-sum}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1027
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1028
\begin{figure}[htbp]
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1029
\begin{constants}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1030
  \it symbol    & \it meta-type &           & \it description \\ 
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1031
  \cdx{Pair}    & $[\alpha,\beta]\To \alpha\times\beta$
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1032
        & & ordered pairs $(a,b)$ \\
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1033
  \cdx{fst}     & $\alpha\times\beta \To \alpha$        & & first projection\\
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1034
  \cdx{snd}     & $\alpha\times\beta \To \beta$         & & second projection\\
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1035
  \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
  1036
        & & generalized projection\\
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1037
  \cdx{Sigma}  & 
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1038
        $[\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
  1039
        & general sum of sets
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1040
\end{constants}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1041
\begin{ttbox}\makeatletter
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1042
%\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
  1043
%\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
  1044
%\tdx{split_def}    split c p == c (fst p) (snd p)
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1045
\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
  1046
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1047
\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
  1048
\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
  1049
\tdx{PairE}        [| !!x y. p = (x,y) ==> Q |] ==> Q
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1050
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1051
\tdx{fst_conv}     fst (a,b) = a
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1052
\tdx{snd_conv}     snd (a,b) = b
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1053
\tdx{surjective_pairing}  p = (fst p,snd p)
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1054
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1055
\tdx{split}        split c (a,b) = c a b
4834
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
  1056
\tdx{split_split}  R(split c p) = (! x y. p = (x,y) --> R(c x y))
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1057
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  1058
\tdx{SigmaI}    [| a:A;  b:B a |] ==> (a,b) : Sigma A B
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  1059
\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
  1060
\end{ttbox}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1061
\caption{Type $\alpha\times\beta$}\label{hol-prod}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1062
\end{figure} 
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1063
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1064
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
  1065
$\alpha\times\beta$, with the ordered pair syntax $(a, b)$.  General
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1066
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
  1067
\begin{center}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1068
\begin{tabular}{|c|c|}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1069
\hline
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1070
external & internal \\
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1071
\hline
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1072
$\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
  1073
\hline
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1074
$(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
  1075
\hline
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1076
\end{tabular}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1077
\end{center}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1078
In addition, it is possible to use tuples
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1079
as patterns in abstractions:
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1080
\begin{center}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1081
{\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
  1082
\end{center}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1083
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
  1084
{\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
  1085
{\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
  1086
  $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
  1087
\begin{warn}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1088
  The translation between patterns and \texttt{split} is performed automatically
1448
77379ae9ff0d Stylistic changes to discussion of pattern-matching
paulson
parents: 1429
diff changeset
  1089
  by the parser and printer.  Thus the internal and external form of a term
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1090
  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
  1091
  (\%(x,y).(y,x))(a,b)} requires the theorem \texttt{split} (which is in the
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1092
  default simpset) to rewrite to {\tt(b,a)}.
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1093
\end{warn}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1094
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
  1095
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
  1096
$\lambda$-abstraction.  Some important examples are
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1097
\begin{description}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1098
\item[Let:] \texttt{let {\it pattern} = $t$ in $u$}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1099
\item[Quantifiers:] \texttt{!~{\it pattern}:$A$.~$P$}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1100
\item[Choice:] {\underscoreon \tt @~{\it pattern}~.~$P$}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1101
\item[Set operations:] \texttt{UN~{\it pattern}:$A$.~$B$}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1102
\item[Sets:] \texttt{{\ttlbrace}~{\it pattern}~.~$P$~{\ttrbrace}}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1103
\end{description}
1471
b088c0a1f2bd documented split_all_tac in HOL.
nipkow
parents: 1448
diff changeset
  1104
b088c0a1f2bd documented split_all_tac in HOL.
nipkow
parents: 1448
diff changeset
  1105
There is a simple tactic which supports reasoning about patterns:
b088c0a1f2bd documented split_all_tac in HOL.
nipkow
parents: 1448
diff changeset
  1106
\begin{ttdescription}
b088c0a1f2bd documented split_all_tac in HOL.
nipkow
parents: 1448
diff changeset
  1107
\item[\ttindexbold{split_all_tac} $i$] replaces in subgoal $i$ all
b088c0a1f2bd documented split_all_tac in HOL.
nipkow
parents: 1448
diff changeset
  1108
  {\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
  1109
  each component.  A simple example:
1471
b088c0a1f2bd documented split_all_tac in HOL.
nipkow
parents: 1448
diff changeset
  1110
\begin{ttbox}
b088c0a1f2bd documented split_all_tac in HOL.
nipkow
parents: 1448
diff changeset
  1111
{\out 1. !!p. (\%(x,y,z). (x, y, z)) p = p}
b088c0a1f2bd documented split_all_tac in HOL.
nipkow
parents: 1448
diff changeset
  1112
by(split_all_tac 1);
b088c0a1f2bd documented split_all_tac in HOL.
nipkow
parents: 1448
diff changeset
  1113
{\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
  1114
\end{ttbox}
b088c0a1f2bd documented split_all_tac in HOL.
nipkow
parents: 1448
diff changeset
  1115
\end{ttdescription}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1116
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1117
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
  1118
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
  1119
\begin{ttbox}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1120
\tdx{unit_eq}       u = ()
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1121
\end{ttbox}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1122
\bigskip
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1123
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1124
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
  1125
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
  1126
\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
  1127
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1128
The definition of products and sums in terms of existing types is not
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1129
shown.  The constructions are fairly standard and can be found in the
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1130
respective theory files.
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1131
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1132
\begin{figure}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1133
\begin{constants}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1134
  \it symbol    & \it meta-type &           & \it description \\ 
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1135
  \cdx{Inl}     & $\alpha \To \alpha+\beta$    & & first injection\\
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1136
  \cdx{Inr}     & $\beta \To \alpha+\beta$     & & second injection\\
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1137
  \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
  1138
        & & conditional
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1139
\end{constants}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1140
\begin{ttbox}\makeatletter
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1141
%\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
  1142
%                                        (!y. p=Inr y --> z=g y))
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1143
%
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1144
\tdx{Inl_not_Inr}    Inl a ~= Inr b
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1145
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1146
\tdx{inj_Inl}        inj Inl
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1147
\tdx{inj_Inr}        inj Inr
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1148
1489
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
  1149
\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
  1150
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1151
\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
  1152
\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
  1153
1489
78e1ce42a825 Small changes.
nipkow
parents: 1471
diff changeset
  1154
\tdx{surjective_sum} sum_case (\%x. f(Inl x)) (\%y. f(Inr y)) s = f s
4834
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
  1155
\tdx{split_sum_case} R(sum_case f g s) = ((! x. s = Inl(x) --> R(f(x))) &
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1156
                                     (! y. s = Inr(y) --> R(g(y))))
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1157
\end{ttbox}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1158
\caption{Type $\alpha+\beta$}\label{hol-sum}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1159
\end{figure}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1160
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1161
\begin{figure}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1162
\index{*"< symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1163
\index{*"* symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1164
\index{*div symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1165
\index{*mod symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1166
\index{*"+ symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1167
\index{*"- symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1168
\begin{constants}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1169
  \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
  1170
  \cdx{0}       & $nat$         & & zero \\
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1171
  \cdx{Suc}     & $nat \To nat$ & & successor function\\
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1172
% \cdx{nat_case} & $[\alpha, nat\To\alpha, nat] \To\alpha$ & & conditional\\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1173
% \cdx{nat_rec} & $[nat, \alpha, [nat, \alpha]\To\alpha] \To \alpha$
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1174
%        & & primitive recursor\\
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1175
  \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
  1176
  \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
  1177
  \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
  1178
  \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
  1179
  \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
  1180
\end{constants}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1181
\subcaption{Constants and infixes}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1182
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1183
\begin{ttbox}\makeatother
3045
4ef28e05781b Added 'induct_tac'
nipkow
parents: 2994
diff changeset
  1184
\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
  1185
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1186
\tdx{Suc_not_Zero}   Suc m ~= 0
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1187
\tdx{inj_Suc}        inj Suc
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1188
\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
  1189
\subcaption{Basic properties}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1190
\end{ttbox}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1191
\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
  1192
\end{figure}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1193
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1194
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1195
\begin{figure}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1196
\begin{ttbox}\makeatother
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1197
              0+n           = n
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1198
              (Suc m)+n     = Suc(m+n)
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1199
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1200
              m-0           = m
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1201
              0-n           = n
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1202
              Suc(m)-Suc(n) = m-n
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1203
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1204
              0*n           = 0
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1205
              Suc(m)*n      = n + m*n
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1206
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1207
\tdx{mod_less}      m<n ==> m mod n = m
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1208
\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
  1209
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1210
\tdx{div_less}      m<n ==> m div n = 0
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1211
\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
  1212
\end{ttbox}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1213
\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
  1214
\end{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1215
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1216
\subsection{The type of natural numbers, \textit{nat}}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1217
\index{nat@{\textit{nat}} type|(}
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
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
  1220
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
  1221
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
  1222
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
  1223
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
  1224
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
  1225
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1226
Type~\tydx{nat} is an instance of class~\cldx{ord}, which makes the
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1227
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
  1228
\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
  1229
\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
  1230
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
  1231
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1232
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
  1233
addition, multiplication and subtraction.  Theory \thydx{Divides} defines
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1234
division, remainder and the ``divides'' relation.  The numerous theorems
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1235
proved include commutative, associative, distributive, identity and
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1236
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
  1237
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
  1238
\texttt{nat} are part of the default simpset.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1239
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1240
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
  1241
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
  1242
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
  1243
the standard convention.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1244
\begin{ttbox}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1245
\sdx{primrec} "op +" nat 
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1246
  "    0 + n = n"
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1247
  "Suc m + n = Suc(m + n)"
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1248
\end{ttbox}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1249
There is also a \sdx{case}-construct
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1250
of the form
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1251
\begin{ttbox}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1252
case \(e\) of 0 => \(a\) | Suc \(m\) => \(b\)
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1253
\end{ttbox}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1254
Note that Isabelle insists on precisely this format; you may not even change
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1255
the order of the two cases.
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1256
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
  1257
\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
  1258
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1259
%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
  1260
%Recursion along this relation resembles primitive recursion, but is
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1261
%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
  1262
%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
  1263
%is not primitive recursive \cite[page~104]{thompson91}.
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1264
%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
  1265
%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
  1266
3045
4ef28e05781b Added 'induct_tac'
nipkow
parents: 2994
diff changeset
  1267
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
  1268
in subgoal~$i$ using theorem \texttt{nat_induct}.  There is also the derived
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1269
theorem \tdx{less_induct}:
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1270
\begin{ttbox}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1271
[| !!n. [| ! m. m<n --> P m |] ==> P n |]  ==>  P n
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1272
\end{ttbox}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1273
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1274
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1275
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
  1276
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
  1277
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
  1278
{\tt 0}, \texttt{Suc}, {\tt<} and {\tt<=}.  The following goals are all solved by
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1279
{\tt trans_tac 1}:
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1280
\begin{ttbox}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1281
{\out  1. \dots ==> m <= Suc(Suc m)}
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1282
{\out  1. [| \dots i <= j \dots Suc j <= k \dots |] ==> i < k}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1283
{\out  1. [| \dots Suc m <= n \dots ~ m < n \dots |] ==> \dots}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1284
\end{ttbox}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1285
For a complete description of the limitations of the tactic and how to avoid
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1286
some of them, see the comments at the start of the file {\tt
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1287
Provers/nat_transitive.ML}.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1288
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1289
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
  1290
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
  1291
{\tt<=}, the theory \texttt{Arith} contains theorems about \texttt{+},
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1292
\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
  1293
\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
  1294
(see the {\em Reference Manual\/}).
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1295
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1296
\begin{figure}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1297
\index{#@{\tt[]} symbol}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1298
\index{#@{\tt\#} symbol}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1299
\index{"@@{\tt\at} symbol}
4503
5ed72705c201 nth -> !
nipkow
parents: 4068
diff changeset
  1300
\index{*"! symbol}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1301
\begin{constants}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1302
  \it symbol & \it meta-type & \it priority & \it description \\
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1303
  \tt[]    & $\alpha\,list$ & & empty list\\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1304
  \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
  1305
        list constructor \\
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1306
  \cdx{null}    & $\alpha\,list \To bool$ & & emptiness test\\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1307
  \cdx{hd}      & $\alpha\,list \To \alpha$ & & head \\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1308
  \cdx{tl}      & $\alpha\,list \To \alpha\,list$ & & tail \\
3881
73be08b4da3f Added last, butlast, dropped ttl.
nipkow
parents: 3489
diff changeset
  1309
  \cdx{last}    & $\alpha\,list \To \alpha$ & & last element \\
73be08b4da3f Added last, butlast, dropped ttl.
nipkow
parents: 3489
diff changeset
  1310
  \cdx{butlast} & $\alpha\,list \To \alpha\,list$ & & drop last element \\
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1311
  \tt\at  & $[\alpha\,list,\alpha\,list]\To \alpha\,list$ & Left 65 & append \\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1312
  \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
  1313
        & & apply to all\\
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1314
  \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
  1315
        & & filter functional\\
3487
62a6a08471e4 set_of_list -> set
nipkow
parents: 3315
diff changeset
  1316
  \cdx{set}& $\alpha\,list \To \alpha\,set$ & & elements\\
4503
5ed72705c201 nth -> !
nipkow
parents: 4068
diff changeset
  1317
  \sdx{mem}  & $\alpha \To \alpha\,list \To bool$  &  Left 55   & membership\\
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1318
  \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
  1319
  & iteration \\
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1320
  \cdx{concat}   & $(\alpha\,list)list\To \alpha\,list$ & & concatenation \\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1321
  \cdx{rev}     & $\alpha\,list \To \alpha\,list$ & & reverse \\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1322
  \cdx{length}  & $\alpha\,list \To nat$ & & length \\
4503
5ed72705c201 nth -> !
nipkow
parents: 4068
diff changeset
  1323
  \tt! & $\alpha\,list \To nat \To \alpha$ & Left 100 & indexing \\
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1324
  \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
  1325
    take or drop a prefix \\
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1326
  \cdx{takeWhile},\\
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1327
  \cdx{dropWhile} &
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1328
    $(\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
  1329
    take or drop a prefix
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1330
\end{constants}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1331
\subcaption{Constants and infixes}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1332
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1333
\begin{center} \tt\frenchspacing
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1334
\begin{tabular}{rrr} 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1335
  \it external        & \it internal  & \it description \\{}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1336
  [$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
  1337
        \rm finite list \\{}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1338
  [$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
  1339
        \rm list comprehension
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1340
\end{tabular}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1341
\end{center}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1342
\subcaption{Translations}
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
  1343
\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
  1344
\end{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1345
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1346
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1347
\begin{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1348
\begin{ttbox}\makeatother
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1349
null [] = True
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1350
null (x#xs) = False
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1351
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1352
hd (x#xs) = x
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1353
tl (x#xs) = xs
3881
73be08b4da3f Added last, butlast, dropped ttl.
nipkow
parents: 3489
diff changeset
  1354
tl [] = []
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1355
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1356
[] @ ys = ys
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1357
(x#xs) @ ys = x # xs @ ys
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1358
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1359
map f [] = []
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1360
map f (x#xs) = f x # map f xs
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1361
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1362
filter P [] = []
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1363
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
  1364
3487
62a6a08471e4 set_of_list -> set
nipkow
parents: 3315
diff changeset
  1365
set [] = \ttlbrace\ttrbrace
62a6a08471e4 set_of_list -> set
nipkow
parents: 3315
diff changeset
  1366
set (x#xs) = insert x (set xs)
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1367
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1368
x mem [] = False
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1369
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
  1370
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1371
foldl f a [] = a
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1372
foldl f a (x#xs) = foldl f (f a x) xs
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1373
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1374
concat([]) = []
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1375
concat(x#xs) = x @ concat(xs)
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1376
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1377
rev([]) = []
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1378
rev(x#xs) = rev(xs) @ [x]
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1379
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1380
length([]) = 0
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1381
length(x#xs) = Suc(length(xs))
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1382
4503
5ed72705c201 nth -> !
nipkow
parents: 4068
diff changeset
  1383
xs!0 = hd xs
5ed72705c201 nth -> !
nipkow
parents: 4068
diff changeset
  1384
xs!(Suc n) = (tl xs)!n
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1385
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1386
take n [] = []
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1387
take n (x#xs) = (case n of 0 => [] | Suc(m) => x # take m xs)
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1388
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1389
drop n [] = []
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1390
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
  1391
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1392
takeWhile P [] = []
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1393
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
  1394
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1395
dropWhile P [] = []
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1396
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
  1397
\end{ttbox}
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1398
\caption{Recursions equations for list processing functions}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1399
\label{fig:HOL:list-simps}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1400
\end{figure}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1401
\index{nat@{\textit{nat}} type|)}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1402
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1403
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1404
\subsection{The type constructor for lists, \textit{list}}
3959
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
  1405
\label{subsec:list}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1406
\index{list@{\textit{list}} type|(}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1407
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1408
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
  1409
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
  1410
defined as a \texttt{datatype} with the constructors {\tt[]} and {\tt\#}.
3287
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1411
As a result the generic structural induction and case analysis tactics
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1412
\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
  1413
lists.  A \sdx{case} construct of the form
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1414
\begin{center}\tt
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1415
case $e$ of [] => $a$  |  \(x\)\#\(xs\) => b
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1416
\end{center}
3959
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
  1417
is defined by translation.  For details see~\S\ref{sec:HOL:datatype}. There
4067
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1418
is also a case splitting rule \tdx{split_list_case}
3959
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
  1419
\[
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
  1420
\begin{array}{l}
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
  1421
P(\mathtt{case}~e~\mathtt{of}~\texttt{[] =>}~a ~\texttt{|}~
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
  1422
               x\texttt{\#}xs~\texttt{=>}~f~x~xs) ~= \\
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
  1423
((e = \texttt{[]} \to P(a)) \land
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
  1424
 (\forall x~ xs. e = x\texttt{\#}xs \to P(f~x~xs)))
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
  1425
\end{array}
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
  1426
\]
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
  1427
which can be fed to \ttindex{addsplits} just like
4834
dd89afb55272 delsplits, Addsplits, Delsplits.
nipkow
parents: 4803
diff changeset
  1428
\texttt{split_if} (see~\S\ref{subsec:HOL:case:splitting}).
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1429
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1430
{\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
  1431
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
  1432
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
  1433
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1434
\index{list@{\textit{list}} type|)}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1435
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1436
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1437
\subsection{Introducing new types} \label{sec:typedef}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1438
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1439
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
  1440
be \textbf{definitional}.  The type definition mechanism that
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1441
meets this criterion is \ttindex{typedef}.  Note that \emph{type synonyms},
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1442
which are inherited from {\Pure} and described elsewhere, are just
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1443
syntactic abbreviations that have no logical meaning.
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1444
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1445
\begin{warn}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1446
  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
  1447
  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
  1448
\end{warn}
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1449
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
  1450
an existing type.  More precisely, the new type is defined by
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1451
exhibiting an existing type~$\tau$, a set~$A::\tau\,set$, and a
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1452
theorem of the form $x:A$.  Thus~$A$ is a non-empty subset of~$\tau$,
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1453
and the new type denotes this subset.  New functions are defined that
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1454
establish an isomorphism between the new type and the subset.  If
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1455
type~$\tau$ involves type variables $\alpha@1$, \ldots, $\alpha@n$,
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1456
then the type definition creates a type constructor
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1457
$(\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
  1458
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1459
\begin{figure}[htbp]
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1460
\begin{rail}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1461
typedef  : 'typedef' ( () | '(' name ')') type '=' set witness;
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1462
type    : typevarlist name ( () | '(' infix ')' );
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1463
set     : string;
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1464
witness : () | '(' id ')';
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1465
\end{rail}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1466
\caption{Syntax of type definitions}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1467
\label{fig:HOL:typedef}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1468
\end{figure}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1469
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1470
The syntax for type definitions is shown in Fig.~\ref{fig:HOL:typedef}.  For
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1471
the definition of `typevarlist' and `infix' see
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1472
\iflabelundefined{chap:classical}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1473
{the appendix of the {\em Reference Manual\/}}%
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1474
{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
  1475
following meaning:
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1476
\begin{description}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1477
\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
  1478
  optional infix annotation.
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1479
\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
  1480
  $ty$, in case $ty$ is a symbolic name.  Defaults to $ty$.
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1481
\item[\it set:] the representing subset $A$.
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1482
\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
  1483
  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
  1484
  non-emptiness automatically.
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1485
\end{description}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1486
If all context conditions are met (no duplicate type variables in
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1487
`typevarlist', no extra type variables in `set', and no free term variables
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1488
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
  1489
\begin{itemize}
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1490
\item a type $ty :: (term,\dots,term)term$
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1491
\item constants
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1492
\begin{eqnarray*}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1493
T &::& \tau\;set \\
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1494
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
  1495
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
  1496
\end{eqnarray*}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1497
\item a definition and three axioms
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1498
\[
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1499
\begin{array}{ll}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1500
T{\tt_def} & T \equiv A \\
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1501
{\tt Rep_}T & Rep_T\,x \in T \\
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1502
{\tt Rep_}T{\tt_inverse} & Abs_T\,(Rep_T\,x) = x \\
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1503
{\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
  1504
\end{array}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1505
\]
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1506
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
  1507
and its inverse $Abs_T$.
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1508
\end{itemize}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1509
Below are two simple examples of \HOL\ type definitions.  Non-emptiness
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1510
is proved automatically here.
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1511
\begin{ttbox}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1512
typedef unit = "{\ttlbrace}True{\ttrbrace}"
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1513
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1514
typedef (prod)
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1515
  ('a, 'b) "*"    (infixr 20)
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1516
      = "{\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
  1517
\end{ttbox}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1518
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1519
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
  1520
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
  1521
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
  1522
\begin{enumerate}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1523
\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
  1524
  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
  1525
\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
  1526
\end{enumerate}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1527
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
  1528
abstract properties $P$.
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1529
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1530
\begin{warn}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1531
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
  1532
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
  1533
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
  1534
\par
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1535
\begin{ttbox}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1536
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
  1537
\end{ttbox}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1538
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
  1539
class of all \HOL\ types.
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1540
\end{warn}
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1541
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1542
\section{Datatype declarations}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1543
\label{sec:HOL:datatype}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1544
\index{*datatype|(}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1545
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1546
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
  1547
non-trivial applications of \HOL.  In principle, such types could be
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1548
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
  1549
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
  1550
package of \HOL\ automates such chores.  It generates freeness theorems
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1551
and induction rules from a very simple description of the new type
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1552
provided by the user.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1553
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1554
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1555
\subsection{Basics}
3959
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
  1556
\label{subsec:datatype:basics}
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1557
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1558
The general \HOL\ \texttt{datatype} definition is of the following form:
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1559
\[
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1560
\mathtt{datatype}~(\alpha@1, \dots, \alpha@n) \, t ~=~
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1561
C@1~\tau@{11}~\dots~\tau@{1k@1} ~\mid~ \dots ~\mid~
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1562
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
  1563
\]
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1564
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
  1565
names and $\tau@{ij}$ are types.  The latter may be one of the
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1566
following:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1567
\begin{itemize}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1568
\item type variables $\alpha@1, \dots, \alpha@n$,
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1569
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1570
\item types $(\beta@1, \dots, \beta@l) \, t'$ where $t'$ is a
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1571
  previously declared type constructor or type synonym and $\{\beta@1,
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1572
  \dots, \beta@l\} \subseteq \{\alpha@1, \dots, \alpha@n\}$,
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1573
  
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1574
\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
  1575
\end{itemize}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1576
Recursive occurences of $(\alpha@1, \dots, \alpha@n) \, t$ are quite
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1577
restricted.  To ensure that the new type is non-empty, at least one
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1578
constructor must consist of only non-recursive type components.  If
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1579
you would like one of the $\tau@{ij}$ to be a complex type expression
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1580
$\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
  1581
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
  1582
mentions the recursive type itself, thus ruling out problematic cases
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1583
like $\mathtt{datatype}~ t ~=~ C \, (t \To t)$, but also unproblematic
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1584
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
  1585
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1586
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
  1587
type:
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1588
\[ C@j :: [\tau@{j1},\dots,\tau@{jk@j}] \To (\alpha@1,\dots,\alpha@n)t \]
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1589
These functions have certain {\em freeness} properties --- they are
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1590
distinct:
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1591
\[
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1592
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
  1593
\mbox{for all}~ i \neq j.
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1594
\]
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1595
and they are injective:
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1596
\[
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1597
(C@j~x@1~\dots~x@{k@j} = C@j~y@1~\dots~y@{k@j}) =
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1598
(x@1 = y@1 \land \dots \land x@{k@j} = y@{k@j})
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1599
\]
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1600
Because the number of inequalities is quadratic in the number of
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1601
constructors, a different representation is used if there are $7$ or
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1602
more of them.  In that case every constructor term is mapped to a
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1603
natural number:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1604
\[
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1605
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
  1606
\]
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1607
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
  1608
\[
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1609
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
  1610
\]
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1611
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1612
\medskip Generally, the following structural induction rule is
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1613
provided:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1614
\[
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1615
\infer{P \, x}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1616
{\begin{array}{lcl}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1617
\Forall x@1\dots x@{k@1}.
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1618
  \List{P~x@{r@{11}}; \dots; P~x@{r@{1l@1}}} &
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1619
  \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
  1620
 & \vdots & \\
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1621
\Forall x@1\dots x@{k@m}.
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1622
  \List{P~x@{r@{m1}}; \dots; P~x@{r@{ml@m}}} &
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1623
  \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
  1624
\end{array}}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1625
\]
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1626
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
  1627
= (\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
  1628
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
  1629
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1630
For convenience, the following additional constructions are predefined for
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1631
each datatype.
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1632
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1633
\subsubsection{The \sdx{case} construct}
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1634
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1635
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
  1636
\[
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1637
\begin{array}{rrcl}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1638
\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
  1639
                           \vdots \\
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1640
                           \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
  1641
\end{array}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1642
\]
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1643
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
  1644
\S\ref{subsec:prod-sum}.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1645
\begin{warn}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1646
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
  1647
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
  1648
Violating this restriction results in strange error messages.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1649
\end{warn}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1650
4067
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1651
To perform case distinction on a goal containing a \texttt{case}-construct,
4068
99224854a0ac Indexed split_t_case.
nipkow
parents: 4067
diff changeset
  1652
the theorem \texttt{split_}$t$\texttt{_case}\tdx{split_$t$_case} is provided:
4067
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1653
\[
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1654
\begin{array}{@{}rcl@{}}
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1655
P(t_\mathtt{case}~f@1~\dots~f@m~e) &=&
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1656
((\forall x@1 \dots x@{k@1}. e = C@1~x@1\dots x@{k@1} \to
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1657
                             P(f@1~~x@1\dots x@{k@1})) \\
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1658
&& ~\land~ \dots ~\land \\
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1659
&&~ (\forall x@1 \dots x@{k@m}. e = C@m~x@1\dots x@{k@m} \to
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1660
                             P(f@m~~x@1\dots x@{k@m})))
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1661
\end{array}
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1662
\]
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1663
where $t$\texttt{_case} is the internal name of the \texttt{case}-construct.
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1664
This theorem can be added to a simpset via \ttindex{addsplits}
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1665
(see~\S\ref{subsec:HOL:case:splitting}).
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1666
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1667
\subsubsection{The function \cdx{size}}\label{sec:HOL:size}
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1668
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1669
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
  1670
$\alpha\To nat$.  Each datatype defines a particular instance of \texttt{size}
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1671
according to the following scheme:
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1672
\[
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1673
size(C@j~x@{j1}~\dots~x@{jk@1}) =
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1674
\left\{
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1675
\begin{array}{ll}
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1676
0 & \mbox{if $Rec@j = \emptyset$} \\
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1677
size(x@{r@{j1}}) + \cdots + size(x@{r@{jl@j}}) + 1 &
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1678
 \mbox{if $Rec@j = \{r@{j1},\dots,r@{jl@j}\}$}
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1679
\end{array}
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1680
\right.
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1681
\]
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1682
where $Rec@j$ is defined above.  Viewing datatypes as generalized trees, the
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1683
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
  1684
subtrees $+1$.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1685
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1686
\subsection{Defining datatypes}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1687
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1688
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
  1689
{\tt datatype}.  The definition following this must conform to the
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1690
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
  1691
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
  1692
extended with the new type, the constructors, and the theorems listed
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1693
in the previous section.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1694
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1695
\begin{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1696
\begin{rail}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1697
typedecl : typevarlist id '=' (cons + '|')
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1698
         ;
1581
a82618a900e5 updated syntax of datatype declaration
clasohm
parents: 1578
diff changeset
  1699
cons     : name (typ *) ( () | mixfix )
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1700
         ;
1581
a82618a900e5 updated syntax of datatype declaration
clasohm
parents: 1578
diff changeset
  1701
typ      : id | tid | ('(' typevarlist id ')')
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1702
         ;
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1703
\end{rail}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1704
\caption{Syntax of datatype declarations}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1705
\label{datatype-grammar}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1706
\end{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1707
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1708
\begin{warn}
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1709
  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
  1710
  indirectly, on the theory \texttt{Arith}, if necessary by including it
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1711
  explicitly as a parent.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1712
\end{warn}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1713
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1714
Most of the theorems about the datatype become part of the default simpset
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1715
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
  1716
automatically.  Only induction is invoked by hand:
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1717
\begin{ttdescription}
3045
4ef28e05781b Added 'induct_tac'
nipkow
parents: 2994
diff changeset
  1718
\item[\ttindexbold{induct_tac} {\tt"}$x${\tt"} $i$]
4ef28e05781b Added 'induct_tac'
nipkow
parents: 2994
diff changeset
  1719
 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
  1720
 type of $x$ is a datatype or type \tydx{nat}.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1721
\end{ttdescription}
3287
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1722
In some cases, induction is overkill and a case distinction over all
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1723
constructors of the datatype suffices:
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1724
\begin{ttdescription}
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1725
\item[\ttindexbold{exhaust_tac} {\tt"}$u${\tt"} $i$]
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1726
 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
  1727
 must be a datatype or type \tydx{nat}.  If the datatype has $n$ constructors
3287
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1728
 $C@1$, \dots $C@n$, subgoal $i$ is replaced by $n$ new subgoals which
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1729
 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
  1730
 $j=1$, $\dots$,~$n$.
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1731
\end{ttdescription}
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1732
\begin{warn}
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1733
  Induction is only allowed on a free variable that should not occur among
4067
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1734
  the premises of the subgoal.  Exhaustion works for arbitrary terms.
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1735
\end{warn}
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1736
\bigskip
3287
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1737
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1738
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1739
For the technically minded, we give a more detailed description.
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1740
Reading the theory file produces an \ML\ structure which, in addition to the
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1741
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
  1742
defined in the file.  Each structure $t$ contains the following
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1743
elements:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1744
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1745
val distinct : thm list
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1746
val inject : thm list
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1747
val induct : thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1748
val cases : thm list
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1749
val simps : thm list
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1750
val induct_tac : string -> int -> tactic
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1751
\end{ttbox}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1752
{\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
  1753
described above.  For user convenience, \texttt{distinct} contains
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1754
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
  1755
  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
  1756
  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
  1757
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1758
\subsection{Examples}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1759
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1760
\subsubsection{The datatype $\alpha~mylist$}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1761
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1762
We want to define the type $\alpha~mylist$.\footnote{This is just an
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1763
  example, there is already a list type in \HOL, of course.} To do
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1764
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
  1765
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
  1766
\begin{ttbox}
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
  1767
MyList = HOL +
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1768
  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
  1769
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1770
\end{ttbox}
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1771
After loading the theory (with \verb$use_thy "MyList"$), we can prove
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1772
$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
  1773
goal with $x$ quantified at the object-level.  This will be stripped
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1774
later using \ttindex{qed_spec_mp}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1775
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1776
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
  1777
{\out Level 0}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1778
{\out ! x. Cons x xs ~= xs}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1779
{\out  1. ! x. Cons x xs ~= xs}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1780
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1781
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
  1782
\begin{ttbox}
3045
4ef28e05781b Added 'induct_tac'
nipkow
parents: 2994
diff changeset
  1783
by (induct_tac "xs" 1);
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1784
{\out Level 1}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1785
{\out ! x. Cons x xs ~= xs}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1786
{\out  1. ! x. Cons x Nil ~= Nil}
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1787
{\out  2. !!a mylist.}
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1788
{\out        ! x. Cons x mylist ~= mylist ==>}
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1789
{\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
  1790
\end{ttbox}
2495
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1791
The first subgoal can be proved using the simplifier.
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1792
Isabelle has already added the freeness properties of lists to the 
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1793
default simplification set.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1794
\begin{ttbox}
2495
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1795
by (Simp_tac 1);
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1796
{\out Level 2}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1797
{\out ! x. Cons x xs ~= xs}
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1798
{\out  1. !!a mylist.}
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1799
{\out        ! x. Cons x mylist ~= mylist ==>}
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1800
{\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
  1801
\end{ttbox}
2495
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1802
Similarly, we prove the remaining goal.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1803
\begin{ttbox}
2495
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1804
by (Asm_simp_tac 1);
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1805
{\out Level 3}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1806
{\out ! x. Cons x xs ~= xs}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1807
{\out No subgoals!}
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1808
\ttbreak
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1809
qed_spec_mp "not_Cons_self";
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1810
{\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
  1811
\end{ttbox}
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1812
Because both subgoals could have been proved by \texttt{Asm_simp_tac}
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1813
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
  1814
\begin{ttbox}
2495
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1815
by (ALLGOALS Asm_simp_tac);
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1816
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1817
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1818
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1819
\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
  1820
3181
wenzelm
parents: 3180
diff changeset
  1821
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
  1822
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
  1823
notation \verb|#| for \texttt{Cons}.  To do this we simply add mixfix
3181
wenzelm
parents: 3180
diff changeset
  1824
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
  1825
\begin{ttbox}
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
  1826
MyList = HOL +
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1827
  datatype 'a mylist =
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1828
    Nil ("[]")  |
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1829
    Cons 'a ('a mylist)  (infixr "#" 70)
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1830
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1831
\end{ttbox}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1832
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
  1833
proof is the same.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1834
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1835
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1836
\subsubsection{A datatype for weekdays}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1837
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1838
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
  1839
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1840
Days = Arith +
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1841
  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
  1842
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1843
\end{ttbox}
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1844
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
  1845
on \texttt{Arith}.  Inequality is expressed via a function
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1846
\verb|days_ord|.  The theorem \verb|Mon ~= Tue| is not directly
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1847
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
  1848
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
  1849
\begin{ttbox}
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1850
goal Days.thy "Mon ~= Tue";
2495
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1851
by (Simp_tac 1);
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1852
\end{ttbox}
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1853
You need not derive such inequalities explicitly: the simplifier will dispose
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1854
of them automatically.
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1855
\index{*datatype|)}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1856
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1857
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1858
\section{Recursive function definitions}\label{sec:HOL:recursive}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1859
\index{recursive functions|see{recursion}}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1860
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1861
Isabelle/HOL provides two means of declaring recursive functions.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1862
\begin{itemize}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1863
\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
  1864
  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
  1865
  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
  1866
  often wanted, and it is easy to use.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1867
  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1868
\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
  1869
  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
  1870
  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
  1871
  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
  1872
  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
  1873
  can make work difficult.%
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1874
  \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
  1875
    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
  1876
    and assisting with its installation.}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1877
\end{itemize}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1878
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1879
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1880
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
  1881
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
  1882
already have been declared as a constant.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1883
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1884
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
  1885
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
  1886
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
  1887
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
  1888
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
  1889
the desired recursion equations as theorems.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1890
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1891
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1892
\subsection{Primitive recursive functions}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1893
\label{sec:HOL:primrec}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1894
\index{recursion!primitive|(}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1895
\index{*primrec|(}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1896
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1897
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
  1898
  primitive recursion}.  In principle, one can define
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1899
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
  1900
new axioms.  Here is an example:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1901
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1902
Append = MyList +
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1903
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
  1904
rules 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1905
   app_Nil   "app [] ys = ys"
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
  1906
   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
  1907
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1908
\end{ttbox}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1909
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
  1910
inconsistency, as in \verb$app [] ys = us$.
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1911
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1912
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
  1913
recursive functions on datatypes:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1914
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1915
Append = MyList +
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1916
consts app :: ['a mylist, 'a mylist] => 'a mylist
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1917
primrec app MyList.mylist
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1918
   "app [] ys = ys"
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1919
   "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
  1920
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1921
\end{ttbox}
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1922
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
  1923
recursive definition, preserving consistency.  For example
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1924
\begin{ttbox}
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1925
primrec app MyList.mylist
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1926
    "app [] ys = us"
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1927
\end{ttbox}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1928
is rejected with an error message \texttt{Extra variables on rhs}.
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1929
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1930
\bigskip
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1931
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1932
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
  1933
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1934
primrec {\it function} {\it type}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1935
    {\it reduction rules}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1936
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1937
where
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1938
\begin{itemize}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1939
\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
  1940
  or a \textit{string}.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1941
\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
  1942
  in the long form \texttt{$T$.$t$} ($T$ is the name of the theory
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1943
  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
  1944
  The long form is required if the \texttt{datatype} and the {\tt
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1945
    primrec} sections are in different theories.
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1946
\item \textit{reduction rules} specify one or more equations of the form
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1947
  \[ f \, x@1 \, \dots \, x@m \, (C \, y@1 \, \dots \, y@k) \, z@1 \,
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1948
  \dots \, z@n = r \] such that $C$ is a constructor of the datatype,
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1949
  $r$ contains only the free variables on the left-hand side, and all
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1950
  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
  1951
  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
  1952
  constructor.  The order is immaterial.  Also note that all reduction
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1953
  rules are added to the default simpset!
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1954
  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1955
  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
  1956
  \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
  1957
  \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
  1958
\end{itemize}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1959
2495
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1960
The primitive recursive function can have infix or mixfix syntax:
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1961
\begin{ttbox}\underscoreon
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1962
Append = MyList +
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1963
consts "@"  :: ['a mylist, 'a mylist] => 'a mylist  (infixr 60)
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1964
primrec "op @" MyList.mylist
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1965
   "[] @ ys = ys"
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1966
   "(x#xs) @ ys = x#(xs @ ys)"
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1967
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1968
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1969
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1970
The reduction rules for {\tt\at} become part of the default simpset, which
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1971
leads to short proofs:
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1972
\begin{ttbox}\underscoreon
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1973
goal Append.thy "(xs @ ys) @ zs = xs @ (ys @ zs)";
3045
4ef28e05781b Added 'induct_tac'
nipkow
parents: 2994
diff changeset
  1974
by (induct\_tac "xs" 1);
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1975
by (ALLGOALS Asm\_simp\_tac);
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1976
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1977
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1978
\index{recursion!primitive|)}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1979
\index{*primrec|)}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1980
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1981
4803
8428d4699d58 Clearer description of recdef, including use of {}
paulson
parents: 4591
diff changeset
  1982
\subsection{General recursive functions}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1983
\label{sec:HOL:recdef}
3962
69c76eb80273 Fixed the index entries for "recursion, general"
paulson
parents: 3959
diff changeset
  1984
\index{recursion!general|(}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1985
\index{*recdef|(}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1986
4803
8428d4699d58 Clearer description of recdef, including use of {}
paulson
parents: 4591
diff changeset
  1987
Using \texttt{recdef}, you can declare functions involving nested recursion
8428d4699d58 Clearer description of recdef, including use of {}
paulson
parents: 4591
diff changeset
  1988
and pattern-matching.  Recursion need not involve datatypes and there are few
8428d4699d58 Clearer description of recdef, including use of {}
paulson
parents: 4591
diff changeset
  1989
syntactic restrictions.  Termination is proved by showing that each recursive
8428d4699d58 Clearer description of recdef, including use of {}
paulson
parents: 4591
diff changeset
  1990
call makes the argument smaller in a suitable sense, which you specify by
8428d4699d58 Clearer description of recdef, including use of {}
paulson
parents: 4591
diff changeset
  1991
supplying a well-founded relation.
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1992
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1993
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
  1994
\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
  1995
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
  1996
macro for \texttt{Suc~0}.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1997
\begin{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1998
consts fib  :: "nat => nat"
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1999
recdef fib "less_than"
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2000
    "fib 0 = 0"
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2001
    "fib 1 = 1"
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2002
    "fib (Suc(Suc x)) = (fib x + fib (Suc x))"
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2003
\end{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2004
4591
f88e466c43fa Fixed the description of recdef
paulson
parents: 4503
diff changeset
  2005
With \texttt{recdef}, function definitions may be incomplete, and patterns may
f88e466c43fa Fixed the description of recdef
paulson
parents: 4503
diff changeset
  2006
overlap, as in functional programming.  The \texttt{recdef} package
f88e466c43fa Fixed the description of recdef
paulson
parents: 4503
diff changeset
  2007
disambiguates overlapping patterns by taking the order of rules into account.
f88e466c43fa Fixed the description of recdef
paulson
parents: 4503
diff changeset
  2008
For missing patterns, the function is defined to return an arbitrary value.
4803
8428d4699d58 Clearer description of recdef, including use of {}
paulson
parents: 4591
diff changeset
  2009
For example, here is a declaration of the list function \cdx{hd}:
8428d4699d58 Clearer description of recdef, including use of {}
paulson
parents: 4591
diff changeset
  2010
\begin{ttbox}
8428d4699d58 Clearer description of recdef, including use of {}
paulson
parents: 4591
diff changeset
  2011
consts hd :: 'a list => 'a
8428d4699d58 Clearer description of recdef, including use of {}
paulson
parents: 4591
diff changeset
  2012
recdef hd "\{\}"
8428d4699d58 Clearer description of recdef, including use of {}
paulson
parents: 4591
diff changeset
  2013
    "hd (x#l) = x"
8428d4699d58 Clearer description of recdef, including use of {}
paulson
parents: 4591
diff changeset
  2014
\end{ttbox}
8428d4699d58 Clearer description of recdef, including use of {}
paulson
parents: 4591
diff changeset
  2015
Because this function is not recursive, we may supply the empty well-founded
8428d4699d58 Clearer description of recdef, including use of {}
paulson
parents: 4591
diff changeset
  2016
relation, $\{\}$.
4591
f88e466c43fa Fixed the description of recdef
paulson
parents: 4503
diff changeset
  2017
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2018
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
  2019
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
  2020
admits no infinitely decreasing chains
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2021
\[ \cdots\prec x@n\prec\cdots\prec x@1. \]
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2022
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
  2023
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
  2024
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2025
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
  2026
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
  2027
operators and automatically proves that the constructed relation is
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2028
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
  2029
\begin{itemize}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2030
\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
  2031
  (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
  2032
  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2033
\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
  2034
  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
  2035
  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
  2036
  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
  2037
  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
  2038
  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
  2039
                                                    
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2040
\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
  2041
  \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
  2042
  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
  2043
  relation.
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
\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
  2046
  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
  2047
  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
  2048
  is less than $y@2$ according to~$R@2$.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2049
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2050
\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
  2051
\end{itemize}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2052
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2053
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
  2054
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
  2055
recursion terminates because argument~$n$ decreases.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2056
\begin{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2057
recdef gcd "measure ((\%(m,n).n) ::nat*nat=>nat)"
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2058
    "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
  2059
\end{ttbox}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2060
4591
f88e466c43fa Fixed the description of recdef
paulson
parents: 4503
diff changeset
  2061
The general form of a well-founded recursive definition is
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2062
\begin{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2063
recdef {\it function} {\it rel}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2064
    congs   {\it congruence rules}      {\bf(optional)}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2065
    simpset {\it simplification set}      {\bf(optional)}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2066
   {\it reduction rules}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2067
\end{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2068
where
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2069
\begin{itemize}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2070
\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
  2071
  or a \textit{string}.  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2072
  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2073
\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
  2074
  relation.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2075
  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2076
\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
  2077
  circumstances.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2078
  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2079
\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
  2080
  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
  2081
    conditions}: assertions that arguments of recursive calls decrease under
4877
7a046198610e fixed simpset(), claset();
wenzelm
parents: 4834
diff changeset
  2082
  \textit{rel}.  By default, simplification uses \texttt{simpset()}, which
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2083
  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
  2084
  above. 
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2085
  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2086
\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
  2087
  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
  2088
  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
  2089
  $f$ is defined by pattern-matching on components of its argument whose type
4591
f88e466c43fa Fixed the description of recdef
paulson
parents: 4503
diff changeset
  2090
  is a \texttt{datatype}.  
f88e466c43fa Fixed the description of recdef
paulson
parents: 4503
diff changeset
  2091
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2092
  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
  2093
  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
  2094
  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
  2095
  as a list of theorems.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2096
\end{itemize}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2097
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2098
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
  2099
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
  2100
theorems.  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2101
\begin{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2102
gcd.rules;
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2103
{\out ["! m n. n ~= 0 --> m mod n < n}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2104
{\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
  2105
{\out : thm list}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2106
\end{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2107
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
  2108
illustrates how to prove termination conditions afterwards.  The function
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2109
\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
  2110
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
  2111
$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
  2112
conditions: 
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2113
\begin{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2114
Tfl.tgoalw thy [] gcd.rules;
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2115
{\out Level 0}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2116
{\out ! m n. n ~= 0 --> m mod n < n}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2117
{\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
  2118
\end{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2119
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
  2120
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
  2121
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
  2122
\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
  2123
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
  2124
involving the recursive function itself.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2125
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2126
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
  2127
automatically if supplied with the right simpset.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2128
\begin{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2129
recdef gcd "measure ((\%(m,n).n) ::nat*nat=>nat)"
4877
7a046198610e fixed simpset(), claset();
wenzelm
parents: 4834
diff changeset
  2130
  simpset "simpset() addsimps [mod_less_divisor, zero_less_eq]"
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2131
    "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
  2132
\end{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2133
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2134
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
  2135
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
  2136
rule is
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2137
\begin{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2138
gcd.induct;
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2139
{\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
  2140
\end{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2141
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
  2142
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
  2143
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
  2144
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
  2145
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2146
\index{recursion!general|)}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2147
\index{*recdef|)}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2148
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2149
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2150
\section{Inductive and coinductive definitions}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2151
\index{*inductive|(}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2152
\index{*coinductive|(}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2153
2975
230f456956a2 Corrected the informal description of coinductive definition
paulson
parents: 2933
diff changeset
  2154
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
  2155
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
  2156
example, a structural operational semantics is an inductive definition of an
230f456956a2 Corrected the informal description of coinductive definition
paulson
parents: 2933
diff changeset
  2157
evaluation relation.  Dually, a {\bf coinductive definition} specifies the
230f456956a2 Corrected the informal description of coinductive definition
paulson
parents: 2933
diff changeset
  2158
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
  2159
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
  2160
is using bisimulation relations to formalize equivalence of processes and
230f456956a2 Corrected the informal description of coinductive definition
paulson
parents: 2933
diff changeset
  2161
infinite data structures.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2162
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2163
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
  2164
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
  2165
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
  2166
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
  2167
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2168
Each (co)inductive definition adds definitions to the theory and also
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  2169
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
  2170
substructure of the main theory structure.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2171
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2172
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
  2173
paper,%
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2174
\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
  2175
  distributed with Isabelle.}  %
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2176
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
  2177
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
  2178
(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
  2179
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
  2180
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
\subsection{The result structure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2183
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
  2184
others are self-explanatory.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2185
\begin{description}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2186
\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
  2187
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2188
\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
  2189
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2190
\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
  2191
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2192
\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
  2193
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
  2194
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2195
\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
  2196
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
  2197
names given them in the theory file. 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2198
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2199
\item[\tt elim] is the elimination rule.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2200
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2201
\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
  2202
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
  2203
\end{description}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2204
2933
f842a75d9624 Updated discussion and references for inductive definitions
paulson
parents: 2926
diff changeset
  2205
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
  2206
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
  2207
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
  2208
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
  2209
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2210
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
  2211
specifying the types of all these components.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2212
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2213
\begin{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2214
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2215
sig
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2216
val thy          : theory
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2217
val defs         : thm list
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2218
val mono         : thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2219
val unfold       : thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2220
val intrs        : thm list
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2221
val elim         : thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2222
val mk_cases     : thm list -> string -> thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2223
{\it(Inductive definitions only)} 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2224
val induct       : thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2225
val mutual_induct: thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2226
{\it(Coinductive definitions only)}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2227
val coinduct    : thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2228
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2229
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2230
\hrule
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2231
\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
  2232
\end{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2233
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2234
\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
  2235
An inductive definition has the form
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2236
\begin{ttbox}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2237
inductive    \textit{inductive sets}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2238
  intrs      \textit{introduction rules}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2239
  monos      \textit{monotonicity theorems}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2240
  con_defs   \textit{constructor definitions}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2241
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2242
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
  2243
{\tt coinductive}.  
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2244
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2245
The \texttt{monos} and \texttt{con_defs} sections are optional.  If present,
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2246
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
  2247
of type \texttt{thm list}.  It is simply inserted into the generated
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2248
\ML{} file that is generated from the theory definition; if it is
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2249
ill-formed, it will trigger ML error messages.  You can then inspect
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2250
the file on your directory.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2251
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2252
\begin{itemize}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2253
\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
  2254
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2255
\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
  2256
  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
  2257
  the rule in the result structure.
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
\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
  2260
  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
  2261
  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
  2262
  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
  2263
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2264
\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
  2265
  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
  2266
\end{itemize}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2267
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2268
The package has a few notable restrictions:
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2269
\begin{itemize}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2270
\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
  2271
  constants.
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2272
  
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2273
\item The names of the recursive sets must be alphanumeric
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2274
  identifiers.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2275
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2276
\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
  2277
may contain any number of side-conditions.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2278
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2279
\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
  2280
  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
  2281
\end{itemize}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2282
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2283
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2284
\subsection{Example of an inductive definition}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2285
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
  2286
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
  2287
inductively, with two introduction rules:
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2288
\begin{ttbox}
1389
fbe857ddc80d removed quotes from consts and syntax sections
clasohm
parents: 1234
diff changeset
  2289
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
  2290
inductive "Fin A"
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2291
  intrs
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2292
    emptyI  "{\ttlbrace}{\ttrbrace} : Fin A"
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2293
    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
  2294
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2295
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
  2296
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
  2297
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
  2298
rule is \texttt{Fin.induct}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2299
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2300
For another example, here is a theory file defining the accessible
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2301
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
  2302
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
  2303
\verb|Pow_mono| in the \texttt{monos} list.  The paper
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2304
\cite{paulson-CADE} discusses a \ZF\ version of this example in more
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2305
detail.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2306
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2307
Acc = WF + 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2308
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
  2309
       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
  2310
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
  2311
inductive "acc r"
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2312
  intrs
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2313
     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
  2314
  monos   "[Pow_mono]"
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2315
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2316
\end{ttbox}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2317
The \HOL{} distribution contains many other inductive definitions.
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2318
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
  2319
theory \texttt{HOL/Induct/LList.thy} contains coinductive definitions.
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2320
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
  2321
  IMP}, \texttt{Lambda} and \texttt{Auth}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2322
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2323
\index{*coinductive|)} \index{*inductive|)}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2324
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2325
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2326
\section{The examples directories}
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2327
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2328
Directory \texttt{HOL/Auth} contains theories for proving the correctness of 
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2329
cryptographic protocols.  The approach is based upon operational 
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2330
semantics~\cite{paulson-security} rather than the more usual belief logics.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2331
On the same directory are proofs for some standard examples, such as the 
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2332
Needham-Schroeder public-key authentication protocol~\cite{paulson-ns} 
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2333
and the Otway-Rees protocol.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2334
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2335
Directory \texttt{HOL/IMP} contains a formalization of various denotational,
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2336
operational and axiomatic semantics of a simple while-language, the necessary
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2337
equivalence proofs, soundness and completeness of the Hoare rules with respect
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2338
to the 
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2339
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
  2340
condition generator.  Much of development is taken from
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2341
Winskel~\cite{winskel93}.  For details see~\cite{nipkow-IMP}.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2342
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2343
Directory \texttt{HOL/Hoare} contains a user friendly surface syntax for Hoare
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2344
logic, including a tactic for generating verification-conditions.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2345
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2346
Directory \texttt{HOL/MiniML} contains a formalization of the type system of the
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2347
core functional language Mini-ML and a correctness proof for its type
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2348
inference algorithm $\cal W$~\cite{milner78,nazareth-nipkow}.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2349
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2350
Directory \texttt{HOL/Lambda} contains a formalization of untyped
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2351
$\lambda$-calculus in de~Bruijn notation and Church-Rosser proofs for $\beta$
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2352
and $\eta$ reduction~\cite{Nipkow-CR}.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2353
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2354
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
  2355
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
  2356
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
  2357
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
  2358
with nested recursion.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2359
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2360
Directory \texttt{HOL/Induct} presents simple examples of (co)inductive
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2361
definitions.  
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2362
\begin{itemize}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2363
\item Theory \texttt{PropLog} proves the soundness and completeness of
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2364
  classical propositional logic, given a truth table semantics.  The only
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2365
  connective is $\imp$.  A Hilbert-style axiom system is specified, and its
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2366
  set of theorems defined inductively.  A similar proof in \ZF{} is
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2367
  described elsewhere~\cite{paulson-set-II}.
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2368
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2369
\item Theory \texttt{Term} develops an experimental recursive type definition;
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2370
  the recursion goes through the type constructor~\tydx{list}.
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2371
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2372
\item Theory \texttt{Simult} constructs mutually recursive sets of trees and
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2373
  forests, including induction and recursion rules.
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2374
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2375
\item The definition of lazy lists demonstrates methods for handling
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2376
  infinite data structures and coinduction in higher-order
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2377
  logic~\cite{paulson-coind}.%
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2378
\footnote{To be precise, these lists are \emph{potentially infinite} rather
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2379
  than lazy.  Lazy implies a particular operational semantics.}
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2380
  Theory \thydx{LList} defines an operator for
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2381
  corecursion on lazy lists, which is used to define a few simple functions
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2382
  such as map and append.   A coinduction principle is defined
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2383
  for proving equations on lazy lists.
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2384
  
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2385
\item Theory \thydx{LFilter} defines the filter functional for lazy lists.
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2386
  This functional is notoriously difficult to define because finding the next
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2387
  element meeting the predicate requires possibly unlimited search.  It is not
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2388
  computable, but can be expressed using a combination of induction and
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2389
  corecursion.  
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2390
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2391
\item Theory \thydx{Exp} illustrates the use of iterated inductive definitions
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2392
  to express a programming language semantics that appears to require mutual
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2393
  induction.  Iterated induction allows greater modularity.
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2394
\end{itemize}
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2395
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2396
Directory \texttt{HOL/ex} contains other examples and experimental proofs in
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2397
{\HOL}.  
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2398
\begin{itemize}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2399
\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
  2400
  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
  2401
  defines the Fibonacci function.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2402
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2403
\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
  2404
  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
  2405
  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
  2406
  or $p$ divides~$n$.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2407
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2408
\item Theory \texttt{Primrec} develops some computation theory.  It
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2409
  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
  2410
  proof that Ackermann's function is not primitive recursive.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2411
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2412
\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
  2413
  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
  2414
  moderately difficult problems involving equality and quantifiers.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2415
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2416
\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
  2417
    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
  2418
  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
  2419
  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
  2420
  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
  2421
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2422
\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
  2423
  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
  2424
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2425
\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
  2426
  \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
  2427
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2428
\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
  2429
  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
  2430
  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
  2431
  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
  2432
  environment, which makes a coinductive argument appropriate.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2433
\end{itemize}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2434
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2435
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2436
\goodbreak
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
  2437
\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
  2438
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
  2439
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
  2440
it is so easily expressed:
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2441
\[  \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
  2442
    \forall x::\alpha. f~x \not= S 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2443
\] 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2444
%
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2445
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
  2446
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
  2447
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
  2448
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
  2449
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
  2450
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
  2451
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
  2452
\begin{ttbox}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2453
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
  2454
{\out Level 0}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2455
{\out ?S ~: range f}
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2456
{\out  1. ?S ~: range f}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2457
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2458
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
  2459
$\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
  2460
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2461
by (resolve_tac [notI] 1);
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2462
{\out Level 1}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2463
{\out ?S ~: range f}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2464
{\out  1. ?S : range f ==> False}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2465
\ttbreak
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2466
by (eresolve_tac [rangeE] 1);
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2467
{\out Level 2}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2468
{\out ?S ~: range f}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2469
{\out  1. !!x. ?S = f x ==> False}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2470
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2471
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
  2472
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
  2473
any~$\Var{c}$.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2474
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2475
by (eresolve_tac [equalityCE] 1);
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2476
{\out Level 3}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2477
{\out ?S ~: range f}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2478
{\out  1. !!x. [| ?c3 x : ?S; ?c3 x : f x |] ==> False}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2479
{\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
  2480
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2481
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
  2482
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
  2483
$\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
  2484
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
  2485
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2486
by (dresolve_tac [CollectD] 1);
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2487
{\out Level 4}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2488
{\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
  2489
{\out  1. !!x. [| ?c3 x : f x; ?P7(?c3 x) |] ==> False}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2490
{\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
  2491
\end{ttbox}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2492
Forcing a contradiction between the two assumptions of subgoal~1
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2493
completes the instantiation of~$S$.  It is now the set $\{x. x\not\in
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2494
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
  2495
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2496
by (contr_tac 1);
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2497
{\out Level 5}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2498
{\out {\ttlbrace}x. x ~: f x{\ttrbrace} ~: range f}
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2499
{\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
  2500
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2501
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
  2502
assumption, we employ \ttindex{swap_res_tac}:
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2503
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2504
by (swap_res_tac [CollectI] 1);
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2505
{\out Level 6}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2506
{\out {\ttlbrace}x. x ~: f x{\ttrbrace} ~: range f}
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2507
{\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
  2508
\ttbreak
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2509
by (assume_tac 1);
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2510
{\out Level 7}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2511
{\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
  2512
{\out No subgoals!}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2513
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2514
How much creativity is required?  As it happens, Isabelle can prove this
4877
7a046198610e fixed simpset(), claset();
wenzelm
parents: 4834
diff changeset
  2515
theorem automatically.  The default classical set {\tt claset()} contains rules
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
  2516
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
  2517
\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
  2518
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
  2519
successfully navigates through the large search space.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2520
\index{search!best-first}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2521
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2522
choplev 0;
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2523
{\out Level 0}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2524
{\out ?S ~: range f}
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2525
{\out  1. ?S ~: range f}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2526
\ttbreak
4877
7a046198610e fixed simpset(), claset();
wenzelm
parents: 4834
diff changeset
  2527
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
  2528
{\out Level 1}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2529
{\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
  2530
{\out No subgoals!}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2531
\end{ttbox}
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2532
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
  2533
theory \texttt{Set}, for example by executing
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2534
\ttindex{set_current_thy}~{\tt"Set"}.  Otherwise the default claset may not
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2535
contain the rules for set theory.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2536
\index{higher-order logic|)}