doc-src/TutorialI/Advanced/document/simp.tex
author nipkow
Fri, 15 Sep 2000 20:07:15 +0200
changeset 9993 c0f7fb6e538e
child 10186 499637e8f2c6
permissions -rw-r--r--
*** empty log message ***
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}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
     4
%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
     5
\isamarkupsection{Simplification}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
     6
%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
     7
\begin{isamarkuptext}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
     8
\label{sec:simplification-II}\index{simplification|(}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
     9
This section discusses some additional nifty features not covered so far and
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    10
gives a short introduction to the simplification process itself. The latter
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    11
is helpful to understand why a particular rule does or does not apply in some
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    12
situation.%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    13
\end{isamarkuptext}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    14
%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    15
\isamarkupsubsection{Advanced features}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    16
%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    17
\isamarkupsubsubsection{Congruence rules}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    18
%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    19
\begin{isamarkuptext}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    20
\label{sec:simp-cong}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    21
It is hardwired into the simplifier that while simplifying the conclusion $Q$
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    22
of $P \isasymImp Q$ it is legal to make uses of the assumptions $P$. This
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    23
kind of contextual information can also be made available for other
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    24
operators. For example, \isa{xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}\ {\isasymlongrightarrow}\ xs\ {\isacharat}\ xs\ {\isacharequal}\ xs} simplifies to \isa{True} because we may use \isa{xs\ {\isacharequal}\ {\isacharbrackleft}{\isacharbrackright}} when simplifying \isa{xs\ {\isacharat}\ xs\ {\isacharequal}\ xs}. The generation of contextual information during simplification is
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    25
controlled by so-called \bfindex{congruence rules}. This is the one for
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    26
\isa{{\isasymlongrightarrow}}:
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    27
\begin{isabelle}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    28
\ \ \ \ \ {\isasymlbrakk}P\ {\isacharequal}\ P{\isacharprime}{\isacharsemicolon}\ P{\isacharprime}\ {\isasymLongrightarrow}\ Q\ {\isacharequal}\ Q{\isacharprime}{\isasymrbrakk}\ {\isasymLongrightarrow}\ {\isacharparenleft}P\ {\isasymlongrightarrow}\ Q{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}P{\isacharprime}\ {\isasymlongrightarrow}\ Q{\isacharprime}{\isacharparenright}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    29
\end{isabelle}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    30
It should be read as follows:
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    31
In order to simplify \isa{P\ {\isasymlongrightarrow}\ Q} to \isa{P{\isacharprime}\ {\isasymlongrightarrow}\ Q{\isacharprime}},
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    32
simplify \isa{P} to \isa{P{\isacharprime}}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    33
and assume \isa{P{\isacharprime}} when simplifying \isa{Q} to \isa{Q{\isacharprime}}.
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    34
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    35
Here are some more examples.  The congruence rules for bounded
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    36
quantifiers supply contextual information about the bound variable:
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    37
\begin{isabelle}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    38
\ \ \ \ \ {\isasymlbrakk}A\ {\isacharequal}\ B{\isacharsemicolon}\ {\isasymAnd}x{\isachardot}\ x\ {\isasymin}\ B\ {\isasymLongrightarrow}\ P\ x\ {\isacharequal}\ Q\ x{\isasymrbrakk}\isanewline
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    39
\ \ \ \ \ {\isasymLongrightarrow}\ {\isacharparenleft}{\isasymforall}x{\isasymin}A{\isachardot}\ P\ x{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}{\isasymforall}x{\isasymin}B{\isachardot}\ Q\ x{\isacharparenright}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    40
\end{isabelle}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    41
The congruence rule for conditional expressions supply contextual
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    42
information for simplifying the arms:
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    43
\begin{isabelle}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    44
\ \ \ \ \ {\isasymlbrakk}b\ {\isacharequal}\ c{\isacharsemicolon}\ c\ {\isasymLongrightarrow}\ x\ {\isacharequal}\ u{\isacharsemicolon}\ {\isasymnot}\ c\ {\isasymLongrightarrow}\ y\ {\isacharequal}\ v{\isasymrbrakk}\isanewline
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    45
\ \ \ \ \ {\isasymLongrightarrow}\ {\isacharparenleft}if\ b\ then\ x\ else\ y{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}if\ c\ then\ u\ else\ v{\isacharparenright}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    46
\end{isabelle}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    47
A congruence rule can also \emph{prevent} simplification of some arguments.
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    48
Here is an alternative congruence rule for conditional expressions:
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    49
\begin{isabelle}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    50
\ \ \ \ \ b\ {\isacharequal}\ c\ {\isasymLongrightarrow}\ {\isacharparenleft}if\ b\ then\ x\ else\ y{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}if\ c\ then\ x\ else\ y{\isacharparenright}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    51
\end{isabelle}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    52
Only the first argument is simplified; the others remain unchanged.
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    53
This makes simplification much faster and is faithful to the evaluation
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    54
strategy in programming languages, which is why this is the default
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    55
congruence rule for \isa{if}. Analogous rules control the evaluaton of
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    56
\isa{case} expressions.
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    57
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    58
You can delare your own congruence rules with the attribute \isa{cong},
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    59
either globally, in the usual manner,
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    60
\begin{quote}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    61
\isacommand{declare} \textit{theorem-name} \isa{{\isacharbrackleft}cong{\isacharbrackright}}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    62
\end{quote}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    63
or locally in a \isa{simp} call by adding the modifier
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    64
\begin{quote}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    65
\isa{cong{\isacharcolon}} \textit{list of theorem names}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    66
\end{quote}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    67
The effect is reversed by \isa{cong\ del} instead of \isa{cong}.
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    68
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    69
\begin{warn}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    70
The congruence rule \isa{conj{\isacharunderscore}cong}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    71
\begin{isabelle}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    72
\ \ \ \ \ {\isasymlbrakk}P\ {\isacharequal}\ P{\isacharprime}{\isacharsemicolon}\ P{\isacharprime}\ {\isasymLongrightarrow}\ Q\ {\isacharequal}\ Q{\isacharprime}{\isasymrbrakk}\ {\isasymLongrightarrow}\ {\isacharparenleft}P\ {\isasymand}\ Q{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}P{\isacharprime}\ {\isasymand}\ Q{\isacharprime}{\isacharparenright}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    73
\end{isabelle}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    74
is occasionally useful but not a default rule; you have to use it explicitly.
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    75
\end{warn}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    76
\end{isamarkuptext}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    77
%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    78
\isamarkupsubsubsection{Permutative rewrite rules}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    79
%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    80
\begin{isamarkuptext}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    81
\index{rewrite rule!permutative|bold}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    82
\index{rewriting!ordered|bold}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    83
\index{ordered rewriting|bold}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    84
\index{simplification!ordered|bold}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    85
An equation is a \bfindex{permutative rewrite rule} if the left-hand
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    86
side and right-hand side are the same up to renaming of variables.  The most
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    87
common permutative rule is commutativity: \isa{x\ {\isacharplus}\ y\ {\isacharequal}\ y\ {\isacharplus}\ x}.  Other examples
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    88
include \isa{x\ {\isacharminus}\ y\ {\isacharminus}\ z\ {\isacharequal}\ x\ {\isacharminus}\ z\ {\isacharminus}\ y} in arithmetic and \isa{insert\ x\ {\isacharparenleft}insert\ y\ A{\isacharparenright}\ {\isacharequal}\ insert\ y\ {\isacharparenleft}insert\ x\ A{\isacharparenright}} for sets. Such rules are problematic because
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    89
once they apply, they can be used forever. The simplifier is aware of this
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    90
danger and treats permutative rules by means of a special strategy, called
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    91
\bfindex{ordered rewriting}: a permutative rewrite
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    92
rule is only applied if the term becomes ``smaller'' (w.r.t.\ some fixed
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    93
lexicographic ordering on terms). For example, commutativity rewrites
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    94
\isa{b\ {\isacharplus}\ a} to \isa{a\ {\isacharplus}\ b}, but then stops because \isa{a\ {\isacharplus}\ b} is strictly
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    95
smaller than \isa{b\ {\isacharplus}\ a}.  Permutative rewrite rules can be turned into
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    96
simplification rules in the usual manner via the \isa{simp} attribute; the
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    97
simplifier recognizes their special status automatically.
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    98
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    99
Permutative rewrite rules are most effective in the case of
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   100
associative-commutative operators.  (Associativity by itself is not
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   101
permutative.)  When dealing with an AC-operator~$f$, keep the
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   102
following points in mind:
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   103
\begin{itemize}\index{associative-commutative operators}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   104
  
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   105
\item The associative law must always be oriented from left to right,
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   106
  namely $f(f(x,y),z) = f(x,f(y,z))$.  The opposite orientation, if
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   107
  used with commutativity, can lead to nontermination.
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   108
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   109
\item To complete your set of rewrite rules, you must add not just
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   110
  associativity~(A) and commutativity~(C) but also a derived rule, {\bf
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   111
    left-com\-mut\-ativ\-ity} (LC): $f(x,f(y,z)) = f(y,f(x,z))$.
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   112
\end{itemize}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   113
Ordered rewriting with the combination of A, C, and LC sorts a term
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   114
lexicographically:
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   115
\[\def\maps#1{~\stackrel{#1}{\leadsto}~}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   116
 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
   117
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   118
Note that ordered rewriting for \isa{{\isacharplus}} and \isa{{\isacharasterisk}} on numbers is rarely
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   119
necessary because the builtin arithmetic capabilities often take care of
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   120
this.%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   121
\end{isamarkuptext}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   122
%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   123
\isamarkupsubsection{How it works}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   124
%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   125
\begin{isamarkuptext}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   126
\label{sec:SimpHow}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   127
Roughly speaking, the simplifier proceeds bottom-up (subterms are simplified
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   128
first) and a conditional equation is only applied if its condition could be
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   129
proved (again by simplification). Below we explain some special%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   130
\end{isamarkuptext}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   131
%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   132
\isamarkupsubsubsection{Higher-order patterns}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   133
%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   134
\isamarkupsubsubsection{Local assumptions}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   135
%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   136
\isamarkupsubsubsection{The preprocessor}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   137
%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   138
\begin{isamarkuptext}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   139
\index{simplification|)}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   140
\end{isamarkuptext}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   141
\end{isabellebody}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   142
%%% Local Variables:
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   143
%%% mode: latex
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   144
%%% TeX-master: "root"
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   145
%%% End: