doc-src/TutorialI/Misc/document/case_splits.tex
author wenzelm
Sat, 02 Sep 2000 22:19:03 +0200
changeset 9812 87ba969d069c
parent 9792 bbefb6ce5cb2
permissions -rw-r--r--
updated;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9722
a5f86aed785b *** empty log message ***
nipkow
parents: 9721
diff changeset
     1
%
a5f86aed785b *** empty log message ***
nipkow
parents: 9721
diff changeset
     2
\begin{isabellebody}%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
     3
%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
     4
\begin{isamarkuptext}%
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
     5
Goals containing \isa{if}-expressions are usually proved by case
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
     6
distinction on the condition of the \isa{if}. For example the goal%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
     7
\end{isamarkuptext}%
9673
1b2d4f995b13 updated;
wenzelm
parents: 9541
diff changeset
     8
\isacommand{lemma}\ {\isachardoublequote}{\isasymforall}xs{\isachardot}\ if\ xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ then\ rev\ xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ else\ rev\ xs\ {\isasymnoteq}\ {\isacharbrackleft}{\isacharbrackright}{\isachardoublequote}%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
     9
\begin{isamarkuptxt}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    10
\noindent
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    11
can be split into
9723
a977245dfc8a *** empty log message ***
nipkow
parents: 9722
diff changeset
    12
\begin{isabelle}
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
    13
~1.~{\isasymforall}xs.~(xs~=~[]~{\isasymlongrightarrow}~rev~xs~=~[])~{\isasymand}~(xs~{\isasymnoteq}~[]~{\isasymlongrightarrow}~rev~xs~{\isasymnoteq}~[])
9723
a977245dfc8a *** empty log message ***
nipkow
parents: 9722
diff changeset
    14
\end{isabelle}
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    15
by a degenerate form of simplification%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    16
\end{isamarkuptxt}%
9673
1b2d4f995b13 updated;
wenzelm
parents: 9541
diff changeset
    17
\isacommand{apply}{\isacharparenleft}simp\ only{\isacharcolon}\ split{\isacharcolon}\ split{\isacharunderscore}if{\isacharparenright}%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    18
\begin{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    19
\noindent
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
    20
where no simplification rules are included (\isa{only{\isacharcolon}} is followed by the
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    21
empty list of theorems) but the rule \isaindexbold{split_if} for
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
    22
splitting \isa{if}s is added (via the modifier \isa{split{\isacharcolon}}). Because
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    23
case-splitting on \isa{if}s is almost always the right proof strategy, the
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
    24
simplifier performs it automatically. Try \isacommand{apply}\isa{{\isacharparenleft}simp{\isacharparenright}}
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    25
on the initial goal above.
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    26
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    27
This splitting idea generalizes from \isa{if} to \isaindex{case}:%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    28
\end{isamarkuptext}%
9673
1b2d4f995b13 updated;
wenzelm
parents: 9541
diff changeset
    29
\isacommand{lemma}\ {\isachardoublequote}{\isacharparenleft}case\ xs\ of\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymRightarrow}\ zs\ {\isacharbar}\ y{\isacharhash}ys\ {\isasymRightarrow}\ y{\isacharhash}{\isacharparenleft}ys{\isacharat}zs{\isacharparenright}{\isacharparenright}\ {\isacharequal}\ xs{\isacharat}zs{\isachardoublequote}%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    30
\begin{isamarkuptxt}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    31
\noindent
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    32
becomes
9723
a977245dfc8a *** empty log message ***
nipkow
parents: 9722
diff changeset
    33
\begin{isabelle}
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    34
~1.~(xs~=~[]~{\isasymlongrightarrow}~zs~=~xs~@~zs)~{\isasymand}\isanewline
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
    35
~~~~({\isasymforall}a~list.~xs~=~a~\#~list~{\isasymlongrightarrow}~a~\#~list~@~zs~=~xs~@~zs)
9723
a977245dfc8a *** empty log message ***
nipkow
parents: 9722
diff changeset
    36
\end{isabelle}
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    37
by typing%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    38
\end{isamarkuptxt}%
9673
1b2d4f995b13 updated;
wenzelm
parents: 9541
diff changeset
    39
\isacommand{apply}{\isacharparenleft}simp\ only{\isacharcolon}\ split{\isacharcolon}\ list{\isachardot}split{\isacharparenright}%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    40
\begin{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    41
\noindent
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    42
In contrast to \isa{if}-expressions, the simplifier does not split
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    43
\isa{case}-expressions by default because this can lead to nontermination
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
    44
in case of recursive datatypes. Again, if the \isa{only{\isacharcolon}} modifier is
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8749
diff changeset
    45
dropped, the above goal is solved,%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    46
\end{isamarkuptext}%
9673
1b2d4f995b13 updated;
wenzelm
parents: 9541
diff changeset
    47
\isacommand{by}{\isacharparenleft}simp\ split{\isacharcolon}\ list{\isachardot}split{\isacharparenright}%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    48
\begin{isamarkuptext}%
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8749
diff changeset
    49
\noindent%
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
    50
which \isacommand{apply}\isa{{\isacharparenleft}simp{\isacharparenright}} alone will not do.
8771
026f37a86ea7 *** empty log message ***
nipkow
parents: 8749
diff changeset
    51
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    52
In general, every datatype $t$ comes with a theorem
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
    53
$t$\isa{{\isachardot}split} which can be declared to be a \bfindex{split rule} either
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    54
locally as above, or by giving it the \isa{split} attribute globally:%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    55
\end{isamarkuptext}%
9673
1b2d4f995b13 updated;
wenzelm
parents: 9541
diff changeset
    56
\isacommand{lemmas}\ {\isacharbrackleft}split{\isacharbrackright}\ {\isacharequal}\ list{\isachardot}split%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    57
\begin{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    58
\noindent
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    59
The \isa{split} attribute can be removed with the \isa{del} modifier,
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    60
either locally%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    61
\end{isamarkuptext}%
9673
1b2d4f995b13 updated;
wenzelm
parents: 9541
diff changeset
    62
\isacommand{apply}{\isacharparenleft}simp\ split\ del{\isacharcolon}\ split{\isacharunderscore}if{\isacharparenright}%
8749
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    63
\begin{isamarkuptext}%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    64
\noindent
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    65
or globally:%
2665170f104a Adding generated files
nipkow
parents:
diff changeset
    66
\end{isamarkuptext}%
9721
7e51c9f3d5a0 *** empty log message ***
nipkow
parents: 9717
diff changeset
    67
\isacommand{lemmas}\ {\isacharbrackleft}split\ del{\isacharbrackright}\ {\isacharequal}\ list{\isachardot}split%
7e51c9f3d5a0 *** empty log message ***
nipkow
parents: 9717
diff changeset
    68
\begin{isamarkuptext}%
7e51c9f3d5a0 *** empty log message ***
nipkow
parents: 9717
diff changeset
    69
The above split rules intentionally only affect the conclusion of a
7e51c9f3d5a0 *** empty log message ***
nipkow
parents: 9717
diff changeset
    70
subgoal.  If you want to split an \isa{if} or \isa{case}-expression in
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
    71
the assumptions, you have to apply \isa{split{\isacharunderscore}if{\isacharunderscore}asm} or
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
    72
$t$\isa{{\isachardot}split{\isacharunderscore}asm}:%
9721
7e51c9f3d5a0 *** empty log message ***
nipkow
parents: 9717
diff changeset
    73
\end{isamarkuptext}%
7e51c9f3d5a0 *** empty log message ***
nipkow
parents: 9717
diff changeset
    74
\isacommand{lemma}\ {\isachardoublequote}if\ xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ then\ ys\ {\isachartilde}{\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ else\ ys\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharequal}{\isacharequal}{\isachargreater}\ xs\ {\isacharat}\ ys\ {\isachartilde}{\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}{\isachardoublequote}\isanewline
7e51c9f3d5a0 *** empty log message ***
nipkow
parents: 9717
diff changeset
    75
\isacommand{apply}{\isacharparenleft}simp\ only{\isacharcolon}\ split{\isacharcolon}\ split{\isacharunderscore}if{\isacharunderscore}asm{\isacharparenright}%
7e51c9f3d5a0 *** empty log message ***
nipkow
parents: 9717
diff changeset
    76
\begin{isamarkuptxt}%
7e51c9f3d5a0 *** empty log message ***
nipkow
parents: 9717
diff changeset
    77
\noindent
7e51c9f3d5a0 *** empty log message ***
nipkow
parents: 9717
diff changeset
    78
In contrast to splitting the conclusion, this actually creates two
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
    79
separate subgoals (which are solved by \isa{simp{\isacharunderscore}all}):
9721
7e51c9f3d5a0 *** empty log message ***
nipkow
parents: 9717
diff changeset
    80
\begin{isabelle}
7e51c9f3d5a0 *** empty log message ***
nipkow
parents: 9717
diff changeset
    81
\ \isadigit{1}{\isachardot}\ {\isasymlbrakk}\mbox{xs}\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}{\isacharsemicolon}\ \mbox{ys}\ {\isasymnoteq}\ {\isacharbrackleft}{\isacharbrackright}{\isasymrbrakk}\ {\isasymLongrightarrow}\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharat}\ \mbox{ys}\ {\isasymnoteq}\ {\isacharbrackleft}{\isacharbrackright}\isanewline
7e51c9f3d5a0 *** empty log message ***
nipkow
parents: 9717
diff changeset
    82
\ \isadigit{2}{\isachardot}\ {\isasymlbrakk}\mbox{xs}\ {\isasymnoteq}\ {\isacharbrackleft}{\isacharbrackright}{\isacharsemicolon}\ \mbox{ys}\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}{\isasymrbrakk}\ {\isasymLongrightarrow}\ \mbox{xs}\ {\isacharat}\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymnoteq}\ {\isacharbrackleft}{\isacharbrackright}
7e51c9f3d5a0 *** empty log message ***
nipkow
parents: 9717
diff changeset
    83
\end{isabelle}
7e51c9f3d5a0 *** empty log message ***
nipkow
parents: 9717
diff changeset
    84
If you need to split both in the assumptions and the conclusion,
9792
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
    85
use $t$\isa{{\isachardot}splits} which subsumes $t$\isa{{\isachardot}split} and
bbefb6ce5cb2 *** empty log message ***
nipkow
parents: 9723
diff changeset
    86
$t$\isa{{\isachardot}split{\isacharunderscore}asm}. Analogously, there is \isa{if{\isacharunderscore}splits}.%
9721
7e51c9f3d5a0 *** empty log message ***
nipkow
parents: 9717
diff changeset
    87
\end{isamarkuptxt}%
9722
a5f86aed785b *** empty log message ***
nipkow
parents: 9721
diff changeset
    88
\end{isabellebody}%
9145
9f7b8de5bfaf updated;
wenzelm
parents: 8771
diff changeset
    89
%%% Local Variables:
9f7b8de5bfaf updated;
wenzelm
parents: 8771
diff changeset
    90
%%% mode: latex
9f7b8de5bfaf updated;
wenzelm
parents: 8771
diff changeset
    91
%%% TeX-master: "root"
9f7b8de5bfaf updated;
wenzelm
parents: 8771
diff changeset
    92
%%% End: