doc-src/TutorialI/Advanced/document/simp.tex
author paulson
Fri, 03 Aug 2001 18:04:55 +0200
changeset 11458 09a6c44a48ea
parent 11216 279004936bb0
child 11494 23a118849801
permissions -rw-r--r--
numerous stylistic changes and indexing
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
%
10395
7ef380745743 updated;
wenzelm
parents: 10281
diff changeset
     5
\isamarkupsection{Simplification%
7ef380745743 updated;
wenzelm
parents: 10281
diff changeset
     6
}
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
     7
%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
     8
\begin{isamarkuptext}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
     9
\label{sec:simplification-II}\index{simplification|(}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    10
This section discusses some additional nifty features not covered so far and
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    11
gives a short introduction to the simplification process itself. The latter
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    12
is helpful to understand why a particular rule does or does not apply in some
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    13
situation.%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    14
\end{isamarkuptext}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    15
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
    16
\isamarkupsubsection{Advanced Features%
10395
7ef380745743 updated;
wenzelm
parents: 10281
diff changeset
    17
}
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    18
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
    19
\isamarkupsubsubsection{Congruence Rules%
10395
7ef380745743 updated;
wenzelm
parents: 10281
diff changeset
    20
}
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:simp-cong}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    24
It is hardwired into the simplifier that while simplifying the conclusion $Q$
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10978
diff changeset
    25
of $P \Imp Q$ it is legal to make uses of the assumption $P$. This
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    26
kind of contextual information can also be made available for other
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    27
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
    28
controlled by so-called \bfindex{congruence rules}. This is the one for
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    29
\isa{{\isasymlongrightarrow}}:
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    30
\begin{isabelle}%
10696
76d7f6c9a14c *** empty log message ***
nipkow
parents: 10668
diff changeset
    31
\ \ \ \ \ {\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}%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    32
\end{isabelle}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    33
It should be read as follows:
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    34
In order to simplify \isa{P\ {\isasymlongrightarrow}\ Q} to \isa{P{\isacharprime}\ {\isasymlongrightarrow}\ Q{\isacharprime}},
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    35
simplify \isa{P} to \isa{P{\isacharprime}}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    36
and assume \isa{P{\isacharprime}} when simplifying \isa{Q} to \isa{Q{\isacharprime}}.
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    37
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    38
Here are some more examples.  The congruence rules for bounded
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    39
quantifiers supply contextual information about the bound variable:
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    40
\begin{isabelle}%
10696
76d7f6c9a14c *** empty log message ***
nipkow
parents: 10668
diff changeset
    41
\ \ \ \ \ {\isasymlbrakk}A\ {\isacharequal}\ B{\isacharsemicolon}\ {\isasymAnd}x{\isachardot}\ x\ {\isasymin}\ B\ {\isasymLongrightarrow}\ P\ x\ {\isacharequal}\ Q\ x{\isasymrbrakk}\isanewline
10950
aa788fcb75a5 updated;
wenzelm
parents: 10878
diff changeset
    42
\isaindent{\ \ \ \ \ }{\isasymLongrightarrow}\ {\isacharparenleft}{\isasymforall}x{\isasymin}A{\isachardot}\ P\ x{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}{\isasymforall}x{\isasymin}B{\isachardot}\ Q\ x{\isacharparenright}%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    43
\end{isabelle}
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10978
diff changeset
    44
The congruence rule for conditional expressions supplies contextual
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10978
diff changeset
    45
information for simplifying the \isa{then} and \isa{else} cases:
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    46
\begin{isabelle}%
10696
76d7f6c9a14c *** empty log message ***
nipkow
parents: 10668
diff changeset
    47
\ \ \ \ \ {\isasymlbrakk}b\ {\isacharequal}\ c{\isacharsemicolon}\ c\ {\isasymLongrightarrow}\ x\ {\isacharequal}\ u{\isacharsemicolon}\ {\isasymnot}\ c\ {\isasymLongrightarrow}\ y\ {\isacharequal}\ v{\isasymrbrakk}\isanewline
10950
aa788fcb75a5 updated;
wenzelm
parents: 10878
diff changeset
    48
\isaindent{\ \ \ \ \ }{\isasymLongrightarrow}\ {\isacharparenleft}if\ b\ then\ x\ else\ y{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}if\ c\ then\ u\ else\ v{\isacharparenright}%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    49
\end{isabelle}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    50
A congruence rule can also \emph{prevent} simplification of some arguments.
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    51
Here is an alternative congruence rule for conditional expressions:
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    52
\begin{isabelle}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    53
\ \ \ \ \ 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
    54
\end{isabelle}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    55
Only the first argument is simplified; the others remain unchanged.
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    56
This makes simplification much faster and is faithful to the evaluation
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    57
strategy in programming languages, which is why this is the default
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10978
diff changeset
    58
congruence rule for \isa{if}. Analogous rules control the evaluation of
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    59
\isa{case} expressions.
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    60
11458
09a6c44a48ea numerous stylistic changes and indexing
paulson
parents: 11216
diff changeset
    61
You can declare your own congruence rules with the attribute \attrdx{cong},
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    62
either globally, in the usual manner,
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    63
\begin{quote}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    64
\isacommand{declare} \textit{theorem-name} \isa{{\isacharbrackleft}cong{\isacharbrackright}}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    65
\end{quote}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    66
or locally in a \isa{simp} call by adding the modifier
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    67
\begin{quote}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    68
\isa{cong{\isacharcolon}} \textit{list of theorem names}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    69
\end{quote}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    70
The effect is reversed by \isa{cong\ del} instead of \isa{cong}.
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    71
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    72
\begin{warn}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    73
The congruence rule \isa{conj{\isacharunderscore}cong}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    74
\begin{isabelle}%
10696
76d7f6c9a14c *** empty log message ***
nipkow
parents: 10668
diff changeset
    75
\ \ \ \ \ {\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}%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    76
\end{isabelle}
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
    77
\par\noindent
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
    78
is occasionally useful but is not a default rule; you have to declare it explicitly.
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    79
\end{warn}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    80
\end{isamarkuptext}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    81
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
    82
\isamarkupsubsubsection{Permutative Rewrite Rules%
10395
7ef380745743 updated;
wenzelm
parents: 10281
diff changeset
    83
}
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    84
%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    85
\begin{isamarkuptext}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    86
\index{rewrite rule!permutative|bold}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    87
\index{rewriting!ordered|bold}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    88
\index{ordered rewriting|bold}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    89
\index{simplification!ordered|bold}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    90
An equation is a \bfindex{permutative rewrite rule} if the left-hand
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    91
side and right-hand side are the same up to renaming of variables.  The most
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    92
common permutative rule is commutativity: \isa{x\ {\isacharplus}\ y\ {\isacharequal}\ y\ {\isacharplus}\ x}.  Other examples
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    93
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
    94
once they apply, they can be used forever. The simplifier is aware of this
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    95
danger and treats permutative rules by means of a special strategy, called
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    96
\bfindex{ordered rewriting}: a permutative rewrite
10978
5eebea8f359f *** empty log message ***
nipkow
parents: 10950
diff changeset
    97
rule is only applied if the term becomes smaller with respect to a fixed
5eebea8f359f *** empty log message ***
nipkow
parents: 10950
diff changeset
    98
lexicographic ordering on terms. For example, commutativity rewrites
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
    99
\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
   100
smaller than \isa{b\ {\isacharplus}\ a}.  Permutative rewrite rules can be turned into
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   101
simplification rules in the usual manner via the \isa{simp} attribute; the
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   102
simplifier recognizes their special status automatically.
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   103
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   104
Permutative rewrite rules are most effective in the case of
10281
9554ce1c2e54 *** empty log message ***
nipkow
parents: 10186
diff changeset
   105
associative-commutative functions.  (Associativity by itself is not
9554ce1c2e54 *** empty log message ***
nipkow
parents: 10186
diff changeset
   106
permutative.)  When dealing with an AC-function~$f$, keep the
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   107
following points in mind:
10281
9554ce1c2e54 *** empty log message ***
nipkow
parents: 10186
diff changeset
   108
\begin{itemize}\index{associative-commutative function}
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   109
  
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   110
\item The associative law must always be oriented from left to right,
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   111
  namely $f(f(x,y),z) = f(x,f(y,z))$.  The opposite orientation, if
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   112
  used with commutativity, can lead to nontermination.
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   113
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   114
\item To complete your set of rewrite rules, you must add not just
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   115
  associativity~(A) and commutativity~(C) but also a derived rule, {\bf
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   116
    left-com\-mut\-ativ\-ity} (LC): $f(x,f(y,z)) = f(y,f(x,z))$.
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   117
\end{itemize}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   118
Ordered rewriting with the combination of A, C, and LC sorts a term
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   119
lexicographically:
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   120
\[\def\maps#1{~\stackrel{#1}{\leadsto}~}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   121
 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
   122
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   123
Note that ordered rewriting for \isa{{\isacharplus}} and \isa{{\isacharasterisk}} on numbers is rarely
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   124
necessary because the built-in arithmetic prover often succeeds without
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10978
diff changeset
   125
such tricks.%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   126
\end{isamarkuptext}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   127
%
11216
279004936bb0 *** empty log message ***
nipkow
parents: 11196
diff changeset
   128
\isamarkupsubsection{How it Works%
10395
7ef380745743 updated;
wenzelm
parents: 10281
diff changeset
   129
}
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   130
%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   131
\begin{isamarkuptext}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   132
\label{sec:SimpHow}
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   133
Roughly speaking, the simplifier proceeds bottom-up (subterms are simplified
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   134
first) and a conditional equation is only applied if its condition could be
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   135
proved (again by simplification). Below we explain some special features of the rewriting process.%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   136
\end{isamarkuptext}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   137
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   138
\isamarkupsubsubsection{Higher-Order Patterns%
10395
7ef380745743 updated;
wenzelm
parents: 10281
diff changeset
   139
}
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   140
%
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   141
\begin{isamarkuptext}%
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   142
\index{simplification rule|(}
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   143
So far we have pretended the simplifier can deal with arbitrary
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   144
rewrite rules. This is not quite true.  Due to efficiency (and
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   145
potentially also computability) reasons, the simplifier expects the
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   146
left-hand side of each rule to be a so-called \emph{higher-order
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   147
pattern}~\cite{nipkow-patterns}\indexbold{higher-order
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   148
pattern}\indexbold{pattern, higher-order}. This restricts where
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   149
unknowns may occur.  Higher-order patterns are terms in $\beta$-normal
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   150
form (this will always be the case unless you have done something
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   151
strange) where each occurrence of an unknown is of the form
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   152
$\Var{f}~x@1~\dots~x@n$, where the $x@i$ are distinct bound
10978
5eebea8f359f *** empty log message ***
nipkow
parents: 10950
diff changeset
   153
variables. Thus all ordinary rewrite rules, where all unknowns are
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   154
of base type, for example \isa{{\isacharquery}m\ {\isacharplus}\ {\isacharquery}n\ {\isacharplus}\ {\isacharquery}k\ {\isacharequal}\ {\isacharquery}m\ {\isacharplus}\ {\isacharparenleft}{\isacharquery}n\ {\isacharplus}\ {\isacharquery}k{\isacharparenright}}, are OK: if an unknown is
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   155
of base type, it cannot have any arguments. Additionally, the rule
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   156
\isa{{\isacharparenleft}{\isasymforall}x{\isachardot}\ {\isacharquery}P\ x\ {\isasymand}\ {\isacharquery}Q\ x{\isacharparenright}\ {\isacharequal}\ {\isacharparenleft}{\isacharparenleft}{\isasymforall}x{\isachardot}\ {\isacharquery}P\ x{\isacharparenright}\ {\isasymand}\ {\isacharparenleft}{\isasymforall}x{\isachardot}\ {\isacharquery}Q\ x{\isacharparenright}{\isacharparenright}} is also OK, in
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   157
both directions: all arguments of the unknowns \isa{{\isacharquery}P} and
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   158
\isa{{\isacharquery}Q} are distinct bound variables.
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   159
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   160
If the left-hand side is not a higher-order pattern, not all is lost
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   161
and the simplifier will still try to apply the rule, but only if it
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   162
matches \emph{directly}, i.e.\ without much $\lambda$-calculus hocus
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   163
pocus. For example, \isa{{\isacharquery}f\ {\isacharquery}x\ {\isasymin}\ range\ {\isacharquery}f\ {\isacharequal}\ True} rewrites
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   164
\isa{g\ a\ {\isasymin}\ range\ g} to \isa{True}, but will fail to match
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   165
\isa{g{\isacharparenleft}h\ b{\isacharparenright}\ {\isasymin}\ range{\isacharparenleft}{\isasymlambda}x{\isachardot}\ g{\isacharparenleft}h\ x{\isacharparenright}{\isacharparenright}}.  However, you can
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   166
replace the offending subterms (in our case \isa{{\isacharquery}f\ {\isacharquery}x}, which
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   167
is not a pattern) by adding new variables and conditions: \isa{{\isacharquery}y\ {\isacharequal}\ {\isacharquery}f\ {\isacharquery}x\ {\isasymLongrightarrow}\ {\isacharquery}y\ {\isasymin}\ range\ {\isacharquery}f\ {\isacharequal}\ True} is fine
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   168
as a conditional rewrite rule since conditions can be arbitrary
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   169
terms. However, this trick is not a panacea because the newly
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10978
diff changeset
   170
introduced conditions may be hard to solve.
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   171
  
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   172
There is no restriction on the form of the right-hand
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   173
sides.  They may not contain extraneous term or type variables, though.%
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   174
\end{isamarkuptext}%
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   175
%
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   176
\isamarkupsubsubsection{The Preprocessor%
10395
7ef380745743 updated;
wenzelm
parents: 10281
diff changeset
   177
}
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   178
%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   179
\begin{isamarkuptext}%
10845
3696bc935bbd *** empty log message ***
nipkow
parents: 10795
diff changeset
   180
\label{sec:simp-preprocessor}
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   181
When a theorem is declared a simplification rule, it need not be a
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   182
conditional equation already.  The simplifier will turn it into a set of
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   183
conditional equations automatically.  For example, \isa{f\ x\ {\isacharequal}\ g\ x\ {\isasymand}\ h\ x\ {\isacharequal}\ k\ x} becomes the two separate
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   184
simplification rules \isa{f\ x\ {\isacharequal}\ g\ x} and \isa{h\ x\ {\isacharequal}\ k\ x}. In
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   185
general, the input theorem is converted as follows:
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   186
\begin{eqnarray}
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   187
\neg P &\mapsto& P = \hbox{\isa{False}} \nonumber\\
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   188
P \longrightarrow Q &\mapsto& P \Longrightarrow Q \nonumber\\
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   189
P \land Q &\mapsto& P,\ Q \nonumber\\
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   190
\forall x.~P~x &\mapsto& P~\Var{x}\nonumber\\
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   191
\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
   192
\isa{if}\ P\ \isa{then}\ Q\ \isa{else}\ R &\mapsto&
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   193
 P \Longrightarrow Q,\ \neg P \Longrightarrow R \nonumber
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   194
\end{eqnarray}
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   195
Once this conversion process is finished, all remaining non-equations
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   196
$P$ are turned into trivial equations $P =\isa{True}$.
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   197
For example, the formula 
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   198
\begin{center}\isa{{\isacharparenleft}p\ {\isasymlongrightarrow}\ t\ {\isacharequal}\ u\ {\isasymand}\ {\isasymnot}\ r{\isacharparenright}\ {\isasymand}\ s}\end{center}
10845
3696bc935bbd *** empty log message ***
nipkow
parents: 10795
diff changeset
   199
is converted into the three rules
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   200
\begin{center}
10878
b254d5ad6dd4 auto update
paulson
parents: 10845
diff changeset
   201
\isa{p\ {\isasymLongrightarrow}\ t\ {\isacharequal}\ u},\quad  \isa{p\ {\isasymLongrightarrow}\ r\ {\isacharequal}\ False},\quad  \isa{s\ {\isacharequal}\ True}.
10186
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   202
\end{center}
499637e8f2c6 *** empty log message ***
nipkow
parents: 9993
diff changeset
   203
\index{simplification rule|)}
9993
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   204
\index{simplification|)}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   205
\end{isamarkuptext}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   206
\end{isabellebody}%
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   207
%%% Local Variables:
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   208
%%% mode: latex
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   209
%%% TeX-master: "root"
c0f7fb6e538e *** empty log message ***
nipkow
parents:
diff changeset
   210
%%% End: