doc-src/TutorialI/Misc/document/simp.tex
author chaieb
Wed, 19 May 2004 11:23:59 +0200
changeset 14758 af3b71a46a1c
parent 13814 5402c2eaf393
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:
9924
3370f6aa3200 updated;
wenzelm
parents: 9911
diff changeset
     1
%
3370f6aa3200 updated;
wenzelm
parents: 9911
diff changeset
     2
\begin{isabellebody}%
3370f6aa3200 updated;
wenzelm
parents: 9911
diff changeset
     3
\def\isabellecontext{simp}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
     4
\isamarkupfalse%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
     5
%
11214
3b3cc0cf533f *** empty log message ***
nipkow
parents: 11206
diff changeset
     6
\isamarkupsubsection{Simplification Rules%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
     7
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
     8
\isamarkuptrue%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
     9
%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    10
\begin{isamarkuptext}%
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
    11
\index{simplification rules}
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
    12
To facilitate simplification,  
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
    13
the attribute \isa{{\isacharbrackleft}simp{\isacharbrackright}}\index{*simp (attribute)}
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
    14
declares theorems to be simplification rules, which the simplifier
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
    15
will use automatically.  In addition, \isacommand{datatype} and
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
    16
\isacommand{primrec} declarations (and a few others) 
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
    17
implicitly declare some simplification rules.  
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
    18
Explicit definitions are \emph{not} declared as 
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    19
simplification rules automatically!
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    20
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
    21
Nearly any theorem can become a simplification
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
    22
rule. The simplifier will try to transform it into an equation.  
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
    23
For example, the theorem
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
    24
\isa{{\isasymnot}\ P} is turned into \isa{P\ {\isacharequal}\ False}. The details
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    25
are explained in \S\ref{sec:SimpHow}.
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    26
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
    27
The simplification attribute of theorems can be turned on and off:%
12489
c92e38c3cbaa *** empty log message ***
nipkow
parents: 12473
diff changeset
    28
\index{*simp del (attribute)}
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    29
\begin{quote}
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    30
\isacommand{declare} \textit{theorem-name}\isa{{\isacharbrackleft}simp{\isacharbrackright}}\\
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    31
\isacommand{declare} \textit{theorem-name}\isa{{\isacharbrackleft}simp\ del{\isacharbrackright}}
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    32
\end{quote}
11309
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
    33
Only equations that really simplify, like \isa{rev\
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
    34
{\isacharparenleft}rev\ xs{\isacharparenright}\ {\isacharequal}\ xs} and
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
    35
\isa{xs\ {\isacharat}\ {\isacharbrackleft}{\isacharbrackright}\
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
    36
{\isacharequal}\ xs}, should be declared as default simplification rules. 
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
    37
More specific ones should only be used selectively and should
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
    38
not be made default.  Distributivity laws, for example, alter
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
    39
the structure of terms and can produce an exponential blow-up instead of
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
    40
simplification.  A default simplification rule may
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
    41
need to be disabled in certain proofs.  Frequent changes in the simplification
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
    42
status of a theorem may indicate an unwise use of defaults.
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    43
\begin{warn}
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
    44
  Simplification can run forever, for example if both $f(x) = g(x)$ and
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    45
  $g(x) = f(x)$ are simplification rules. It is the user's responsibility not
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    46
  to include simplification rules that can lead to nontermination, either on
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    47
  their own or in combination with other simplification rules.
12332
aea72a834c85 *** empty log message ***
nipkow
parents: 11866
diff changeset
    48
\end{warn}
aea72a834c85 *** empty log message ***
nipkow
parents: 11866
diff changeset
    49
\begin{warn}
aea72a834c85 *** empty log message ***
nipkow
parents: 11866
diff changeset
    50
  It is inadvisable to toggle the simplification attribute of a
12333
ef43a3d6e962 minor tweaks
paulson
parents: 12332
diff changeset
    51
  theorem from a parent theory $A$ in a child theory $B$ for good.
12332
aea72a834c85 *** empty log message ***
nipkow
parents: 11866
diff changeset
    52
  The reason is that if some theory $C$ is based both on $B$ and (via a
13814
5402c2eaf393 *** empty log message ***
nipkow
parents: 13791
diff changeset
    53
  different path) on $A$, it is not defined what the simplification attribute
12332
aea72a834c85 *** empty log message ***
nipkow
parents: 11866
diff changeset
    54
  of that theorem will be in $C$: it could be either.
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    55
\end{warn}%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    56
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
    57
\isamarkuptrue%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    58
%
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
    59
\isamarkupsubsection{The {\tt\slshape simp}  Method%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
    60
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
    61
\isamarkuptrue%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    62
%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    63
\begin{isamarkuptext}%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    64
\index{*simp (method)|bold}
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    65
The general format of the simplification method is
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    66
\begin{quote}
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    67
\isa{simp} \textit{list of modifiers}
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    68
\end{quote}
10795
9e888d60d3e5 minor edits to Chapters 1-3
paulson
parents: 10788
diff changeset
    69
where the list of \emph{modifiers} fine tunes the behaviour and may
11309
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
    70
be empty. Specific modifiers are discussed below.  Most if not all of the
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
    71
proofs seen so far could have been performed
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    72
with \isa{simp} instead of \isa{auto}, except that \isa{simp} attacks
10971
6852682eaf16 *** empty log message ***
nipkow
parents: 10950
diff changeset
    73
only the first subgoal and may thus need to be repeated --- use
11428
332347b9b942 tidying the index
paulson
parents: 11309
diff changeset
    74
\methdx{simp_all} to simplify all subgoals.
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
    75
If nothing changes, \isa{simp} fails.%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    76
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
    77
\isamarkuptrue%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    78
%
11214
3b3cc0cf533f *** empty log message ***
nipkow
parents: 11206
diff changeset
    79
\isamarkupsubsection{Adding and Deleting Simplification Rules%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
    80
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
    81
\isamarkuptrue%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    82
%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    83
\begin{isamarkuptext}%
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
    84
\index{simplification rules!adding and deleting}%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    85
If a certain theorem is merely needed in a few proofs by simplification,
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    86
we do not need to make it a global simplification rule. Instead we can modify
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    87
the set of simplification rules used in a simplification step by adding rules
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    88
to it and/or deleting rules from it. The two modifiers for this are
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    89
\begin{quote}
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
    90
\isa{add{\isacharcolon}} \textit{list of theorem names}\index{*add (modifier)}\\
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
    91
\isa{del{\isacharcolon}} \textit{list of theorem names}\index{*del (modifier)}
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    92
\end{quote}
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
    93
Or you can use a specific list of theorems and omit all others:
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
    94
\begin{quote}
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
    95
\isa{only{\isacharcolon}} \textit{list of theorem names}\index{*only (modifier)}
11309
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
    96
\end{quote}
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
    97
In this example, we invoke the simplifier, adding two distributive
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
    98
laws:
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
    99
\begin{quote}
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
   100
\isacommand{apply}\isa{{\isacharparenleft}simp\ add{\isacharcolon}\ mod{\isacharunderscore}mult{\isacharunderscore}distrib\ add{\isacharunderscore}mult{\isacharunderscore}distrib{\isacharparenright}}
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   101
\end{quote}%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   102
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   103
\isamarkuptrue%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   104
%
11214
3b3cc0cf533f *** empty log message ***
nipkow
parents: 11206
diff changeset
   105
\isamarkupsubsection{Assumptions%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
   106
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   107
\isamarkuptrue%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   108
%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   109
\begin{isamarkuptext}%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   110
\index{simplification!with/of assumptions}
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   111
By default, assumptions are part of the simplification process: they are used
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   112
as simplification rules and are simplified themselves. For example:%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   113
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   114
\isamarkuptrue%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   115
\isacommand{lemma}\ {\isachardoublequote}{\isasymlbrakk}\ xs\ {\isacharat}\ zs\ {\isacharequal}\ ys\ {\isacharat}\ xs{\isacharsemicolon}\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharat}\ xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharat}\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymrbrakk}\ {\isasymLongrightarrow}\ ys\ {\isacharequal}\ zs{\isachardoublequote}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   116
\isamarkupfalse%
10171
59d6633835fa *** empty log message ***
nipkow
parents: 9933
diff changeset
   117
\isacommand{apply}\ simp\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   118
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   119
\isacommand{done}\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   120
%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   121
\begin{isamarkuptext}%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   122
\noindent
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   123
The second assumption simplifies to \isa{xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}}, which in turn
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   124
simplifies the first assumption to \isa{zs\ {\isacharequal}\ ys}, thus reducing the
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   125
conclusion to \isa{ys\ {\isacharequal}\ ys} and hence to \isa{True}.
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   126
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   127
In some cases, using the assumptions can lead to nontermination:%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   128
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   129
\isamarkuptrue%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   130
\isacommand{lemma}\ {\isachardoublequote}{\isasymforall}x{\isachardot}\ f\ x\ {\isacharequal}\ g\ {\isacharparenleft}f\ {\isacharparenleft}g\ x{\isacharparenright}{\isacharparenright}\ {\isasymLongrightarrow}\ f\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharequal}\ f\ {\isacharbrackleft}{\isacharbrackright}\ {\isacharat}\ {\isacharbrackleft}{\isacharbrackright}{\isachardoublequote}\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   131
%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   132
\begin{isamarkuptxt}%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   133
\noindent
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   134
An unmodified application of \isa{simp} loops.  The culprit is the
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   135
simplification rule \isa{f\ x\ {\isacharequal}\ g\ {\isacharparenleft}f\ {\isacharparenleft}g\ x{\isacharparenright}{\isacharparenright}}, which is extracted from
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   136
the assumption.  (Isabelle notices certain simple forms of
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   137
nontermination but not this one.)  The problem can be circumvented by
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   138
telling the simplifier to ignore the assumptions:%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   139
\end{isamarkuptxt}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   140
\isamarkuptrue%
10171
59d6633835fa *** empty log message ***
nipkow
parents: 9933
diff changeset
   141
\isacommand{apply}{\isacharparenleft}simp\ {\isacharparenleft}no{\isacharunderscore}asm{\isacharparenright}{\isacharparenright}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   142
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   143
\isacommand{done}\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   144
%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   145
\begin{isamarkuptext}%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   146
\noindent
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   147
Three modifiers influence the treatment of assumptions:
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   148
\begin{description}
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   149
\item[\isa{{\isacharparenleft}no{\isacharunderscore}asm{\isacharparenright}}]\index{*no_asm (modifier)}
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   150
 means that assumptions are completely ignored.
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   151
\item[\isa{{\isacharparenleft}no{\isacharunderscore}asm{\isacharunderscore}simp{\isacharparenright}}]\index{*no_asm_simp (modifier)}
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   152
 means that the assumptions are not simplified but
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   153
  are used in the simplification of the conclusion.
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   154
\item[\isa{{\isacharparenleft}no{\isacharunderscore}asm{\isacharunderscore}use{\isacharparenright}}]\index{*no_asm_use (modifier)}
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   155
 means that the assumptions are simplified but are not
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   156
  used in the simplification of each other or the conclusion.
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   157
\end{description}
10795
9e888d60d3e5 minor edits to Chapters 1-3
paulson
parents: 10788
diff changeset
   158
Both \isa{{\isacharparenleft}no{\isacharunderscore}asm{\isacharunderscore}simp{\isacharparenright}} and \isa{{\isacharparenleft}no{\isacharunderscore}asm{\isacharunderscore}use{\isacharparenright}} run forever on
9e888d60d3e5 minor edits to Chapters 1-3
paulson
parents: 10788
diff changeset
   159
the problematic subgoal above.
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   160
Only one of the modifiers is allowed, and it must precede all
11309
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
   161
other modifiers.
13623
c2b235e60f8b *** empty log message ***
nipkow
parents: 12627
diff changeset
   162
%\begin{warn}
c2b235e60f8b *** empty log message ***
nipkow
parents: 12627
diff changeset
   163
%Assumptions are simplified in a left-to-right fashion. If an
c2b235e60f8b *** empty log message ***
nipkow
parents: 12627
diff changeset
   164
%assumption can help in simplifying one to the left of it, this may get
c2b235e60f8b *** empty log message ***
nipkow
parents: 12627
diff changeset
   165
%overlooked. In such cases you have to rotate the assumptions explicitly:
c2b235e60f8b *** empty log message ***
nipkow
parents: 12627
diff changeset
   166
%\isacommand{apply}@ {text"("}\methdx{rotate_tac}~$n$@ {text")"}
c2b235e60f8b *** empty log message ***
nipkow
parents: 12627
diff changeset
   167
%causes a cyclic shift by $n$ positions from right to left, if $n$ is
c2b235e60f8b *** empty log message ***
nipkow
parents: 12627
diff changeset
   168
%positive, and from left to right, if $n$ is negative.
c2b235e60f8b *** empty log message ***
nipkow
parents: 12627
diff changeset
   169
%Beware that such rotations make proofs quite brittle.
c2b235e60f8b *** empty log message ***
nipkow
parents: 12627
diff changeset
   170
%\end{warn}%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   171
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   172
\isamarkuptrue%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   173
%
11214
3b3cc0cf533f *** empty log message ***
nipkow
parents: 11206
diff changeset
   174
\isamarkupsubsection{Rewriting with Definitions%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
   175
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   176
\isamarkuptrue%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   177
%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   178
\begin{isamarkuptext}%
11215
b44ad7e4c4d2 *** empty log message ***
nipkow
parents: 11214
diff changeset
   179
\label{sec:Simp-with-Defs}\index{simplification!with definitions}
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   180
Constant definitions (\S\ref{sec:ConstDefinitions}) can be used as
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   181
simplification rules, but by default they are not: the simplifier does not
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   182
expand them automatically.  Definitions are intended for introducing abstract
12584
cf5a342ce698 updated;
wenzelm
parents: 12533
diff changeset
   183
concepts and not merely as abbreviations.  Of course, we need to expand
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   184
the definition initially, but once we have proved enough abstract properties
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   185
of the new constant, we can forget its original definition.  This style makes
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   186
proofs more robust: if the definition has to be changed,
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   187
only the proofs of the abstract properties will be affected.
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   188
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   189
For example, given%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   190
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   191
\isamarkuptrue%
10788
ea48dd8b0232 *** empty log message ***
nipkow
parents: 10696
diff changeset
   192
\isacommand{constdefs}\ xor\ {\isacharcolon}{\isacharcolon}\ {\isachardoublequote}bool\ {\isasymRightarrow}\ bool\ {\isasymRightarrow}\ bool{\isachardoublequote}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   193
\ \ \ \ \ \ \ \ \ {\isachardoublequote}xor\ A\ B\ {\isasymequiv}\ {\isacharparenleft}A\ {\isasymand}\ {\isasymnot}B{\isacharparenright}\ {\isasymor}\ {\isacharparenleft}{\isasymnot}A\ {\isasymand}\ B{\isacharparenright}{\isachardoublequote}\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   194
%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   195
\begin{isamarkuptext}%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   196
\noindent
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   197
we may want to prove%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   198
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   199
\isamarkuptrue%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   200
\isacommand{lemma}\ {\isachardoublequote}xor\ A\ {\isacharparenleft}{\isasymnot}A{\isacharparenright}{\isachardoublequote}\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   201
%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   202
\begin{isamarkuptxt}%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   203
\noindent
11428
332347b9b942 tidying the index
paulson
parents: 11309
diff changeset
   204
Typically, we begin by unfolding some definitions:
332347b9b942 tidying the index
paulson
parents: 11309
diff changeset
   205
\indexbold{definitions!unfolding}%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   206
\end{isamarkuptxt}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   207
\isamarkuptrue%
12627
08eee994bf99 updated;
wenzelm
parents: 12584
diff changeset
   208
\isacommand{apply}{\isacharparenleft}simp\ only{\isacharcolon}\ xor{\isacharunderscore}def{\isacharparenright}\isamarkupfalse%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   209
%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   210
\begin{isamarkuptxt}%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   211
\noindent
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   212
In this particular case, the resulting goal
10362
c6b197ccf1f1 *** empty log message ***
nipkow
parents: 10187
diff changeset
   213
\begin{isabelle}%
c6b197ccf1f1 *** empty log message ***
nipkow
parents: 10187
diff changeset
   214
\ {\isadigit{1}}{\isachardot}\ A\ {\isasymand}\ {\isasymnot}\ {\isasymnot}\ A\ {\isasymor}\ {\isasymnot}\ A\ {\isasymand}\ {\isasymnot}\ A%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   215
\end{isabelle}
10171
59d6633835fa *** empty log message ***
nipkow
parents: 9933
diff changeset
   216
can be proved by simplification. Thus we could have proved the lemma outright by%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   217
\end{isamarkuptxt}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   218
\isamarkuptrue%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   219
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   220
\isamarkupfalse%
13791
3b6ff7ceaf27 *** empty log message ***
nipkow
parents: 13778
diff changeset
   221
\isacommand{apply}{\isacharparenleft}simp\ add{\isacharcolon}\ xor{\isacharunderscore}def{\isacharparenright}\isamarkupfalse%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   222
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   223
%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   224
\begin{isamarkuptext}%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   225
\noindent
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   226
Of course we can also unfold definitions in the middle of a proof.
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   227
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   228
\begin{warn}
10971
6852682eaf16 *** empty log message ***
nipkow
parents: 10950
diff changeset
   229
  If you have defined $f\,x\,y~\isasymequiv~t$ then you can only unfold
6852682eaf16 *** empty log message ***
nipkow
parents: 10950
diff changeset
   230
  occurrences of $f$ with at least two arguments. This may be helpful for unfolding
6852682eaf16 *** empty log message ***
nipkow
parents: 10950
diff changeset
   231
  $f$ selectively, but it may also get in the way. Defining
6852682eaf16 *** empty log message ***
nipkow
parents: 10950
diff changeset
   232
  $f$~\isasymequiv~\isasymlambda$x\,y.\;t$ allows to unfold all occurrences of $f$.
12473
f41e477576b9 *** empty log message ***
nipkow
parents: 12333
diff changeset
   233
\end{warn}
f41e477576b9 *** empty log message ***
nipkow
parents: 12333
diff changeset
   234
f41e477576b9 *** empty log message ***
nipkow
parents: 12333
diff changeset
   235
There is also the special method \isa{unfold}\index{*unfold (method)|bold}
f41e477576b9 *** empty log message ***
nipkow
parents: 12333
diff changeset
   236
which merely unfolds
f41e477576b9 *** empty log message ***
nipkow
parents: 12333
diff changeset
   237
one or several definitions, as in \isacommand{apply}\isa{(unfold xor_def)}.
12533
e417bd7ca8a0 *** empty log message ***
nipkow
parents: 12489
diff changeset
   238
This is can be useful in situations where \isa{simp} does too much.
e417bd7ca8a0 *** empty log message ***
nipkow
parents: 12489
diff changeset
   239
Warning: \isa{unfold} acts on all subgoals!%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   240
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   241
\isamarkuptrue%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   242
%
11214
3b3cc0cf533f *** empty log message ***
nipkow
parents: 11206
diff changeset
   243
\isamarkupsubsection{Simplifying {\tt\slshape let}-Expressions%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
   244
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   245
\isamarkuptrue%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   246
%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   247
\begin{isamarkuptext}%
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   248
\index{simplification!of \isa{let}-expressions}\index{*let expressions}%
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   249
Proving a goal containing \isa{let}-expressions almost invariably requires the
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   250
\isa{let}-con\-structs to be expanded at some point. Since
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   251
\isa{let}\ldots\isa{=}\ldots\isa{in}{\ldots} is just syntactic sugar for
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   252
the predefined constant \isa{Let}, expanding \isa{let}-constructs
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   253
means rewriting with \tdx{Let_def}:%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   254
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   255
\isamarkuptrue%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   256
\isacommand{lemma}\ {\isachardoublequote}{\isacharparenleft}let\ xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ in\ xs{\isacharat}ys{\isacharat}xs{\isacharparenright}\ {\isacharequal}\ ys{\isachardoublequote}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   257
\isamarkupfalse%
10171
59d6633835fa *** empty log message ***
nipkow
parents: 9933
diff changeset
   258
\isacommand{apply}{\isacharparenleft}simp\ add{\isacharcolon}\ Let{\isacharunderscore}def{\isacharparenright}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   259
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   260
\isacommand{done}\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   261
%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   262
\begin{isamarkuptext}%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   263
If, in a particular context, there is no danger of a combinatorial explosion
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   264
of nested \isa{let}s, you could even simplify with \isa{Let{\isacharunderscore}def} by
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   265
default:%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   266
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   267
\isamarkuptrue%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   268
\isacommand{declare}\ Let{\isacharunderscore}def\ {\isacharbrackleft}simp{\isacharbrackright}\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   269
%
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   270
\isamarkupsubsection{Conditional Simplification Rules%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
   271
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   272
\isamarkuptrue%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   273
%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   274
\begin{isamarkuptext}%
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   275
\index{conditional simplification rules}%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   276
So far all examples of rewrite rules were equations. The simplifier also
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   277
accepts \emph{conditional} equations, for example%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   278
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   279
\isamarkuptrue%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   280
\isacommand{lemma}\ hd{\isacharunderscore}Cons{\isacharunderscore}tl{\isacharbrackleft}simp{\isacharbrackright}{\isacharcolon}\ {\isachardoublequote}xs\ {\isasymnoteq}\ {\isacharbrackleft}{\isacharbrackright}\ \ {\isasymLongrightarrow}\ \ hd\ xs\ {\isacharhash}\ tl\ xs\ {\isacharequal}\ xs{\isachardoublequote}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   281
\isamarkupfalse%
10171
59d6633835fa *** empty log message ***
nipkow
parents: 9933
diff changeset
   282
\isacommand{apply}{\isacharparenleft}case{\isacharunderscore}tac\ xs{\isacharcomma}\ simp{\isacharcomma}\ simp{\isacharparenright}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   283
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   284
\isacommand{done}\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   285
%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   286
\begin{isamarkuptext}%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   287
\noindent
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   288
Note the use of ``\ttindexboldpos{,}{$Isar}'' to string together a
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   289
sequence of methods. Assuming that the simplification rule
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   290
\isa{{\isacharparenleft}rev\ xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}}
10795
9e888d60d3e5 minor edits to Chapters 1-3
paulson
parents: 10788
diff changeset
   291
is present as well,
9e888d60d3e5 minor edits to Chapters 1-3
paulson
parents: 10788
diff changeset
   292
the lemma below is proved by plain simplification:%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   293
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   294
\isamarkuptrue%
13791
3b6ff7ceaf27 *** empty log message ***
nipkow
parents: 13778
diff changeset
   295
\isacommand{lemma}\ {\isachardoublequote}xs\ {\isasymnoteq}\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymLongrightarrow}\ hd{\isacharparenleft}rev\ xs{\isacharparenright}\ {\isacharhash}\ tl{\isacharparenleft}rev\ xs{\isacharparenright}\ {\isacharequal}\ rev\ xs{\isachardoublequote}\isamarkupfalse%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   296
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   297
%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   298
\begin{isamarkuptext}%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   299
\noindent
10795
9e888d60d3e5 minor edits to Chapters 1-3
paulson
parents: 10788
diff changeset
   300
The conditional equation \isa{hd{\isacharunderscore}Cons{\isacharunderscore}tl} above
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   301
can simplify \isa{hd\ {\isacharparenleft}rev\ xs{\isacharparenright}\ {\isacharhash}\ tl\ {\isacharparenleft}rev\ xs{\isacharparenright}} to \isa{rev\ xs}
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   302
because the corresponding precondition \isa{rev\ xs\ {\isasymnoteq}\ {\isacharbrackleft}{\isacharbrackright}}
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   303
simplifies to \isa{xs\ {\isasymnoteq}\ {\isacharbrackleft}{\isacharbrackright}}, which is exactly the local
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   304
assumption of the subgoal.%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   305
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   306
\isamarkuptrue%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   307
%
11214
3b3cc0cf533f *** empty log message ***
nipkow
parents: 11206
diff changeset
   308
\isamarkupsubsection{Automatic Case Splits%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
   309
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   310
\isamarkuptrue%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   311
%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   312
\begin{isamarkuptext}%
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   313
\label{sec:AutoCaseSplits}\indexbold{case splits}%
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   314
Goals containing \isa{if}-expressions\index{*if expressions!splitting of}
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   315
are usually proved by case
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   316
distinction on the boolean condition.  Here is an example:%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   317
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   318
\isamarkuptrue%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   319
\isacommand{lemma}\ {\isachardoublequote}{\isasymforall}xs{\isachardot}\ if\ xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ then\ rev\ xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ else\ rev\ xs\ {\isasymnoteq}\ {\isacharbrackleft}{\isacharbrackright}{\isachardoublequote}\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   320
%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   321
\begin{isamarkuptxt}%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   322
\noindent
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   323
The goal can be split by a special method, \methdx{split}:%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   324
\end{isamarkuptxt}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   325
\isamarkuptrue%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   326
\isacommand{apply}{\isacharparenleft}split\ split{\isacharunderscore}if{\isacharparenright}\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   327
%
10362
c6b197ccf1f1 *** empty log message ***
nipkow
parents: 10187
diff changeset
   328
\begin{isamarkuptxt}%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   329
\noindent
10362
c6b197ccf1f1 *** empty log message ***
nipkow
parents: 10187
diff changeset
   330
\begin{isabelle}%
c6b197ccf1f1 *** empty log message ***
nipkow
parents: 10187
diff changeset
   331
\ {\isadigit{1}}{\isachardot}\ {\isasymforall}xs{\isachardot}\ {\isacharparenleft}xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymlongrightarrow}\ rev\ xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}\ {\isasymand}\ {\isacharparenleft}xs\ {\isasymnoteq}\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymlongrightarrow}\ rev\ xs\ {\isasymnoteq}\ {\isacharbrackleft}{\isacharbrackright}{\isacharparenright}%
c6b197ccf1f1 *** empty log message ***
nipkow
parents: 10187
diff changeset
   332
\end{isabelle}
11428
332347b9b942 tidying the index
paulson
parents: 11309
diff changeset
   333
where \tdx{split_if} is a theorem that expresses splitting of
10668
3b84288e60b7 updated;
wenzelm
parents: 10645
diff changeset
   334
\isa{if}s. Because
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   335
splitting the \isa{if}s is usually the right proof strategy, the
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   336
simplifier does it automatically.  Try \isacommand{apply}\isa{{\isacharparenleft}simp{\isacharparenright}}
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   337
on the initial goal above.
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   338
11428
332347b9b942 tidying the index
paulson
parents: 11309
diff changeset
   339
This splitting idea generalizes from \isa{if} to \sdx{case}.
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   340
Let us simplify a case analysis over lists:\index{*list.split (theorem)}%
10362
c6b197ccf1f1 *** empty log message ***
nipkow
parents: 10187
diff changeset
   341
\end{isamarkuptxt}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   342
\isamarkuptrue%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   343
\isamarkupfalse%
10362
c6b197ccf1f1 *** empty log message ***
nipkow
parents: 10187
diff changeset
   344
\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}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   345
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   346
\isacommand{apply}{\isacharparenleft}split\ list{\isachardot}split{\isacharparenright}\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   347
%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   348
\begin{isamarkuptxt}%
10362
c6b197ccf1f1 *** empty log message ***
nipkow
parents: 10187
diff changeset
   349
\begin{isabelle}%
c6b197ccf1f1 *** empty log message ***
nipkow
parents: 10187
diff changeset
   350
\ {\isadigit{1}}{\isachardot}\ {\isacharparenleft}xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymlongrightarrow}\ zs\ {\isacharequal}\ xs\ {\isacharat}\ zs{\isacharparenright}\ {\isasymand}\isanewline
10950
aa788fcb75a5 updated;
wenzelm
parents: 10878
diff changeset
   351
\isaindent{\ {\isadigit{1}}{\isachardot}\ }{\isacharparenleft}{\isasymforall}a\ list{\isachardot}\ xs\ {\isacharequal}\ a\ {\isacharhash}\ list\ {\isasymlongrightarrow}\ a\ {\isacharhash}\ list\ {\isacharat}\ zs\ {\isacharequal}\ xs\ {\isacharat}\ zs{\isacharparenright}%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   352
\end{isabelle}
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   353
The simplifier does not split
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   354
\isa{case}-expressions, as it does \isa{if}-expressions, 
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   355
because with recursive datatypes it could lead to nontermination.
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   356
Instead, the simplifier has a modifier
11494
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
   357
\isa{split}\index{*split (modifier)} 
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   358
for adding splitting rules explicitly.  The
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   359
lemma above can be proved in one step by%
10362
c6b197ccf1f1 *** empty log message ***
nipkow
parents: 10187
diff changeset
   360
\end{isamarkuptxt}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   361
\isamarkuptrue%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   362
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   363
\isamarkupfalse%
13791
3b6ff7ceaf27 *** empty log message ***
nipkow
parents: 13778
diff changeset
   364
\isacommand{apply}{\isacharparenleft}simp\ split{\isacharcolon}\ list{\isachardot}split{\isacharparenright}\isamarkupfalse%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   365
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   366
%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   367
\begin{isamarkuptext}%
10668
3b84288e60b7 updated;
wenzelm
parents: 10645
diff changeset
   368
\noindent
3b84288e60b7 updated;
wenzelm
parents: 10645
diff changeset
   369
whereas \isacommand{apply}\isa{{\isacharparenleft}simp{\isacharparenright}} alone will not succeed.
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   370
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   371
Every datatype $t$ comes with a theorem
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   372
$t$\isa{{\isachardot}split} which can be declared to be a \bfindex{split rule} either
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   373
locally as above, or by giving it the \attrdx{split} attribute globally:%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   374
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   375
\isamarkuptrue%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   376
\isacommand{declare}\ list{\isachardot}split\ {\isacharbrackleft}split{\isacharbrackright}\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   377
%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   378
\begin{isamarkuptext}%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   379
\noindent
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   380
The \isa{split} attribute can be removed with the \isa{del} modifier,
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   381
either locally%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   382
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   383
\isamarkuptrue%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   384
\isamarkupfalse%
13791
3b6ff7ceaf27 *** empty log message ***
nipkow
parents: 13778
diff changeset
   385
\isacommand{apply}{\isacharparenleft}simp\ split\ del{\isacharcolon}\ split{\isacharunderscore}if{\isacharparenright}\isamarkupfalse%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   386
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   387
%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   388
\begin{isamarkuptext}%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   389
\noindent
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   390
or globally:%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   391
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   392
\isamarkuptrue%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   393
\isacommand{declare}\ list{\isachardot}split\ {\isacharbrackleft}split\ del{\isacharbrackright}\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   394
%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   395
\begin{isamarkuptext}%
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   396
Polished proofs typically perform splitting within \isa{simp} rather than 
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   397
invoking the \isa{split} method.  However, if a goal contains
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   398
several \isa{if} and \isa{case} expressions, 
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   399
the \isa{split} method can be
10668
3b84288e60b7 updated;
wenzelm
parents: 10645
diff changeset
   400
helpful in selectively exploring the effects of splitting.
3b84288e60b7 updated;
wenzelm
parents: 10645
diff changeset
   401
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   402
The split rules shown above are intended to affect only the subgoal's
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   403
conclusion.  If you want to split an \isa{if} or \isa{case}-expression
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   404
in the assumptions, you have to apply \tdx{split_if_asm} or
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   405
$t$\isa{{\isachardot}split{\isacharunderscore}asm}:%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   406
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   407
\isamarkuptrue%
10668
3b84288e60b7 updated;
wenzelm
parents: 10645
diff changeset
   408
\isacommand{lemma}\ {\isachardoublequote}if\ xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ then\ ys\ {\isasymnoteq}\ {\isacharbrackleft}{\isacharbrackright}\ else\ ys\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymLongrightarrow}\ xs\ {\isacharat}\ ys\ {\isasymnoteq}\ {\isacharbrackleft}{\isacharbrackright}{\isachardoublequote}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   409
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   410
\isacommand{apply}{\isacharparenleft}split\ split{\isacharunderscore}if{\isacharunderscore}asm{\isacharparenright}\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   411
%
10362
c6b197ccf1f1 *** empty log message ***
nipkow
parents: 10187
diff changeset
   412
\begin{isamarkuptxt}%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   413
\noindent
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   414
Unlike splitting the conclusion, this step creates two
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   415
separate subgoals, which here can be solved by \isa{simp{\isacharunderscore}all}:
10362
c6b197ccf1f1 *** empty log message ***
nipkow
parents: 10187
diff changeset
   416
\begin{isabelle}%
10696
76d7f6c9a14c *** empty log message ***
nipkow
parents: 10668
diff changeset
   417
\ {\isadigit{1}}{\isachardot}\ {\isasymlbrakk}xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}{\isacharsemicolon}\ ys\ {\isasymnoteq}\ {\isacharbrackleft}{\isacharbrackright}{\isasymrbrakk}\ {\isasymLongrightarrow}\ xs\ {\isacharat}\ ys\ {\isasymnoteq}\ {\isacharbrackleft}{\isacharbrackright}\isanewline
76d7f6c9a14c *** empty log message ***
nipkow
parents: 10668
diff changeset
   418
\ {\isadigit{2}}{\isachardot}\ {\isasymlbrakk}xs\ {\isasymnoteq}\ {\isacharbrackleft}{\isacharbrackright}{\isacharsemicolon}\ ys\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}{\isasymrbrakk}\ {\isasymLongrightarrow}\ xs\ {\isacharat}\ ys\ {\isasymnoteq}\ {\isacharbrackleft}{\isacharbrackright}%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   419
\end{isabelle}
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   420
If you need to split both in the assumptions and the conclusion,
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   421
use $t$\isa{{\isachardot}splits} which subsumes $t$\isa{{\isachardot}split} and
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   422
$t$\isa{{\isachardot}split{\isacharunderscore}asm}. Analogously, there is \isa{if{\isacharunderscore}splits}.
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   423
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   424
\begin{warn}
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   425
  The simplifier merely simplifies the condition of an 
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   426
  \isa{if}\index{*if expressions!simplification of} but not the
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   427
  \isa{then} or \isa{else} parts. The latter are simplified only after the
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   428
  condition reduces to \isa{True} or \isa{False}, or after splitting. The
11428
332347b9b942 tidying the index
paulson
parents: 11309
diff changeset
   429
  same is true for \sdx{case}-expressions: only the selector is
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   430
  simplified at first, until either the expression reduces to one of the
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   431
  cases or it is split.
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   432
\end{warn}%
10362
c6b197ccf1f1 *** empty log message ***
nipkow
parents: 10187
diff changeset
   433
\end{isamarkuptxt}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   434
\isamarkuptrue%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   435
\isamarkupfalse%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   436
%
11214
3b3cc0cf533f *** empty log message ***
nipkow
parents: 11206
diff changeset
   437
\isamarkupsubsection{Tracing%
10397
e2d0dda41f2c auto update
paulson
parents: 10396
diff changeset
   438
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   439
\isamarkuptrue%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   440
%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   441
\begin{isamarkuptext}%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   442
\indexbold{tracing the simplifier}
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   443
Using the simplifier effectively may take a bit of experimentation.  Set the
11428
332347b9b942 tidying the index
paulson
parents: 11309
diff changeset
   444
\isa{trace_simp}\index{*trace_simp (flag)} flag\index{flags} 
332347b9b942 tidying the index
paulson
parents: 11309
diff changeset
   445
to get a better idea of what is going
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   446
on:%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   447
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   448
\isamarkuptrue%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   449
\isacommand{ML}\ {\isachardoublequote}set\ trace{\isacharunderscore}simp{\isachardoublequote}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   450
\isamarkupfalse%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   451
\isacommand{lemma}\ {\isachardoublequote}rev\ {\isacharbrackleft}a{\isacharbrackright}\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}{\isachardoublequote}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   452
\isamarkupfalse%
13791
3b6ff7ceaf27 *** empty log message ***
nipkow
parents: 13778
diff changeset
   453
\isacommand{apply}{\isacharparenleft}simp{\isacharparenright}\isamarkupfalse%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   454
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   455
%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   456
\begin{isamarkuptext}%
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   457
\noindent
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   458
produces the trace
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   459
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   460
\begin{ttbox}\makeatother
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   461
Applying instance of rewrite rule:
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   462
rev (?x1 \# ?xs1) == rev ?xs1 @ [?x1]
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   463
Rewriting:
10971
6852682eaf16 *** empty log message ***
nipkow
parents: 10950
diff changeset
   464
rev [a] == rev [] @ [a]
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   465
Applying instance of rewrite rule:
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   466
rev [] == []
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   467
Rewriting:
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   468
rev [] == []
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   469
Applying instance of rewrite rule:
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   470
[] @ ?y == ?y
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   471
Rewriting:
10971
6852682eaf16 *** empty log message ***
nipkow
parents: 10950
diff changeset
   472
[] @ [a] == [a]
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   473
Applying instance of rewrite rule:
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   474
?x3 \# ?t3 = ?t3 == False
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   475
Rewriting:
10971
6852682eaf16 *** empty log message ***
nipkow
parents: 10950
diff changeset
   476
[a] = [] == False
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   477
\end{ttbox}
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   478
11309
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
   479
The trace lists each rule being applied, both in its general form and the 
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
   480
instance being used.  For conditional rules, the trace lists the rule
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
   481
it is trying to rewrite and gives the result of attempting to prove
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
   482
each of the rule's conditions.  Many other hints about the simplifier's
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
   483
actions will appear.
d666f11ca2d4 minor suggestions by Tanja Vos
paulson
parents: 11215
diff changeset
   484
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   485
In more complicated cases, the trace can be quite lengthy.  Invocations of the
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   486
simplifier are often nested, for instance when solving conditions of rewrite
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11428
diff changeset
   487
rules.  Thus it is advisable to reset it:%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   488
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   489
\isamarkuptrue%
9933
9feb1e0c4cb3 *** empty log message ***
nipkow
parents: 9924
diff changeset
   490
\isacommand{ML}\ {\isachardoublequote}reset\ trace{\isacharunderscore}simp{\isachardoublequote}\isanewline
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   491
\isamarkupfalse%
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   492
\isamarkupfalse%
9924
3370f6aa3200 updated;
wenzelm
parents: 9911
diff changeset
   493
\end{isabellebody}%
3370f6aa3200 updated;
wenzelm
parents: 9911
diff changeset
   494
%%% Local Variables:
3370f6aa3200 updated;
wenzelm
parents: 9911
diff changeset
   495
%%% mode: latex
3370f6aa3200 updated;
wenzelm
parents: 9911
diff changeset
   496
%%% TeX-master: "root"
3370f6aa3200 updated;
wenzelm
parents: 9911
diff changeset
   497
%%% End: