doc-src/TutorialI/Misc/document/case_exprs.tex
author chaieb
Wed, 19 May 2004 11:23:59 +0200
changeset 14758 af3b71a46a1c
parent 13791 3b6ff7ceaf27
child 15481 fc075ae929e4
permissions -rw-r--r--
A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller. the tactic has also changed and allows the abstaction over fuction occurences whose type is nat or int.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9742
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
     1
%
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
     2
\begin{isabellebody}%
10267
325ead6d9457 updated;
wenzelm
parents: 10187
diff changeset
     3
\def\isabellecontext{case{\isacharunderscore}exprs}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
     4
\isamarkupfalse%
9742
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
     5
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10824
diff changeset
     6
\isamarkupsubsection{Case Expressions%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
     7
}
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
     8
\isamarkuptrue%
9742
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
     9
%
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    10
\begin{isamarkuptext}%
11456
7eb63f63e6c6 revisions and indexing
paulson
parents: 11428
diff changeset
    11
\label{sec:case-expressions}\index{*case expressions}%
7eb63f63e6c6 revisions and indexing
paulson
parents: 11428
diff changeset
    12
HOL also features \isa{case}-expressions for analyzing
9742
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    13
elements of a datatype. For example,
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    14
\begin{isabelle}%
12699
deae80045527 *** empty log message ***
nipkow
parents: 11866
diff changeset
    15
\ \ \ \ \ case\ xs\ of\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymRightarrow}\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharbar}\ y\ {\isacharhash}\ ys\ {\isasymRightarrow}\ y%
9924
3370f6aa3200 updated;
wenzelm
parents: 9834
diff changeset
    16
\end{isabelle}
12699
deae80045527 *** empty log message ***
nipkow
parents: 11866
diff changeset
    17
evaluates to \isa{{\isacharbrackleft}{\isacharbrackright}} if \isa{xs} is \isa{{\isacharbrackleft}{\isacharbrackright}} and to \isa{y} if 
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9742
diff changeset
    18
\isa{xs} is \isa{y\ {\isacharhash}\ ys}. (Since the result in both branches must be of
12699
deae80045527 *** empty log message ***
nipkow
parents: 11866
diff changeset
    19
the same type, it follows that \isa{y} is of type \isa{{\isacharprime}a\ list} and hence
deae80045527 *** empty log message ***
nipkow
parents: 11866
diff changeset
    20
that \isa{xs} is of type \isa{{\isacharprime}a\ list\ list}.)
9742
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    21
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    22
In general, if $e$ is a term of the datatype $t$ defined in
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    23
\S\ref{sec:general-datatype} above, the corresponding
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    24
\isa{case}-expression analyzing $e$ is
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    25
\[
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    26
\begin{array}{rrcl}
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    27
\isa{case}~e~\isa{of} & C@1~x@ {11}~\dots~x@ {1k@1} & \To & e@1 \\
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    28
                           \vdots \\
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    29
                           \mid & C@m~x@ {m1}~\dots~x@ {mk@m} & \To & e@m
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    30
\end{array}
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    31
\]
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    32
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    33
\begin{warn}
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    34
\emph{All} constructors must be present, their order is fixed, and nested
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    35
patterns are not supported.  Violating these restrictions results in strange
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    36
error messages.
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    37
\end{warn}
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    38
\noindent
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    39
Nested patterns can be simulated by nested \isa{case}-expressions: instead
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    40
of
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    41
\begin{isabelle}%
12699
deae80045527 *** empty log message ***
nipkow
parents: 11866
diff changeset
    42
\ \ \ \ \ case\ xs\ of\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharequal}{\isachargreater}\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharbar}\ {\isacharbrackleft}x{\isacharbrackright}\ {\isacharequal}{\isachargreater}\ x\ {\isacharbar}\ x\ {\isacharhash}\ {\isacharparenleft}y\ {\isacharhash}\ zs{\isacharparenright}\ {\isacharequal}{\isachargreater}\ y%
9924
3370f6aa3200 updated;
wenzelm
parents: 9834
diff changeset
    43
\end{isabelle}
9834
109b11c4e77e *** empty log message ***
nipkow
parents: 9792
diff changeset
    44
write
109b11c4e77e *** empty log message ***
nipkow
parents: 9792
diff changeset
    45
\begin{isabelle}%
12699
deae80045527 *** empty log message ***
nipkow
parents: 11866
diff changeset
    46
\ \ \ \ \ case\ xs\ of\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymRightarrow}\ {\isacharbrackleft}{\isacharbrackright}\isanewline
10950
aa788fcb75a5 updated;
wenzelm
parents: 10878
diff changeset
    47
\isaindent{\ \ \ \ \ }{\isacharbar}\ x\ {\isacharhash}\ ys\ {\isasymRightarrow}\ case\ ys\ of\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymRightarrow}\ x\ {\isacharbar}\ y\ {\isacharhash}\ zs\ {\isasymRightarrow}\ y%
9924
3370f6aa3200 updated;
wenzelm
parents: 9834
diff changeset
    48
\end{isabelle}
9742
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    49
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    50
Note that \isa{case}-expressions may need to be enclosed in parentheses to
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    51
indicate their scope%
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    52
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    53
\isamarkuptrue%
9742
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    54
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10824
diff changeset
    55
\isamarkupsubsection{Structural Induction and Case Distinction%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
    56
}
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    57
\isamarkuptrue%
9742
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    58
%
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    59
\begin{isamarkuptext}%
10824
4a212e635318 *** empty log message ***
nipkow
parents: 10420
diff changeset
    60
\label{sec:struct-ind-case}
11456
7eb63f63e6c6 revisions and indexing
paulson
parents: 11428
diff changeset
    61
\index{case distinctions}\index{induction!structural}%
7eb63f63e6c6 revisions and indexing
paulson
parents: 11428
diff changeset
    62
Induction is invoked by \methdx{induct_tac}, as we have seen above; 
7eb63f63e6c6 revisions and indexing
paulson
parents: 11428
diff changeset
    63
it works for any datatype.  In some cases, induction is overkill and a case
7eb63f63e6c6 revisions and indexing
paulson
parents: 11428
diff changeset
    64
distinction over all constructors of the datatype suffices.  This is performed
7eb63f63e6c6 revisions and indexing
paulson
parents: 11428
diff changeset
    65
by \methdx{case_tac}.  Here is a trivial example:%
9742
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    66
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    67
\isamarkuptrue%
9742
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    68
\isacommand{lemma}\ {\isachardoublequote}{\isacharparenleft}case\ xs\ of\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymRightarrow}\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharbar}\ y{\isacharhash}ys\ {\isasymRightarrow}\ xs{\isacharparenright}\ {\isacharequal}\ xs{\isachardoublequote}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    69
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    70
\isacommand{apply}{\isacharparenleft}case{\isacharunderscore}tac\ xs{\isacharparenright}\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    71
%
9742
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    72
\begin{isamarkuptxt}%
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    73
\noindent
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    74
results in the proof state
10420
ef006735bee8 *** empty log message ***
nipkow
parents: 10397
diff changeset
    75
\begin{isabelle}%
ef006735bee8 *** empty log message ***
nipkow
parents: 10397
diff changeset
    76
\ {\isadigit{1}}{\isachardot}\ xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymLongrightarrow}\ {\isacharparenleft}case\ xs\ of\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymRightarrow}\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharbar}\ y\ {\isacharhash}\ ys\ {\isasymRightarrow}\ xs{\isacharparenright}\ {\isacharequal}\ xs\isanewline
ef006735bee8 *** empty log message ***
nipkow
parents: 10397
diff changeset
    77
\ {\isadigit{2}}{\isachardot}\ {\isasymAnd}a\ list{\isachardot}\isanewline
10950
aa788fcb75a5 updated;
wenzelm
parents: 10878
diff changeset
    78
\isaindent{\ {\isadigit{2}}{\isachardot}\ \ \ \ }xs\ {\isacharequal}\ a\ {\isacharhash}\ list\ {\isasymLongrightarrow}\ {\isacharparenleft}case\ xs\ of\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymRightarrow}\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharbar}\ y\ {\isacharhash}\ ys\ {\isasymRightarrow}\ xs{\isacharparenright}\ {\isacharequal}\ xs%
9742
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    79
\end{isabelle}
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    80
which is solved automatically:%
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    81
\end{isamarkuptxt}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    82
\isamarkuptrue%
13791
3b6ff7ceaf27 *** empty log message ***
nipkow
parents: 13778
diff changeset
    83
\isacommand{apply}{\isacharparenleft}auto{\isacharparenright}\isamarkupfalse%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    84
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
    85
%
9742
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    86
\begin{isamarkuptext}%
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
    87
Note that we do not need to give a lemma a name if we do not intend to refer
10824
4a212e635318 *** empty log message ***
nipkow
parents: 10420
diff changeset
    88
to it explicitly in the future.
11456
7eb63f63e6c6 revisions and indexing
paulson
parents: 11428
diff changeset
    89
Other basic laws about a datatype are applied automatically during
7eb63f63e6c6 revisions and indexing
paulson
parents: 11428
diff changeset
    90
simplification, so no special methods are provided for them.
10824
4a212e635318 *** empty log message ***
nipkow
parents: 10420
diff changeset
    91
4a212e635318 *** empty log message ***
nipkow
parents: 10420
diff changeset
    92
\begin{warn}
4a212e635318 *** empty log message ***
nipkow
parents: 10420
diff changeset
    93
  Induction is only allowed on free (or \isasymAnd-bound) variables that
4a212e635318 *** empty log message ***
nipkow
parents: 10420
diff changeset
    94
  should not occur among the assumptions of the subgoal; see
4a212e635318 *** empty log message ***
nipkow
parents: 10420
diff changeset
    95
  \S\ref{sec:ind-var-in-prems} for details. Case distinction
4a212e635318 *** empty log message ***
nipkow
parents: 10420
diff changeset
    96
  (\isa{case{\isacharunderscore}tac}) works for arbitrary terms, which need to be
4a212e635318 *** empty log message ***
nipkow
parents: 10420
diff changeset
    97
  quoted if they are non-atomic. However, apart from \isa{{\isasymAnd}}-bound
4a212e635318 *** empty log message ***
nipkow
parents: 10420
diff changeset
    98
  variables, the terms must not contain variables that are bound outside.
4a212e635318 *** empty log message ***
nipkow
parents: 10420
diff changeset
    99
  For example, given the goal \isa{{\isasymforall}xs{\isachardot}\ xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymor}\ {\isacharparenleft}{\isasymexists}y\ ys{\isachardot}\ xs\ {\isacharequal}\ y\ {\isacharhash}\ ys{\isacharparenright}},
4a212e635318 *** empty log message ***
nipkow
parents: 10420
diff changeset
   100
  \isa{case{\isacharunderscore}tac\ xs} will not work as expected because Isabelle interprets
4a212e635318 *** empty log message ***
nipkow
parents: 10420
diff changeset
   101
  the \isa{xs} as a new free variable distinct from the bound
4a212e635318 *** empty log message ***
nipkow
parents: 10420
diff changeset
   102
  \isa{xs} in the goal.
4a212e635318 *** empty log message ***
nipkow
parents: 10420
diff changeset
   103
\end{warn}%
9742
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
   104
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   105
\isamarkuptrue%
fbd097aec213 updated;
wenzelm
parents: 11708
diff changeset
   106
\isamarkupfalse%
9742
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
   107
\end{isabellebody}%
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
   108
%%% Local Variables:
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
   109
%%% mode: latex
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
   110
%%% TeX-master: "root"
98d3ca2c18f7 *** empty log message ***
nipkow
parents:
diff changeset
   111
%%% End: