doc-src/Logics/HOL.tex
author wenzelm
Fri, 23 Oct 1998 12:31:23 +0200
changeset 5735 6b8bb85c3848
parent 5151 1e944fe5ce96
child 5743 f2cf404a9579
permissions -rw-r--r--
started to add records;
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
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
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
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   205
descriptions as \cdx{Eps}($\lambda x. P[x]$) or use the syntax
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
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
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   209
\[ \exists x. P~x \;\equiv\; P(\varepsilon x. P~x). \]
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
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
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   212
quantifications.  For instance, $\exists!x\,y. P\,x\,y$ abbreviates
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   213
$\exists!x. \exists!y. P\,x\,y$; note that this does not mean that there
3160
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
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   220
unknown, while \verb'? x. f x=y' is a quantification.  Isabelle's usual
1113
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
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   228
variable of type $\tau$, then the term \cdx{LEAST}~$x. P[x]$ is defined
3152
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,
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   241
instead of $P \land \forall x. Q$ you need to write $P \land (\forall x. Q)$.
2926
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)
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
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)
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
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
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   302
\tdx{True_def}   True     == ((\%x::bool. x)=(\%x. x))
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   303
\tdx{All_def}    All      == (\%P. P = (\%x. True))
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   304
\tdx{Ex_def}     Ex       == (\%P. P(@x. P x))
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   305
\tdx{False_def}  False    == (!P. P)
1113
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
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   387
\tdx{spec}      !x. P x ==> P x
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   388
\tdx{allE}      [| !x. P x;  P x ==> R |] ==> R
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   389
\tdx{all_dupE}  [| !x. P x;  [| P x; !x. P x |] ==> R |] ==> R
1113
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
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   395
\tdx{ex1E}      [| ?! x. P x;  !!x. [| P x;  ! y. P y --> y=x |] ==> R 
1113
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
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   398
\tdx{select_equality} [| P a;  !!x. P x ==> x=a |] ==> (@x. P x) = a
1113
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
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   406
\tdx{exCI}            (! x. ~ P x ==> P a) ==> ? x. P x
1113
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 \\
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
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 \\
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   516
  \sdx{INT} $x$:$A$. $B[x]$      & INTER $A$ $\lambda x. B[x]$ &
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   517
        \rm intersection \\
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   518
  \sdx{UN}{\tt\ }  $x$:$A$. $B[x]$      & UNION $A$ $\lambda x. B[x]$ &
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   519
        \rm union \\
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   520
  \tt ! $x$:$A$. $P[x]$ or \sdx{ALL} $x$:$A$. $P[x]$ & 
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   521
        Ball $A$ $\lambda x. P[x]$ & 
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
   522
        \rm bounded $\forall$ \\
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   523
  \sdx{?} $x$:$A$. $P[x]$ or \sdx{EX}{\tt\ } $x$:$A$. $P[x]$ & 
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   524
        Bex $A$ $\lambda x. P[x]$ & \rm bounded $\exists$
1113
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
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
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
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   602
x. P[x])$.  It defines sets by absolute comprehension, which is impossible
1113
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*}
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   607
   \forall x\in A. P[x] &\hbox{abbreviates}& \forall x. x\in A\imp P[x] \\
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   608
   \exists x\in A. P[x] &\hbox{abbreviates}& \exists x. x\in A\conj P[x]
1113
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
%
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   615
\hbox{\tt !~$x$:$A$. $P[x]$} and \hbox{\tt ?~$x$:$A$. $P[x]$}.  Isabelle's
1113
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 
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   622
\sdx{UN}~\hbox{\tt$x$:$A$. $B[x]$} and
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   623
\sdx{INT}~\hbox{\tt$x$:$A$. $B[x]$}.  
1113
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
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   626
B[x]$, are written \sdx{UN}~\hbox{\tt$x$. $B[x]$} and
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   627
\sdx{INT}~\hbox{\tt$x$. $B[x]$}.  They are equivalent to the previous
1113
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}
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   638
\tdx{mem_Collect_eq}    (a : {\ttlbrace}x. P x{\ttrbrace}) = P a
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
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
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   641
\tdx{empty_def}         {\ttlbrace}{\ttrbrace}          == {\ttlbrace}x. False{\ttrbrace}
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
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
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   646
\tdx{Un_def}            A Un B      == {\ttlbrace}x. x:A | x:B{\ttrbrace}
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   647
\tdx{Int_def}           A Int B     == {\ttlbrace}x. x:A & x:B{\ttrbrace}
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   648
\tdx{set_diff_def}      A - B       == {\ttlbrace}x. x:A & x~:B{\ttrbrace}
3152
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}
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   652
\tdx{INTER1_def}        INTER1 B    == INTER {\ttlbrace}x. True{\ttrbrace} B 
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
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}
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   666
\tdx{CollectI}        [| P a |] ==> a : {\ttlbrace}x. P x{\ttrbrace}
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   667
\tdx{CollectD}        [| a : {\ttlbrace}x. P x{\ttrbrace} |] ==> P a
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
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
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   675
\tdx{bexCI}           [| ! x:A. ~ P x ==> P a;  a:A |] ==> ? x:A. P x
1113
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
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   679
\tdx{subsetI}         (!!x. x:A ==> x:B) ==> A <= B
1113
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
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
   825
\tdx{Compl_disjoint}    A Int (Compl A) = {\ttlbrace}x. False{\ttrbrace}
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
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}
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
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:
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
  1084
{\tt\%($x$,$y$,$z$). $t$} $\leadsto$ {\tt\%($x$,($y$,$z$)). $t$} $\leadsto$
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
  1085
{\tt split(\%$x$.\%($y$,$z$). $t$)} $\leadsto$ \texttt{split(\%$x$. split(\%$y$
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
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
5735
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1542
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1543
\section{Record types}
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1544
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1545
At a first approximation, records are just a minor generalization of tuples,
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1546
where components may be addressed by labels instead of just position.  The
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1547
version of records offered by Isabelle/HOL is slightly more advanced, though,
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1548
supporting \emph{extensible record schemes}.  This admits polymorphic
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1549
operations wrt.\ record extensions, yielding ``object-oriented'' effects like
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1550
(single) inheritance.  See also \cite{Naraschewski-Wenzel:1998:TPHOL} for more
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1551
details on object-oriented verification and record subtyping in HOL.
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1552
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1553
\subsection{Defining records}
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1554
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1555
\begin{figure}[htbp]
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1556
\begin{rail}
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1557
record  : 'record' typevarlist name '=' parent (field +);
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1558
parent  : ( () | type '+');
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1559
field   : name '::' type;
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1560
\end{rail}
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1561
\caption{Syntax of record type definitions}
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1562
\label{fig:HOL:record}
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1563
\end{figure}
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1564
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1565
Records have to be defined explicitely, fixing their field names and types,
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1566
and (optional) parent record scheme.  The theory syntax for record type
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1567
definitions is shown in Fig.~\ref{fig:HOL:record}.  For the definition of
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1568
`typevarlist' and `type' see \iflabelundefined{chap:classical}
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1569
{the appendix of the {\em Reference Manual\/}}%
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1570
{Appendix~\ref{app:TheorySyntax}}.
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1571
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1572
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1573
\subsection{Record operations and syntax}
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1574
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1575
\subsection{Proof tools}
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1576
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  1577
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1578
\section{Datatype declarations}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1579
\label{sec:HOL:datatype}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1580
\index{*datatype|(}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1581
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1582
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
  1583
non-trivial applications of \HOL.  In principle, such types could be
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1584
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
  1585
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
  1586
package of \HOL\ automates such chores.  It generates freeness theorems
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1587
and induction rules from a very simple description of the new type
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1588
provided by the user.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1589
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1590
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1591
\subsection{Basics}
3959
033633d9a032 Documented `addsplits'
nipkow
parents: 3881
diff changeset
  1592
\label{subsec:datatype:basics}
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1593
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1594
The general \HOL\ \texttt{datatype} definition is of the following form:
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1595
\[
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1596
\mathtt{datatype}~(\alpha@1, \dots, \alpha@n) \, t ~=~
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1597
C@1~\tau@{11}~\dots~\tau@{1k@1} ~\mid~ \dots ~\mid~
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1598
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
  1599
\]
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1600
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
  1601
names and $\tau@{ij}$ are types.  The latter may be one of the
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1602
following:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1603
\begin{itemize}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1604
\item type variables $\alpha@1, \dots, \alpha@n$,
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1605
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1606
\item types $(\beta@1, \dots, \beta@l) \, t'$ where $t'$ is a
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1607
  previously declared type constructor or type synonym and $\{\beta@1,
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1608
  \dots, \beta@l\} \subseteq \{\alpha@1, \dots, \alpha@n\}$,
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1609
  
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1610
\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
  1611
\end{itemize}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1612
Recursive occurences of $(\alpha@1, \dots, \alpha@n) \, t$ are quite
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1613
restricted.  To ensure that the new type is non-empty, at least one
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1614
constructor must consist of only non-recursive type components.  If
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1615
you would like one of the $\tau@{ij}$ to be a complex type expression
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1616
$\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
  1617
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
  1618
mentions the recursive type itself, thus ruling out problematic cases
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1619
like $\mathtt{datatype}~ t ~=~ C \, (t \To t)$, but also unproblematic
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1620
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
  1621
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1622
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
  1623
type:
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1624
\[ C@j :: [\tau@{j1},\dots,\tau@{jk@j}] \To (\alpha@1,\dots,\alpha@n)t \]
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1625
These functions have certain {\em freeness} properties --- they are
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1626
distinct:
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1627
\[
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1628
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
  1629
\mbox{for all}~ i \neq j.
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1630
\]
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1631
and they are injective:
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1632
\[
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1633
(C@j~x@1~\dots~x@{k@j} = C@j~y@1~\dots~y@{k@j}) =
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1634
(x@1 = y@1 \land \dots \land x@{k@j} = y@{k@j})
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1635
\]
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1636
Because the number of inequalities is quadratic in the number of
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1637
constructors, a different representation is used if there are $7$ or
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1638
more of them.  In that case every constructor term is mapped to a
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1639
natural number:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1640
\[
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1641
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
  1642
\]
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1643
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
  1644
\[
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1645
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
  1646
\]
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1647
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1648
\medskip Generally, the following structural induction rule is
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1649
provided:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1650
\[
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1651
\infer{P \, x}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1652
{\begin{array}{lcl}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1653
\Forall x@1\dots x@{k@1}.
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1654
  \List{P~x@{r@{11}}; \dots; P~x@{r@{1l@1}}} &
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1655
  \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
  1656
 & \vdots & \\
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1657
\Forall x@1\dots x@{k@m}.
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1658
  \List{P~x@{r@{m1}}; \dots; P~x@{r@{ml@m}}} &
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1659
  \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
  1660
\end{array}}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1661
\]
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1662
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
  1663
= (\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
  1664
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
  1665
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1666
For convenience, the following additional constructions are predefined for
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1667
each datatype.
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1668
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1669
\subsubsection{The \sdx{case} construct}
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1670
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1671
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
  1672
\[
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1673
\begin{array}{rrcl}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1674
\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
  1675
                           \vdots \\
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1676
                           \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
  1677
\end{array}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1678
\]
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1679
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
  1680
\S\ref{subsec:prod-sum}.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1681
\begin{warn}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1682
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
  1683
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
  1684
Violating this restriction results in strange error messages.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1685
\end{warn}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1686
4067
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1687
To perform case distinction on a goal containing a \texttt{case}-construct,
4068
99224854a0ac Indexed split_t_case.
nipkow
parents: 4067
diff changeset
  1688
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
  1689
\[
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1690
\begin{array}{@{}rcl@{}}
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1691
P(t_\mathtt{case}~f@1~\dots~f@m~e) &=&
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1692
((\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
  1693
                             P(f@1~~x@1\dots x@{k@1})) \\
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1694
&& ~\land~ \dots ~\land \\
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1695
&&~ (\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
  1696
                             P(f@m~~x@1\dots x@{k@m})))
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1697
\end{array}
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1698
\]
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1699
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
  1700
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
  1701
(see~\S\ref{subsec:HOL:case:splitting}).
207a7811faa9 Documented `split_t_case' thm genearted by datatype.
nipkow
parents: 3962
diff changeset
  1702
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1703
\subsubsection{The function \cdx{size}}\label{sec:HOL:size}
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1704
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1705
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
  1706
$\alpha\To nat$.  Each datatype defines a particular instance of \texttt{size}
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1707
according to the following scheme:
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1708
\[
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1709
size(C@j~x@{j1}~\dots~x@{jk@1}) =
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1710
\left\{
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1711
\begin{array}{ll}
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1712
0 & \mbox{if $Rec@j = \emptyset$} \\
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1713
size(x@{r@{j1}}) + \cdots + size(x@{r@{jl@j}}) + 1 &
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1714
 \mbox{if $Rec@j = \{r@{j1},\dots,r@{jl@j}\}$}
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1715
\end{array}
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1716
\right.
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1717
\]
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1718
where $Rec@j$ is defined above.  Viewing datatypes as generalized trees, the
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1719
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
  1720
subtrees $+1$.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1721
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1722
\subsection{Defining datatypes}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1723
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1724
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
  1725
{\tt datatype}.  The definition following this must conform to the
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1726
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
  1727
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
  1728
extended with the new type, the constructors, and the theorems listed
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1729
in the previous section.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1730
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1731
\begin{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1732
\begin{rail}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1733
typedecl : typevarlist id '=' (cons + '|')
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1734
         ;
1581
a82618a900e5 updated syntax of datatype declaration
clasohm
parents: 1578
diff changeset
  1735
cons     : name (typ *) ( () | mixfix )
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1736
         ;
1581
a82618a900e5 updated syntax of datatype declaration
clasohm
parents: 1578
diff changeset
  1737
typ      : id | tid | ('(' typevarlist id ')')
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1738
         ;
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1739
\end{rail}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1740
\caption{Syntax of datatype declarations}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1741
\label{datatype-grammar}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1742
\end{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1743
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1744
\begin{warn}
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1745
  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
  1746
  indirectly, on the theory \texttt{Arith}, if necessary by including it
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1747
  explicitly as a parent.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1748
\end{warn}
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1749
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1750
Most of the theorems about the datatype become part of the default simpset
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1751
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
  1752
automatically.  Only induction is invoked by hand:
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1753
\begin{ttdescription}
3045
4ef28e05781b Added 'induct_tac'
nipkow
parents: 2994
diff changeset
  1754
\item[\ttindexbold{induct_tac} {\tt"}$x${\tt"} $i$]
4ef28e05781b Added 'induct_tac'
nipkow
parents: 2994
diff changeset
  1755
 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
  1756
 type of $x$ is a datatype or type \tydx{nat}.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1757
\end{ttdescription}
3287
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1758
In some cases, induction is overkill and a case distinction over all
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1759
constructors of the datatype suffices:
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1760
\begin{ttdescription}
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1761
\item[\ttindexbold{exhaust_tac} {\tt"}$u${\tt"} $i$]
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1762
 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
  1763
 must be a datatype or type \tydx{nat}.  If the datatype has $n$ constructors
3287
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1764
 $C@1$, \dots $C@n$, subgoal $i$ is replaced by $n$ new subgoals which
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1765
 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
  1766
 $j=1$, $\dots$,~$n$.
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1767
\end{ttdescription}
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1768
\begin{warn}
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1769
  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
  1770
  the premises of the subgoal.  Exhaustion works for arbitrary terms.
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1771
\end{warn}
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1772
\bigskip
3287
078be5581967 Documented exhaust_tac.
nipkow
parents: 3181
diff changeset
  1773
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1774
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1775
For the technically minded, we give a more detailed description.
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  1776
Reading the theory file produces an \ML\ structure which, in addition to the
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1777
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
  1778
defined in the file.  Each structure $t$ contains the following
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1779
elements:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1780
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1781
val distinct : thm list
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1782
val inject : thm list
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1783
val induct : thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1784
val cases : thm list
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1785
val simps : thm list
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1786
val induct_tac : string -> int -> tactic
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1787
\end{ttbox}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1788
{\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
  1789
described above.  For user convenience, \texttt{distinct} contains
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1790
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
  1791
  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
  1792
  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
  1793
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1794
\subsection{Examples}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1795
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1796
\subsubsection{The datatype $\alpha~mylist$}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1797
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1798
We want to define the type $\alpha~mylist$.\footnote{This is just an
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1799
  example, there is already a list type in \HOL, of course.} To do
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1800
this we have to build a new theory that contains the type definition.
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
  1801
We start from the theory of arithmetic.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1802
\begin{ttbox}
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
  1803
MyList = Arith +
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1804
  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
  1805
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1806
\end{ttbox}
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1807
After loading the theory (with \verb$use_thy "MyList"$), we can prove
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1808
$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
  1809
goal with $x$ quantified at the object-level.  This will be stripped
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1810
later using \ttindex{qed_spec_mp}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1811
\begin{ttbox}
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
  1812
Goal "!x. Cons x xs ~= xs";
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1813
{\out Level 0}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1814
{\out ! x. Cons x xs ~= xs}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1815
{\out  1. ! x. Cons x xs ~= xs}
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
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
  1818
\begin{ttbox}
3045
4ef28e05781b Added 'induct_tac'
nipkow
parents: 2994
diff changeset
  1819
by (induct_tac "xs" 1);
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1820
{\out Level 1}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1821
{\out ! x. Cons x xs ~= xs}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1822
{\out  1. ! x. Cons x Nil ~= Nil}
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1823
{\out  2. !!a mylist.}
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1824
{\out        ! x. Cons x mylist ~= mylist ==>}
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1825
{\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
  1826
\end{ttbox}
2495
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1827
The first subgoal can be proved using the simplifier.
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1828
Isabelle has already added the freeness properties of lists to the 
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1829
default simplification set.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1830
\begin{ttbox}
2495
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1831
by (Simp_tac 1);
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1832
{\out Level 2}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1833
{\out ! x. Cons x xs ~= xs}
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1834
{\out  1. !!a mylist.}
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1835
{\out        ! x. Cons x mylist ~= mylist ==>}
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1836
{\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
  1837
\end{ttbox}
2495
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1838
Similarly, we prove the remaining goal.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1839
\begin{ttbox}
2495
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1840
by (Asm_simp_tac 1);
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1841
{\out Level 3}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1842
{\out ! x. Cons x xs ~= xs}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1843
{\out No subgoals!}
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1844
\ttbreak
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1845
qed_spec_mp "not_Cons_self";
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1846
{\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
  1847
\end{ttbox}
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1848
Because both subgoals could have been proved by \texttt{Asm_simp_tac}
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1849
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
  1850
\begin{ttbox}
2495
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1851
by (ALLGOALS Asm_simp_tac);
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1852
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1853
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1854
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1855
\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
  1856
3181
wenzelm
parents: 3180
diff changeset
  1857
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
  1858
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
  1859
notation \verb|#| for \texttt{Cons}.  To do this we simply add mixfix
3181
wenzelm
parents: 3180
diff changeset
  1860
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
  1861
\begin{ttbox}
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
  1862
MyList = Arith +
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1863
  datatype 'a mylist =
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1864
    Nil ("[]")  |
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1865
    Cons 'a ('a mylist)  (infixr "#" 70)
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1866
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1867
\end{ttbox}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1868
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
  1869
proof is the same.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1870
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1871
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1872
\subsubsection{A datatype for weekdays}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1873
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1874
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
  1875
\begin{ttbox}
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
  1876
Days = Main +
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1877
  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
  1878
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1879
\end{ttbox}
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1880
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
  1881
on \texttt{Arith}.  Inequality is expressed via a function
3160
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1882
\verb|days_ord|.  The theorem \verb|Mon ~= Tue| is not directly
08e364dfe518 minor tuning;
wenzelm
parents: 3152
diff changeset
  1883
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
  1884
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
  1885
\begin{ttbox}
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
  1886
Goal "Mon ~= Tue";
2495
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1887
by (Simp_tac 1);
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1888
\end{ttbox}
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1889
You need not derive such inequalities explicitly: the simplifier will dispose
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1890
of them automatically.
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1891
\index{*datatype|)}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1892
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1893
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1894
\section{Recursive function definitions}\label{sec:HOL:recursive}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1895
\index{recursive functions|see{recursion}}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1896
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1897
Isabelle/HOL provides two means of declaring recursive functions.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1898
\begin{itemize}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1899
\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
  1900
  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
  1901
  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
  1902
  often wanted, and it is easy to use.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1903
  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1904
\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
  1905
  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
  1906
  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
  1907
  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
  1908
  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
  1909
  can make work difficult.%
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1910
  \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
  1911
    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
  1912
    and assisting with its installation.}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1913
\end{itemize}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1914
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1915
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1916
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
  1917
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
  1918
already have been declared as a constant.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1919
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1920
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
  1921
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
  1922
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
  1923
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
  1924
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
  1925
the desired recursion equations as theorems.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1926
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1927
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1928
\subsection{Primitive recursive functions}
1422
bc628f4ef0cb New version of type sections and many small changes.
nipkow
parents: 1389
diff changeset
  1929
\label{sec:HOL:primrec}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1930
\index{recursion!primitive|(}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1931
\index{*primrec|(}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1932
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1933
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
  1934
  primitive recursion}.  In principle, one can define
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1935
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
  1936
new axioms.  Here is an example:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1937
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1938
Append = MyList +
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1939
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
  1940
rules 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1941
   app_Nil   "app [] ys = ys"
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
  1942
   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
  1943
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1944
\end{ttbox}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1945
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
  1946
inconsistency, as in \verb$app [] ys = us$.
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1947
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1948
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
  1949
recursive functions on datatypes:
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1950
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1951
Append = MyList +
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1952
consts app :: ['a mylist, 'a mylist] => 'a mylist
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1953
primrec app MyList.mylist
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1954
   "app [] ys = ys"
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1955
   "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
  1956
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1957
\end{ttbox}
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1958
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
  1959
recursive definition, preserving consistency.  For example
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1960
\begin{ttbox}
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1961
primrec app MyList.mylist
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1962
    "app [] ys = us"
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1963
\end{ttbox}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1964
is rejected with an error message \texttt{Extra variables on rhs}.
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1965
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1966
\bigskip
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1967
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1968
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
  1969
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1970
primrec {\it function} {\it type}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1971
    {\it reduction rules}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1972
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1973
where
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1974
\begin{itemize}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1975
\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
  1976
  or a \textit{string}.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1977
\item \textit{type} is the name of the datatype, either as an \textit{id} or
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
  1978
  in the long form \texttt{$T$. $t$} ($T$ is the name of the theory
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1979
  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
  1980
  The long form is required if the \texttt{datatype} and the {\tt
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1981
    primrec} sections are in different theories.
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1982
\item \textit{reduction rules} specify one or more equations of the form
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1983
  \[ f \, x@1 \, \dots \, x@m \, (C \, y@1 \, \dots \, y@k) \, z@1 \,
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1984
  \dots \, z@n = r \] such that $C$ is a constructor of the datatype,
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1985
  $r$ contains only the free variables on the left-hand side, and all
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1986
  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
  1987
  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
  1988
  constructor.  The order is immaterial.  Also note that all reduction
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  1989
  rules are added to the default simpset!
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1990
  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  1991
  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
  1992
  \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
  1993
  \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
  1994
\end{itemize}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1995
2495
82ec47e0a8d3 New discussion of implicit simpsets & clasets
paulson
parents: 1859
diff changeset
  1996
The primitive recursive function can have infix or mixfix syntax:
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  1997
\begin{ttbox}\underscoreon
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  1998
Append = MyList +
3180
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  1999
consts "@"  :: ['a mylist, 'a mylist] => 'a mylist  (infixr 60)
3fff6839c616 mylist instead of list in datatype ex;
wenzelm
parents: 3161
diff changeset
  2000
primrec "op @" MyList.mylist
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2001
   "[] @ ys = ys"
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2002
   "(x#xs) @ ys = x#(xs @ ys)"
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2003
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2004
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2005
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2006
The reduction rules for {\tt\at} become part of the default simpset, which
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2007
leads to short proofs:
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2008
\begin{ttbox}\underscoreon
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
  2009
Goal "(xs @ ys) @ zs = xs @ (ys @ zs)";
3045
4ef28e05781b Added 'induct_tac'
nipkow
parents: 2994
diff changeset
  2010
by (induct\_tac "xs" 1);
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2011
by (ALLGOALS Asm\_simp\_tac);
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2012
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2013
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2014
\index{recursion!primitive|)}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2015
\index{*primrec|)}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2016
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2017
4803
8428d4699d58 Clearer description of recdef, including use of {}
paulson
parents: 4591
diff changeset
  2018
\subsection{General recursive functions}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2019
\label{sec:HOL:recdef}
3962
69c76eb80273 Fixed the index entries for "recursion, general"
paulson
parents: 3959
diff changeset
  2020
\index{recursion!general|(}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2021
\index{*recdef|(}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2022
4803
8428d4699d58 Clearer description of recdef, including use of {}
paulson
parents: 4591
diff changeset
  2023
Using \texttt{recdef}, you can declare functions involving nested recursion
8428d4699d58 Clearer description of recdef, including use of {}
paulson
parents: 4591
diff changeset
  2024
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
  2025
syntactic restrictions.  Termination is proved by showing that each recursive
8428d4699d58 Clearer description of recdef, including use of {}
paulson
parents: 4591
diff changeset
  2026
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
  2027
supplying a well-founded relation.
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2028
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2029
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
  2030
\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
  2031
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
  2032
macro for \texttt{Suc~0}.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2033
\begin{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2034
consts fib  :: "nat => nat"
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2035
recdef fib "less_than"
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2036
    "fib 0 = 0"
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2037
    "fib 1 = 1"
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2038
    "fib (Suc(Suc x)) = (fib x + fib (Suc x))"
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2039
\end{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2040
4591
f88e466c43fa Fixed the description of recdef
paulson
parents: 4503
diff changeset
  2041
With \texttt{recdef}, function definitions may be incomplete, and patterns may
f88e466c43fa Fixed the description of recdef
paulson
parents: 4503
diff changeset
  2042
overlap, as in functional programming.  The \texttt{recdef} package
f88e466c43fa Fixed the description of recdef
paulson
parents: 4503
diff changeset
  2043
disambiguates overlapping patterns by taking the order of rules into account.
f88e466c43fa Fixed the description of recdef
paulson
parents: 4503
diff changeset
  2044
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
  2045
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
  2046
\begin{ttbox}
8428d4699d58 Clearer description of recdef, including use of {}
paulson
parents: 4591
diff changeset
  2047
consts hd :: 'a list => 'a
8428d4699d58 Clearer description of recdef, including use of {}
paulson
parents: 4591
diff changeset
  2048
recdef hd "\{\}"
8428d4699d58 Clearer description of recdef, including use of {}
paulson
parents: 4591
diff changeset
  2049
    "hd (x#l) = x"
8428d4699d58 Clearer description of recdef, including use of {}
paulson
parents: 4591
diff changeset
  2050
\end{ttbox}
8428d4699d58 Clearer description of recdef, including use of {}
paulson
parents: 4591
diff changeset
  2051
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
  2052
relation, $\{\}$.
4591
f88e466c43fa Fixed the description of recdef
paulson
parents: 4503
diff changeset
  2053
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2054
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
  2055
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
  2056
admits no infinitely decreasing chains
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2057
\[ \cdots\prec x@n\prec\cdots\prec x@1. \]
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2058
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
  2059
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
  2060
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2061
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
  2062
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
  2063
operators and automatically proves that the constructed relation is
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2064
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
  2065
\begin{itemize}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2066
\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
  2067
  (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
  2068
  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2069
\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
  2070
  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
  2071
  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
  2072
  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
  2073
  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
  2074
  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
  2075
                                                    
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2076
\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
  2077
  \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
  2078
  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
  2079
  relation.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2080
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2081
\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
  2082
  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
  2083
  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
  2084
  is less than $y@2$ according to~$R@2$.
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 \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
  2087
\end{itemize}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2088
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2089
We can use \texttt{measure} to declare Euclid's algorithm for the greatest
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
  2090
common divisor.  The measure function, $\lambda(m,n). n$, specifies that the
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2091
recursion terminates because argument~$n$ decreases.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2092
\begin{ttbox}
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
  2093
recdef gcd "measure ((\%(m,n). n) ::nat*nat=>nat)"
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2094
    "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
  2095
\end{ttbox}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2096
4591
f88e466c43fa Fixed the description of recdef
paulson
parents: 4503
diff changeset
  2097
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
  2098
\begin{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2099
recdef {\it function} {\it rel}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2100
    congs   {\it congruence rules}      {\bf(optional)}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2101
    simpset {\it simplification set}      {\bf(optional)}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2102
   {\it reduction rules}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2103
\end{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2104
where
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2105
\begin{itemize}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2106
\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
  2107
  or a \textit{string}.  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2108
  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2109
\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
  2110
  relation.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2111
  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2112
\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
  2113
  circumstances.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2114
  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2115
\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
  2116
  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
  2117
    conditions}: assertions that arguments of recursive calls decrease under
4877
7a046198610e fixed simpset(), claset();
wenzelm
parents: 4834
diff changeset
  2118
  \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
  2119
  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
  2120
  above. 
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2121
  
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2122
\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
  2123
  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
  2124
  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
  2125
  $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
  2126
  is a \texttt{datatype}.  
f88e466c43fa Fixed the description of recdef
paulson
parents: 4503
diff changeset
  2127
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2128
  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
  2129
  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
  2130
  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
  2131
  as a list of theorems.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2132
\end{itemize}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2133
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2134
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
  2135
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
  2136
theorems.  
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.rules;
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2139
{\out ["! m n. n ~= 0 --> m mod n < n}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2140
{\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
  2141
{\out : thm list}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2142
\end{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2143
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
  2144
illustrates how to prove termination conditions afterwards.  The function
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2145
\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
  2146
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
  2147
$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
  2148
conditions: 
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2149
\begin{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2150
Tfl.tgoalw thy [] gcd.rules;
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2151
{\out Level 0}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2152
{\out ! m n. n ~= 0 --> m mod n < n}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2153
{\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
  2154
\end{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2155
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
  2156
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
  2157
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
  2158
\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
  2159
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
  2160
involving the recursive function itself.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2161
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2162
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
  2163
automatically if supplied with the right simpset.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2164
\begin{ttbox}
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
  2165
recdef gcd "measure ((\%(m,n). n) ::nat*nat=>nat)"
4877
7a046198610e fixed simpset(), claset();
wenzelm
parents: 4834
diff changeset
  2166
  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
  2167
    "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
  2168
\end{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2169
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2170
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
  2171
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
  2172
rule is
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2173
\begin{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2174
gcd.induct;
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2175
{\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
  2176
\end{ttbox}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2177
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
  2178
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
  2179
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
  2180
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
  2181
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2182
\index{recursion!general|)}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2183
\index{*recdef|)}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2184
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2185
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2186
\section{Inductive and coinductive definitions}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2187
\index{*inductive|(}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2188
\index{*coinductive|(}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2189
2975
230f456956a2 Corrected the informal description of coinductive definition
paulson
parents: 2933
diff changeset
  2190
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
  2191
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
  2192
example, a structural operational semantics is an inductive definition of an
230f456956a2 Corrected the informal description of coinductive definition
paulson
parents: 2933
diff changeset
  2193
evaluation relation.  Dually, a {\bf coinductive definition} specifies the
230f456956a2 Corrected the informal description of coinductive definition
paulson
parents: 2933
diff changeset
  2194
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
  2195
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
  2196
is using bisimulation relations to formalize equivalence of processes and
230f456956a2 Corrected the informal description of coinductive definition
paulson
parents: 2933
diff changeset
  2197
infinite data structures.
1113
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
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
  2200
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
  2201
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
  2202
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
  2203
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2204
Each (co)inductive definition adds definitions to the theory and also
3315
16d603a560d8 Documented `size' function for datatypes.
nipkow
parents: 3287
diff changeset
  2205
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
  2206
substructure of the main theory structure.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2207
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2208
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
  2209
paper,%
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2210
\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
  2211
  distributed with Isabelle.}  %
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2212
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
  2213
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
  2214
(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
  2215
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
  2216
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2217
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2218
\subsection{The result structure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2219
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
  2220
others are self-explanatory.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2221
\begin{description}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2222
\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
  2223
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2224
\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
  2225
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2226
\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
  2227
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2228
\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
  2229
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
  2230
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2231
\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
  2232
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
  2233
names given them in the theory file. 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2234
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2235
\item[\tt elim] is the elimination rule.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2236
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2237
\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
  2238
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
  2239
\end{description}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2240
2933
f842a75d9624 Updated discussion and references for inductive definitions
paulson
parents: 2926
diff changeset
  2241
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
  2242
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
  2243
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
  2244
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
  2245
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2246
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
  2247
specifying the types of all these components.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2248
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2249
\begin{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2250
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2251
sig
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2252
val thy          : theory
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2253
val defs         : thm list
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2254
val mono         : thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2255
val unfold       : thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2256
val intrs        : thm list
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2257
val elim         : thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2258
val mk_cases     : thm list -> string -> thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2259
{\it(Inductive definitions only)} 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2260
val induct       : thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2261
val mutual_induct: thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2262
{\it(Coinductive definitions only)}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2263
val coinduct    : thm
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2264
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2265
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2266
\hrule
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2267
\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
  2268
\end{figure}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2269
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2270
\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
  2271
An inductive definition has the form
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2272
\begin{ttbox}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2273
inductive    \textit{inductive sets}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2274
  intrs      \textit{introduction rules}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2275
  monos      \textit{monotonicity theorems}
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2276
  con_defs   \textit{constructor definitions}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2277
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2278
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
  2279
{\tt coinductive}.  
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2280
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2281
The \texttt{monos} and \texttt{con_defs} sections are optional.  If present,
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2282
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
  2283
of type \texttt{thm list}.  It is simply inserted into the generated
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2284
\ML{} file that is generated from the theory definition; if it is
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2285
ill-formed, it will trigger ML error messages.  You can then inspect
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2286
the file on your directory.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2287
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2288
\begin{itemize}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2289
\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
  2290
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2291
\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
  2292
  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
  2293
  the rule in the result structure.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2294
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2295
\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
  2296
  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
  2297
  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
  2298
  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
  2299
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2300
\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
  2301
  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
  2302
\end{itemize}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2303
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2304
The package has a few notable restrictions:
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2305
\begin{itemize}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2306
\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
  2307
  constants.
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2308
  
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2309
\item The names of the recursive sets must be alphanumeric
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2310
  identifiers.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2311
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2312
\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
  2313
may contain any number of side-conditions.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2314
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2315
\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
  2316
  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
  2317
\end{itemize}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2318
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2319
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2320
\subsection{Example of an inductive definition}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2321
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
  2322
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
  2323
inductively, with two introduction rules:
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2324
\begin{ttbox}
1389
fbe857ddc80d removed quotes from consts and syntax sections
clasohm
parents: 1234
diff changeset
  2325
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
  2326
inductive "Fin A"
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2327
  intrs
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2328
    emptyI  "{\ttlbrace}{\ttrbrace} : Fin A"
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2329
    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
  2330
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2331
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
  2332
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
  2333
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
  2334
rule is \texttt{Fin.induct}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2335
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2336
For another example, here is a theory file defining the accessible
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2337
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
  2338
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
  2339
\verb|Pow_mono| in the \texttt{monos} list.  The paper
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2340
\cite{paulson-CADE} discusses a \ZF\ version of this example in more
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2341
detail.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2342
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2343
Acc = WF + 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2344
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
  2345
       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
  2346
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
  2347
inductive "acc r"
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2348
  intrs
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2349
     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
  2350
  monos   "[Pow_mono]"
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2351
end
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2352
\end{ttbox}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2353
The \HOL{} distribution contains many other inductive definitions.
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2354
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
  2355
theory \texttt{HOL/Induct/LList.thy} contains coinductive definitions.
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2356
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
  2357
  IMP}, \texttt{Lambda} and \texttt{Auth}.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2358
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2359
\index{*coinductive|)} \index{*inductive|)}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2360
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2361
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2362
\section{The examples directories}
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2363
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2364
Directory \texttt{HOL/Auth} contains theories for proving the correctness of 
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2365
cryptographic protocols.  The approach is based upon operational 
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2366
semantics~\cite{paulson-security} rather than the more usual belief logics.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2367
On the same directory are proofs for some standard examples, such as the 
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2368
Needham-Schroeder public-key authentication protocol~\cite{paulson-ns} 
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2369
and the Otway-Rees protocol.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2370
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2371
Directory \texttt{HOL/IMP} contains a formalization of various denotational,
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2372
operational and axiomatic semantics of a simple while-language, the necessary
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2373
equivalence proofs, soundness and completeness of the Hoare rules with respect
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2374
to the 
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2375
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
  2376
condition generator.  Much of development is taken from
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2377
Winskel~\cite{winskel93}.  For details see~\cite{nipkow-IMP}.
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2378
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2379
Directory \texttt{HOL/Hoare} contains a user friendly surface syntax for Hoare
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2380
logic, including a tactic for generating verification-conditions.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2381
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2382
Directory \texttt{HOL/MiniML} contains a formalization of the type system of the
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2383
core functional language Mini-ML and a correctness proof for its type
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2384
inference algorithm $\cal W$~\cite{milner78,nazareth-nipkow}.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2385
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2386
Directory \texttt{HOL/Lambda} contains a formalization of untyped
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2387
$\lambda$-calculus in de~Bruijn notation and Church-Rosser proofs for $\beta$
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2388
and $\eta$ reduction~\cite{Nipkow-CR}.
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2389
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2390
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
  2391
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
  2392
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
  2393
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
  2394
with nested recursion.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2395
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2396
Directory \texttt{HOL/Induct} presents simple examples of (co)inductive
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2397
definitions.  
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
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{PropLog} proves the soundness and completeness of
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2400
  classical propositional logic, given a truth table semantics.  The only
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2401
  connective is $\imp$.  A Hilbert-style axiom system is specified, and its
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2402
  set of theorems defined inductively.  A similar proof in \ZF{} is
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2403
  described elsewhere~\cite{paulson-set-II}.
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2404
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2405
\item Theory \texttt{Term} develops an experimental recursive type definition;
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2406
  the recursion goes through the type constructor~\tydx{list}.
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2407
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2408
\item Theory \texttt{Simult} constructs mutually recursive sets of trees and
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2409
  forests, including induction and recursion rules.
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2410
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2411
\item The definition of lazy lists demonstrates methods for handling
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2412
  infinite data structures and coinduction in higher-order
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2413
  logic~\cite{paulson-coind}.%
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2414
\footnote{To be precise, these lists are \emph{potentially infinite} rather
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2415
  than lazy.  Lazy implies a particular operational semantics.}
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2416
  Theory \thydx{LList} defines an operator for
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2417
  corecursion on lazy lists, which is used to define a few simple functions
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2418
  such as map and append.   A coinduction principle is defined
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2419
  for proving equations on lazy lists.
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2420
  
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2421
\item Theory \thydx{LFilter} defines the filter functional for lazy lists.
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2422
  This functional is notoriously difficult to define because finding the next
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2423
  element meeting the predicate requires possibly unlimited search.  It is not
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2424
  computable, but can be expressed using a combination of induction and
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2425
  corecursion.  
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2426
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2427
\item Theory \thydx{Exp} illustrates the use of iterated inductive definitions
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2428
  to express a programming language semantics that appears to require mutual
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2429
  induction.  Iterated induction allows greater modularity.
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2430
\end{itemize}
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2431
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2432
Directory \texttt{HOL/ex} contains other examples and experimental proofs in
3132
8e956415412f Documents directory Induct; stylistic improvements
paulson
parents: 3045
diff changeset
  2433
{\HOL}.  
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2434
\begin{itemize}
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2435
\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
  2436
  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
  2437
  defines the Fibonacci function.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2438
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2439
\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
  2440
  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
  2441
  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
  2442
  or $p$ divides~$n$.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2443
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2444
\item Theory \texttt{Primrec} develops some computation theory.  It
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2445
  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
  2446
  proof that Ackermann's function is not primitive recursive.
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2447
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2448
\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
  2449
  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
  2450
  moderately difficult problems involving equality and quantifiers.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2451
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2452
\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
  2453
    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
  2454
  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
  2455
  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
  2456
  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
  2457
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2458
\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
  2459
  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
  2460
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2461
\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
  2462
  \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
  2463
3489
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2464
\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
  2465
  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
  2466
  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
  2467
  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
  2468
  environment, which makes a coinductive argument appropriate.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2469
\end{itemize}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2470
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2471
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2472
\goodbreak
1163
c080ff36d24e changed 'chol' labels to 'hol'; added a few parentheses
clasohm
parents: 1162
diff changeset
  2473
\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
  2474
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
  2475
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
  2476
it is so easily expressed:
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2477
\[  \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
  2478
    \forall x::\alpha. f~x \not= S 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2479
\] 
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2480
%
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2481
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
  2482
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
  2483
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
  2484
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
  2485
The Isabelle proof uses \HOL's set theory, with the type $\alpha\,set$ and
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
  2486
the operator \cdx{range}.
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
  2487
\begin{ttbox}
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
  2488
context Set.thy;
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
  2489
\end{ttbox}
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
  2490
The set~$S$ is given as an unknown instead of a
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2491
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
  2492
\begin{ttbox}
5151
1e944fe5ce96 Got rid of obsolete "goal" commands.
paulson
parents: 4877
diff changeset
  2493
Goal "?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
  2494
{\out Level 0}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2495
{\out ?S ~: range f}
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2496
{\out  1. ?S ~: range f}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2497
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2498
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
  2499
$\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
  2500
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2501
by (resolve_tac [notI] 1);
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2502
{\out Level 1}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2503
{\out ?S ~: range f}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2504
{\out  1. ?S : range f ==> False}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2505
\ttbreak
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2506
by (eresolve_tac [rangeE] 1);
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2507
{\out Level 2}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2508
{\out ?S ~: range f}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2509
{\out  1. !!x. ?S = f x ==> False}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2510
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2511
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
  2512
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
  2513
any~$\Var{c}$.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2514
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2515
by (eresolve_tac [equalityCE] 1);
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2516
{\out Level 3}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2517
{\out ?S ~: range f}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2518
{\out  1. !!x. [| ?c3 x : ?S; ?c3 x : f x |] ==> False}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2519
{\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
  2520
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2521
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
  2522
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
  2523
$\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
  2524
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
  2525
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2526
by (dresolve_tac [CollectD] 1);
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2527
{\out Level 4}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2528
{\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
  2529
{\out  1. !!x. [| ?c3 x : f x; ?P7(?c3 x) |] ==> False}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2530
{\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
  2531
\end{ttbox}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2532
Forcing a contradiction between the two assumptions of subgoal~1
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2533
completes the instantiation of~$S$.  It is now the set $\{x. x\not\in
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2534
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
  2535
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2536
by (contr_tac 1);
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2537
{\out Level 5}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2538
{\out {\ttlbrace}x. x ~: f x{\ttrbrace} ~: range f}
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2539
{\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
  2540
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2541
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
  2542
assumption, we employ \ttindex{swap_res_tac}:
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2543
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2544
by (swap_res_tac [CollectI] 1);
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2545
{\out Level 6}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2546
{\out {\ttlbrace}x. x ~: f x{\ttrbrace} ~: range f}
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2547
{\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
  2548
\ttbreak
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2549
by (assume_tac 1);
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2550
{\out Level 7}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2551
{\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
  2552
{\out No subgoals!}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2553
\end{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2554
How much creativity is required?  As it happens, Isabelle can prove this
4877
7a046198610e fixed simpset(), claset();
wenzelm
parents: 4834
diff changeset
  2555
theorem automatically.  The default classical set {\tt claset()} contains rules
1162
7be0684950a3 changes made by Lawrence Paulson
clasohm
parents: 1113
diff changeset
  2556
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
  2557
\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
  2558
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
  2559
successfully navigates through the large search space.
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2560
\index{search!best-first}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2561
\begin{ttbox}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2562
choplev 0;
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2563
{\out Level 0}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2564
{\out ?S ~: range f}
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2565
{\out  1. ?S ~: range f}
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2566
\ttbreak
4877
7a046198610e fixed simpset(), claset();
wenzelm
parents: 4834
diff changeset
  2567
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
  2568
{\out Level 1}
3152
065c701c7827 misc tuning, cleanup, improvements;
wenzelm
parents: 3132
diff changeset
  2569
{\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
  2570
{\out No subgoals!}
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2571
\end{ttbox}
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2572
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
  2573
theory \texttt{Set}, for example by executing
afa802078173 Added documentation for recdef, and tidied some other material
paulson
parents: 3487
diff changeset
  2574
\ttindex{set_current_thy}~{\tt"Set"}.  Otherwise the default claset may not
2926
15c21c1ad71d Thorough update.
nipkow
parents: 2495
diff changeset
  2575
contain the rules for set theory.
1113
dd7284573601 converted HOL.tex to CHOL.tex; replaced HOL.tex by CHOL.tex
clasohm
parents:
diff changeset
  2576
\index{higher-order logic|)}
5735
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  2577
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  2578
%%% Local Variables: 
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  2579
%%% mode: latex
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  2580
%%% TeX-master: "logics"
6b8bb85c3848 started to add records;
wenzelm
parents: 5151
diff changeset
  2581
%%% End: