doc-src/TutorialI/Advanced/document/simp.tex
author wenzelm
Sat, 25 Jun 2011 18:15:36 +0200
changeset 43548 f231a7594e54
parent 40406 313a24b66a8d
permissions -rw-r--r--
type classes: entity markup instead of old-style token markup;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
     1
%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
     2
\begin{isabellebody}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
     3
\def\isabellecontext{simp}%
17056
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
     4
%
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
     5
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
     6
%
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
     7
\endisadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
     8
%
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
     9
\isatagtheory
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
    10
%
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
    11
\endisatagtheory
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
    12
{\isafoldtheory}%
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
    13
%
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
    14
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
    15
%
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
    16
\endisadelimtheory
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    17
%
10395
7ef380745743 updated;
wenzelm
parents: 10281
diff changeset
    18
\isamarkupsection{Simplification%
7ef380745743 updated;
wenzelm
parents: 10281
diff changeset
    19
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
    20
\isamarkuptrue%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    21
%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    22
\begin{isamarkuptext}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    23
\label{sec:simplification-II}\index{simplification|(}
11494
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
    24
This section describes features not covered until now.  It also
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
    25
outlines the simplification process itself, which can be helpful
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
    26
when the simplifier does not do what you expect of it.%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    27
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
    28
\isamarkuptrue%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    29
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
    30
\isamarkupsubsection{Advanced Features%
10395
7ef380745743 updated;
wenzelm
parents: 10281
diff changeset
    31
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
    32
\isamarkuptrue%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    33
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
    34
\isamarkupsubsubsection{Congruence Rules%
10395
7ef380745743 updated;
wenzelm
parents: 10281
diff changeset
    35
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
    36
\isamarkuptrue%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    37
%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    38
\begin{isamarkuptext}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    39
\label{sec:simp-cong}
11494
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
    40
While simplifying the conclusion $Q$
13191
05a9929ee10e *** empty log message ***
nipkow
parents: 11866
diff changeset
    41
of $P \Imp Q$, it is legal to use the assumption $P$.
11494
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
    42
For $\Imp$ this policy is hardwired, but 
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
    43
contextual information can also be made available for other
40406
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
    44
operators. For example, \isa{xs\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}\ {\isaliteral{5C3C6C6F6E6772696768746172726F773E}{\isasymlongrightarrow}}\ xs\ {\isaliteral{40}{\isacharat}}\ xs\ {\isaliteral{3D}{\isacharequal}}\ xs} simplifies to \isa{True} because we may use \isa{xs\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{5B}{\isacharbrackleft}}{\isaliteral{5D}{\isacharbrackright}}} when simplifying \isa{xs\ {\isaliteral{40}{\isacharat}}\ xs\ {\isaliteral{3D}{\isacharequal}}\ xs}. The generation of contextual information during simplification is
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    45
controlled by so-called \bfindex{congruence rules}. This is the one for
40406
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
    46
\isa{{\isaliteral{5C3C6C6F6E6772696768746172726F773E}{\isasymlongrightarrow}}}:
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    47
\begin{isabelle}%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
    48
\ \ \ \ \ {\isaliteral{5C3C6C6272616B6B3E}{\isasymlbrakk}}P\ {\isaliteral{3D}{\isacharequal}}\ P{\isaliteral{27}{\isacharprime}}{\isaliteral{3B}{\isacharsemicolon}}\ P{\isaliteral{27}{\isacharprime}}\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ Q\ {\isaliteral{3D}{\isacharequal}}\ Q{\isaliteral{27}{\isacharprime}}{\isaliteral{5C3C726272616B6B3E}{\isasymrbrakk}}\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ {\isaliteral{28}{\isacharparenleft}}P\ {\isaliteral{5C3C6C6F6E6772696768746172726F773E}{\isasymlongrightarrow}}\ Q{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}P{\isaliteral{27}{\isacharprime}}\ {\isaliteral{5C3C6C6F6E6772696768746172726F773E}{\isasymlongrightarrow}}\ Q{\isaliteral{27}{\isacharprime}}{\isaliteral{29}{\isacharparenright}}%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    49
\end{isabelle}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    50
It should be read as follows:
40406
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
    51
In order to simplify \isa{P\ {\isaliteral{5C3C6C6F6E6772696768746172726F773E}{\isasymlongrightarrow}}\ Q} to \isa{P{\isaliteral{27}{\isacharprime}}\ {\isaliteral{5C3C6C6F6E6772696768746172726F773E}{\isasymlongrightarrow}}\ Q{\isaliteral{27}{\isacharprime}}},
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
    52
simplify \isa{P} to \isa{P{\isaliteral{27}{\isacharprime}}}
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
    53
and assume \isa{P{\isaliteral{27}{\isacharprime}}} when simplifying \isa{Q} to \isa{Q{\isaliteral{27}{\isacharprime}}}.
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    54
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    55
Here are some more examples.  The congruence rules for bounded
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    56
quantifiers supply contextual information about the bound variable:
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    57
\begin{isabelle}%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
    58
\ \ \ \ \ {\isaliteral{5C3C6C6272616B6B3E}{\isasymlbrakk}}A\ {\isaliteral{3D}{\isacharequal}}\ B{\isaliteral{3B}{\isacharsemicolon}}\ {\isaliteral{5C3C416E643E}{\isasymAnd}}x{\isaliteral{2E}{\isachardot}}\ x\ {\isaliteral{5C3C696E3E}{\isasymin}}\ B\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ P\ x\ {\isaliteral{3D}{\isacharequal}}\ Q\ x{\isaliteral{5C3C726272616B6B3E}{\isasymrbrakk}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
    59
\isaindent{\ \ \ \ \ }{\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C666F72616C6C3E}{\isasymforall}}x{\isaliteral{5C3C696E3E}{\isasymin}}A{\isaliteral{2E}{\isachardot}}\ P\ x{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C666F72616C6C3E}{\isasymforall}}x{\isaliteral{5C3C696E3E}{\isasymin}}B{\isaliteral{2E}{\isachardot}}\ Q\ x{\isaliteral{29}{\isacharparenright}}%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    60
\end{isabelle}
11494
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
    61
One congruence rule for conditional expressions supplies contextual
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10978
diff changeset
    62
information for simplifying the \isa{then} and \isa{else} cases:
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    63
\begin{isabelle}%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
    64
\ \ \ \ \ {\isaliteral{5C3C6C6272616B6B3E}{\isasymlbrakk}}b\ {\isaliteral{3D}{\isacharequal}}\ c{\isaliteral{3B}{\isacharsemicolon}}\ c\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ x\ {\isaliteral{3D}{\isacharequal}}\ u{\isaliteral{3B}{\isacharsemicolon}}\ {\isaliteral{5C3C6E6F743E}{\isasymnot}}\ c\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ y\ {\isaliteral{3D}{\isacharequal}}\ v{\isaliteral{5C3C726272616B6B3E}{\isasymrbrakk}}\isanewline
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
    65
\isaindent{\ \ \ \ \ }{\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ {\isaliteral{28}{\isacharparenleft}}if\ b\ then\ x\ else\ y{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}if\ c\ then\ u\ else\ v{\isaliteral{29}{\isacharparenright}}%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    66
\end{isabelle}
11494
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
    67
An alternative congruence rule for conditional expressions
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
    68
actually \emph{prevents} simplification of some arguments:
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    69
\begin{isabelle}%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
    70
\ \ \ \ \ b\ {\isaliteral{3D}{\isacharequal}}\ c\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ {\isaliteral{28}{\isacharparenleft}}if\ b\ then\ x\ else\ y{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}if\ c\ then\ x\ else\ y{\isaliteral{29}{\isacharparenright}}%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    71
\end{isabelle}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    72
Only the first argument is simplified; the others remain unchanged.
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    73
This makes simplification much faster and is faithful to the evaluation
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    74
strategy in programming languages, which is why this is the default
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10978
diff changeset
    75
congruence rule for \isa{if}. Analogous rules control the evaluation of
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    76
\isa{case} expressions.
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    77
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11216
diff changeset
    78
You can declare your own congruence rules with the attribute \attrdx{cong},
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    79
either globally, in the usual manner,
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    80
\begin{quote}
40406
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
    81
\isacommand{declare} \textit{theorem-name} \isa{{\isaliteral{5B}{\isacharbrackleft}}cong{\isaliteral{5D}{\isacharbrackright}}}
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    82
\end{quote}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    83
or locally in a \isa{simp} call by adding the modifier
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    84
\begin{quote}
40406
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
    85
\isa{cong{\isaliteral{3A}{\isacharcolon}}} \textit{list of theorem names}
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    86
\end{quote}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    87
The effect is reversed by \isa{cong\ del} instead of \isa{cong}.
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    88
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    89
\begin{warn}
40406
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
    90
The congruence rule \isa{conj{\isaliteral{5F}{\isacharunderscore}}cong}
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    91
\begin{isabelle}%
40406
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
    92
\ \ \ \ \ {\isaliteral{5C3C6C6272616B6B3E}{\isasymlbrakk}}P\ {\isaliteral{3D}{\isacharequal}}\ P{\isaliteral{27}{\isacharprime}}{\isaliteral{3B}{\isacharsemicolon}}\ P{\isaliteral{27}{\isacharprime}}\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ Q\ {\isaliteral{3D}{\isacharequal}}\ Q{\isaliteral{27}{\isacharprime}}{\isaliteral{5C3C726272616B6B3E}{\isasymrbrakk}}\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ {\isaliteral{28}{\isacharparenleft}}P\ {\isaliteral{5C3C616E643E}{\isasymand}}\ Q{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}P{\isaliteral{27}{\isacharprime}}\ {\isaliteral{5C3C616E643E}{\isasymand}}\ Q{\isaliteral{27}{\isacharprime}}{\isaliteral{29}{\isacharparenright}}%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    93
\end{isabelle}
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
    94
\par\noindent
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
    95
is occasionally useful but is not a default rule; you have to declare it explicitly.
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    96
\end{warn}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    97
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
    98
\isamarkuptrue%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    99
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   100
\isamarkupsubsubsection{Permutative Rewrite Rules%
10395
7ef380745743 updated;
wenzelm
parents: 10281
diff changeset
   101
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   102
\isamarkuptrue%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   103
%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   104
\begin{isamarkuptext}%
11494
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
   105
\index{rewrite rules!permutative|bold}%
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
   106
An equation is a \textbf{permutative rewrite rule} if the left-hand
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   107
side and right-hand side are the same up to renaming of variables.  The most
40406
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
   108
common permutative rule is commutativity: \isa{x\ {\isaliteral{2B}{\isacharplus}}\ y\ {\isaliteral{3D}{\isacharequal}}\ y\ {\isaliteral{2B}{\isacharplus}}\ x}.  Other examples
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
   109
include \isa{x\ {\isaliteral{2D}{\isacharminus}}\ y\ {\isaliteral{2D}{\isacharminus}}\ z\ {\isaliteral{3D}{\isacharequal}}\ x\ {\isaliteral{2D}{\isacharminus}}\ z\ {\isaliteral{2D}{\isacharminus}}\ y} in arithmetic and \isa{insert\ x\ {\isaliteral{28}{\isacharparenleft}}insert\ y\ A{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ insert\ y\ {\isaliteral{28}{\isacharparenleft}}insert\ x\ A{\isaliteral{29}{\isacharparenright}}} for sets. Such rules are problematic because
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   110
once they apply, they can be used forever. The simplifier is aware of this
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   111
danger and treats permutative rules by means of a special strategy, called
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   112
\bfindex{ordered rewriting}: a permutative rewrite
10978
5eebea8f359f *** empty log message ***
nipkow
parents: 10950
diff changeset
   113
rule is only applied if the term becomes smaller with respect to a fixed
5eebea8f359f *** empty log message ***
nipkow
parents: 10950
diff changeset
   114
lexicographic ordering on terms. For example, commutativity rewrites
40406
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
   115
\isa{b\ {\isaliteral{2B}{\isacharplus}}\ a} to \isa{a\ {\isaliteral{2B}{\isacharplus}}\ b}, but then stops because \isa{a\ {\isaliteral{2B}{\isacharplus}}\ b} is strictly
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
   116
smaller than \isa{b\ {\isaliteral{2B}{\isacharplus}}\ a}.  Permutative rewrite rules can be turned into
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   117
simplification rules in the usual manner via the \isa{simp} attribute; the
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   118
simplifier recognizes their special status automatically.
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   119
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   120
Permutative rewrite rules are most effective in the case of
10281
9554ce1c2e54 *** empty log message ***
nipkow
parents: 10186
diff changeset
   121
associative-commutative functions.  (Associativity by itself is not
9554ce1c2e54 *** empty log message ***
nipkow
parents: 10186
diff changeset
   122
permutative.)  When dealing with an AC-function~$f$, keep the
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   123
following points in mind:
10281
9554ce1c2e54 *** empty log message ***
nipkow
parents: 10186
diff changeset
   124
\begin{itemize}\index{associative-commutative function}
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   125
  
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   126
\item The associative law must always be oriented from left to right,
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   127
  namely $f(f(x,y),z) = f(x,f(y,z))$.  The opposite orientation, if
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   128
  used with commutativity, can lead to nontermination.
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   129
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   130
\item To complete your set of rewrite rules, you must add not just
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   131
  associativity~(A) and commutativity~(C) but also a derived rule, {\bf
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   132
    left-com\-mut\-ativ\-ity} (LC): $f(x,f(y,z)) = f(y,f(x,z))$.
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   133
\end{itemize}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   134
Ordered rewriting with the combination of A, C, and LC sorts a term
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   135
lexicographically:
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   136
\[\def\maps#1{~\stackrel{#1}{\leadsto}~}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   137
 f(f(b,c),a) \maps{A} f(b,f(c,a)) \maps{C} f(b,f(a,c)) \maps{LC} f(a,f(b,c)) \]
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   138
40406
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
   139
Note that ordered rewriting for \isa{{\isaliteral{2B}{\isacharplus}}} and \isa{{\isaliteral{2A}{\isacharasterisk}}} on numbers is rarely
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   140
necessary because the built-in arithmetic prover often succeeds without
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10978
diff changeset
   141
such tricks.%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   142
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   143
\isamarkuptrue%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   144
%
11494
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
   145
\isamarkupsubsection{How the Simplifier Works%
10395
7ef380745743 updated;
wenzelm
parents: 10281
diff changeset
   146
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   147
\isamarkuptrue%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   148
%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   149
\begin{isamarkuptext}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   150
\label{sec:SimpHow}
11494
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
   151
Roughly speaking, the simplifier proceeds bottom-up: subterms are simplified
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
   152
first.  A conditional equation is only applied if its condition can be
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
   153
proved, again by simplification.  Below we explain some special features of
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
   154
the rewriting process.%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   155
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   156
\isamarkuptrue%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   157
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   158
\isamarkupsubsubsection{Higher-Order Patterns%
10395
7ef380745743 updated;
wenzelm
parents: 10281
diff changeset
   159
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   160
\isamarkuptrue%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   161
%
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   162
\begin{isamarkuptext}%
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   163
\index{simplification rule|(}
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   164
So far we have pretended the simplifier can deal with arbitrary
11494
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
   165
rewrite rules. This is not quite true.  For reasons of feasibility,
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
   166
the simplifier expects the
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   167
left-hand side of each rule to be a so-called \emph{higher-order
11494
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
   168
pattern}~\cite{nipkow-patterns}\indexbold{patterns!higher-order}. 
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
   169
This restricts where
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   170
unknowns may occur.  Higher-order patterns are terms in $\beta$-normal
11494
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
   171
form.  (This means there are no subterms of the form $(\lambda x. M)(N)$.)  
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
   172
Each occurrence of an unknown is of the form
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   173
$\Var{f}~x@1~\dots~x@n$, where the $x@i$ are distinct bound
10978
5eebea8f359f *** empty log message ***
nipkow
parents: 10950
diff changeset
   174
variables. Thus all ordinary rewrite rules, where all unknowns are
40406
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
   175
of base type, for example \isa{{\isaliteral{3F}{\isacharquery}}a\ {\isaliteral{2B}{\isacharplus}}\ {\isaliteral{3F}{\isacharquery}}b\ {\isaliteral{2B}{\isacharplus}}\ {\isaliteral{3F}{\isacharquery}}c\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{3F}{\isacharquery}}a\ {\isaliteral{2B}{\isacharplus}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{3F}{\isacharquery}}b\ {\isaliteral{2B}{\isacharplus}}\ {\isaliteral{3F}{\isacharquery}}c{\isaliteral{29}{\isacharparenright}}}, are acceptable: if an unknown is
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   176
of base type, it cannot have any arguments. Additionally, the rule
40406
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
   177
\isa{{\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C666F72616C6C3E}{\isasymforall}}x{\isaliteral{2E}{\isachardot}}\ {\isaliteral{3F}{\isacharquery}}P\ x\ {\isaliteral{5C3C616E643E}{\isasymand}}\ {\isaliteral{3F}{\isacharquery}}Q\ x{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C666F72616C6C3E}{\isasymforall}}x{\isaliteral{2E}{\isachardot}}\ {\isaliteral{3F}{\isacharquery}}P\ x{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C616E643E}{\isasymand}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C666F72616C6C3E}{\isasymforall}}x{\isaliteral{2E}{\isachardot}}\ {\isaliteral{3F}{\isacharquery}}Q\ x{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}} is also acceptable, in
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
   178
both directions: all arguments of the unknowns \isa{{\isaliteral{3F}{\isacharquery}}P} and
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
   179
\isa{{\isaliteral{3F}{\isacharquery}}Q} are distinct bound variables.
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   180
11494
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
   181
If the left-hand side is not a higher-order pattern, all is not lost.
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
   182
The simplifier will still try to apply the rule provided it
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
   183
matches directly: without much $\lambda$-calculus hocus
40406
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
   184
pocus.  For example, \isa{{\isaliteral{28}{\isacharparenleft}}{\isaliteral{3F}{\isacharquery}}f\ {\isaliteral{3F}{\isacharquery}}x\ {\isaliteral{5C3C696E3E}{\isasymin}}\ range\ {\isaliteral{3F}{\isacharquery}}f{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ True} rewrites
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
   185
\isa{g\ a\ {\isaliteral{5C3C696E3E}{\isasymin}}\ range\ g} to \isa{True}, but will fail to match
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
   186
\isa{g{\isaliteral{28}{\isacharparenleft}}h\ b{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C696E3E}{\isasymin}}\ range{\isaliteral{28}{\isacharparenleft}}{\isaliteral{5C3C6C616D6264613E}{\isasymlambda}}x{\isaliteral{2E}{\isachardot}}\ g{\isaliteral{28}{\isacharparenleft}}h\ x{\isaliteral{29}{\isacharparenright}}{\isaliteral{29}{\isacharparenright}}}.  However, you can
11494
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
   187
eliminate the offending subterms --- those that are not patterns ---
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
   188
by adding new variables and conditions.
40406
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
   189
In our example, we eliminate \isa{{\isaliteral{3F}{\isacharquery}}f\ {\isaliteral{3F}{\isacharquery}}x} and obtain
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
   190
 \isa{{\isaliteral{3F}{\isacharquery}}y\ {\isaliteral{3D}{\isacharequal}}\ {\isaliteral{3F}{\isacharquery}}f\ {\isaliteral{3F}{\isacharquery}}x\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ {\isaliteral{28}{\isacharparenleft}}{\isaliteral{3F}{\isacharquery}}y\ {\isaliteral{5C3C696E3E}{\isasymin}}\ range\ {\isaliteral{3F}{\isacharquery}}f{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{3D}{\isacharequal}}\ True}, which is fine
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   191
as a conditional rewrite rule since conditions can be arbitrary
11494
23a118849801 revisions and indexing
paulson
parents: 11458
diff changeset
   192
terms.  However, this trick is not a panacea because the newly
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10978
diff changeset
   193
introduced conditions may be hard to solve.
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   194
  
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   195
There is no restriction on the form of the right-hand
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   196
sides.  They may not contain extraneous term or type variables, though.%
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   197
\end{isamarkuptext}%
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   198
\isamarkuptrue%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   199
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   200
\isamarkupsubsubsection{The Preprocessor%
10395
7ef380745743 updated;
wenzelm
parents: 10281
diff changeset
   201
}
11866
fbd097aec213 updated;
wenzelm
parents: 11494
diff changeset
   202
\isamarkuptrue%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   203
%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   204
\begin{isamarkuptext}%
10845
3696bc935bbd *** empty log message ***
nipkow
parents: 10795
diff changeset
   205
\label{sec:simp-preprocessor}
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   206
When a theorem is declared a simplification rule, it need not be a
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   207
conditional equation already.  The simplifier will turn it into a set of
40406
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
   208
conditional equations automatically.  For example, \isa{f\ x\ {\isaliteral{3D}{\isacharequal}}\ g\ x\ {\isaliteral{5C3C616E643E}{\isasymand}}\ h\ x\ {\isaliteral{3D}{\isacharequal}}\ k\ x} becomes the two separate
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
   209
simplification rules \isa{f\ x\ {\isaliteral{3D}{\isacharequal}}\ g\ x} and \isa{h\ x\ {\isaliteral{3D}{\isacharequal}}\ k\ x}. In
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   210
general, the input theorem is converted as follows:
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   211
\begin{eqnarray}
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   212
\neg P &\mapsto& P = \hbox{\isa{False}} \nonumber\\
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   213
P \longrightarrow Q &\mapsto& P \Longrightarrow Q \nonumber\\
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   214
P \land Q &\mapsto& P,\ Q \nonumber\\
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   215
\forall x.~P~x &\mapsto& P~\Var{x}\nonumber\\
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   216
\forall x \in A.\ P~x &\mapsto& \Var{x} \in A \Longrightarrow P~\Var{x} \nonumber\\
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   217
\isa{if}\ P\ \isa{then}\ Q\ \isa{else}\ R &\mapsto&
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   218
 P \Longrightarrow Q,\ \neg P \Longrightarrow R \nonumber
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   219
\end{eqnarray}
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   220
Once this conversion process is finished, all remaining non-equations
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   221
$P$ are turned into trivial equations $P =\isa{True}$.
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   222
For example, the formula 
40406
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
   223
\begin{center}\isa{{\isaliteral{28}{\isacharparenleft}}p\ {\isaliteral{5C3C6C6F6E6772696768746172726F773E}{\isasymlongrightarrow}}\ t\ {\isaliteral{3D}{\isacharequal}}\ u\ {\isaliteral{5C3C616E643E}{\isasymand}}\ {\isaliteral{5C3C6E6F743E}{\isasymnot}}\ r{\isaliteral{29}{\isacharparenright}}\ {\isaliteral{5C3C616E643E}{\isasymand}}\ s}\end{center}
10845
3696bc935bbd *** empty log message ***
nipkow
parents: 10795
diff changeset
   224
is converted into the three rules
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   225
\begin{center}
40406
313a24b66a8d updated generated files;
wenzelm
parents: 17187
diff changeset
   226
\isa{p\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ t\ {\isaliteral{3D}{\isacharequal}}\ u},\quad  \isa{p\ {\isaliteral{5C3C4C6F6E6772696768746172726F773E}{\isasymLongrightarrow}}\ r\ {\isaliteral{3D}{\isacharequal}}\ False},\quad  \isa{s\ {\isaliteral{3D}{\isacharequal}}\ True}.
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   227
\end{center}
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   228
\index{simplification rule|)}
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   229
\index{simplification|)}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   230
\end{isamarkuptext}%
17175
1eced27ee0e1 updated;
wenzelm
parents: 17056
diff changeset
   231
\isamarkuptrue%
17056
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
   232
%
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
   233
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
   234
%
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
   235
\endisadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
   236
%
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
   237
\isatagtheory
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
   238
%
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
   239
\endisatagtheory
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
   240
{\isafoldtheory}%
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
   241
%
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
   242
\isadelimtheory
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
   243
%
05fc32a23b8b updated;
wenzelm
parents: 14270
diff changeset
   244
\endisadelimtheory
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   245
\end{isabellebody}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   246
%%% Local Variables:
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   247
%%% mode: latex
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   248
%%% TeX-master: "root"
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   249
%%% End: