9958
|
1 |
(*<*)
|
|
2 |
theory simp = Main:
|
|
3 |
(*>*)
|
|
4 |
|
|
5 |
section{*Simplification*}
|
|
6 |
|
|
7 |
text{*\label{sec:simplification-II}\index{simplification|(}
|
|
8 |
This section discusses some additional nifty features not covered so far and
|
|
9 |
gives a short introduction to the simplification process itself. The latter
|
|
10 |
is helpful to understand why a particular rule does or does not apply in some
|
|
11 |
situation.
|
|
12 |
*}
|
|
13 |
|
10885
|
14 |
subsection{*Advanced Features*}
|
9958
|
15 |
|
10885
|
16 |
subsubsection{*Congruence Rules*}
|
9958
|
17 |
|
|
18 |
text{*\label{sec:simp-cong}
|
|
19 |
It is hardwired into the simplifier that while simplifying the conclusion $Q$
|
11196
|
20 |
of $P \Imp Q$ it is legal to make uses of the assumption $P$. This
|
9958
|
21 |
kind of contextual information can also be made available for other
|
|
22 |
operators. For example, @{prop"xs = [] --> xs@xs = xs"} simplifies to @{term
|
|
23 |
True} because we may use @{prop"xs = []"} when simplifying @{prop"xs@xs =
|
|
24 |
xs"}. The generation of contextual information during simplification is
|
|
25 |
controlled by so-called \bfindex{congruence rules}. This is the one for
|
|
26 |
@{text"\<longrightarrow>"}:
|
|
27 |
@{thm[display]imp_cong[no_vars]}
|
|
28 |
It should be read as follows:
|
|
29 |
In order to simplify @{prop"P-->Q"} to @{prop"P'-->Q'"},
|
|
30 |
simplify @{prop P} to @{prop P'}
|
|
31 |
and assume @{prop"P'"} when simplifying @{prop Q} to @{prop"Q'"}.
|
|
32 |
|
|
33 |
Here are some more examples. The congruence rules for bounded
|
|
34 |
quantifiers supply contextual information about the bound variable:
|
|
35 |
@{thm[display,eta_contract=false,margin=60]ball_cong[no_vars]}
|
11196
|
36 |
The congruence rule for conditional expressions supplies contextual
|
|
37 |
information for simplifying the @{text then} and @{text else} cases:
|
9958
|
38 |
@{thm[display]if_cong[no_vars]}
|
|
39 |
A congruence rule can also \emph{prevent} simplification of some arguments.
|
|
40 |
Here is an alternative congruence rule for conditional expressions:
|
|
41 |
@{thm[display]if_weak_cong[no_vars]}
|
|
42 |
Only the first argument is simplified; the others remain unchanged.
|
|
43 |
This makes simplification much faster and is faithful to the evaluation
|
|
44 |
strategy in programming languages, which is why this is the default
|
11196
|
45 |
congruence rule for @{text if}. Analogous rules control the evaluation of
|
9958
|
46 |
@{text case} expressions.
|
|
47 |
|
10885
|
48 |
You can declare your own congruence rules with the attribute @{text cong},
|
9958
|
49 |
either globally, in the usual manner,
|
|
50 |
\begin{quote}
|
|
51 |
\isacommand{declare} \textit{theorem-name} @{text"[cong]"}
|
|
52 |
\end{quote}
|
|
53 |
or locally in a @{text"simp"} call by adding the modifier
|
|
54 |
\begin{quote}
|
|
55 |
@{text"cong:"} \textit{list of theorem names}
|
|
56 |
\end{quote}
|
|
57 |
The effect is reversed by @{text"cong del"} instead of @{text cong}.
|
|
58 |
|
|
59 |
\begin{warn}
|
|
60 |
The congruence rule @{thm[source]conj_cong}
|
|
61 |
@{thm[display]conj_cong[no_vars]}
|
10885
|
62 |
\par\noindent
|
|
63 |
is occasionally useful but is not a default rule; you have to declare it explicitly.
|
9958
|
64 |
\end{warn}
|
|
65 |
*}
|
|
66 |
|
10885
|
67 |
subsubsection{*Permutative Rewrite Rules*}
|
9958
|
68 |
|
|
69 |
text{*
|
|
70 |
\index{rewrite rule!permutative|bold}
|
|
71 |
\index{rewriting!ordered|bold}
|
|
72 |
\index{ordered rewriting|bold}
|
|
73 |
\index{simplification!ordered|bold}
|
|
74 |
An equation is a \bfindex{permutative rewrite rule} if the left-hand
|
|
75 |
side and right-hand side are the same up to renaming of variables. The most
|
|
76 |
common permutative rule is commutativity: @{prop"x+y = y+x"}. Other examples
|
|
77 |
include @{prop"(x-y)-z = (x-z)-y"} in arithmetic and @{prop"insert x (insert
|
|
78 |
y A) = insert y (insert x A)"} for sets. Such rules are problematic because
|
|
79 |
once they apply, they can be used forever. The simplifier is aware of this
|
|
80 |
danger and treats permutative rules by means of a special strategy, called
|
|
81 |
\bfindex{ordered rewriting}: a permutative rewrite
|
10978
|
82 |
rule is only applied if the term becomes smaller with respect to a fixed
|
|
83 |
lexicographic ordering on terms. For example, commutativity rewrites
|
9958
|
84 |
@{term"b+a"} to @{term"a+b"}, but then stops because @{term"a+b"} is strictly
|
|
85 |
smaller than @{term"b+a"}. Permutative rewrite rules can be turned into
|
|
86 |
simplification rules in the usual manner via the @{text simp} attribute; the
|
|
87 |
simplifier recognizes their special status automatically.
|
|
88 |
|
|
89 |
Permutative rewrite rules are most effective in the case of
|
10281
|
90 |
associative-commutative functions. (Associativity by itself is not
|
|
91 |
permutative.) When dealing with an AC-function~$f$, keep the
|
9958
|
92 |
following points in mind:
|
10281
|
93 |
\begin{itemize}\index{associative-commutative function}
|
9958
|
94 |
|
|
95 |
\item The associative law must always be oriented from left to right,
|
|
96 |
namely $f(f(x,y),z) = f(x,f(y,z))$. The opposite orientation, if
|
|
97 |
used with commutativity, can lead to nontermination.
|
|
98 |
|
|
99 |
\item To complete your set of rewrite rules, you must add not just
|
|
100 |
associativity~(A) and commutativity~(C) but also a derived rule, {\bf
|
|
101 |
left-com\-mut\-ativ\-ity} (LC): $f(x,f(y,z)) = f(y,f(x,z))$.
|
|
102 |
\end{itemize}
|
|
103 |
Ordered rewriting with the combination of A, C, and LC sorts a term
|
|
104 |
lexicographically:
|
|
105 |
\[\def\maps#1{~\stackrel{#1}{\leadsto}~}
|
|
106 |
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)) \]
|
|
107 |
|
|
108 |
Note that ordered rewriting for @{text"+"} and @{text"*"} on numbers is rarely
|
10885
|
109 |
necessary because the built-in arithmetic prover often succeeds without
|
11196
|
110 |
such tricks.
|
9958
|
111 |
*}
|
|
112 |
|
11216
|
113 |
subsection{*How it Works*}
|
9958
|
114 |
|
|
115 |
text{*\label{sec:SimpHow}
|
|
116 |
Roughly speaking, the simplifier proceeds bottom-up (subterms are simplified
|
|
117 |
first) and a conditional equation is only applied if its condition could be
|
10186
|
118 |
proved (again by simplification). Below we explain some special features of the rewriting process.
|
9958
|
119 |
*}
|
|
120 |
|
10885
|
121 |
subsubsection{*Higher-Order Patterns*}
|
9958
|
122 |
|
10186
|
123 |
text{*\index{simplification rule|(}
|
|
124 |
So far we have pretended the simplifier can deal with arbitrary
|
|
125 |
rewrite rules. This is not quite true. Due to efficiency (and
|
|
126 |
potentially also computability) reasons, the simplifier expects the
|
|
127 |
left-hand side of each rule to be a so-called \emph{higher-order
|
|
128 |
pattern}~\cite{nipkow-patterns}\indexbold{higher-order
|
|
129 |
pattern}\indexbold{pattern, higher-order}. This restricts where
|
|
130 |
unknowns may occur. Higher-order patterns are terms in $\beta$-normal
|
|
131 |
form (this will always be the case unless you have done something
|
|
132 |
strange) where each occurrence of an unknown is of the form
|
|
133 |
$\Var{f}~x@1~\dots~x@n$, where the $x@i$ are distinct bound
|
10978
|
134 |
variables. Thus all ordinary rewrite rules, where all unknowns are
|
10186
|
135 |
of base type, for example @{thm add_assoc}, are OK: if an unknown is
|
|
136 |
of base type, it cannot have any arguments. Additionally, the rule
|
|
137 |
@{text"(\<forall>x. ?P x \<and> ?Q x) = ((\<forall>x. ?P x) \<and> (\<forall>x. ?Q x))"} is also OK, in
|
|
138 |
both directions: all arguments of the unknowns @{text"?P"} and
|
|
139 |
@{text"?Q"} are distinct bound variables.
|
|
140 |
|
|
141 |
If the left-hand side is not a higher-order pattern, not all is lost
|
|
142 |
and the simplifier will still try to apply the rule, but only if it
|
10885
|
143 |
matches \emph{directly}, i.e.\ without much $\lambda$-calculus hocus
|
10186
|
144 |
pocus. For example, @{text"?f ?x \<in> range ?f = True"} rewrites
|
|
145 |
@{term"g a \<in> range g"} to @{term True}, but will fail to match
|
|
146 |
@{text"g(h b) \<in> range(\<lambda>x. g(h x))"}. However, you can
|
|
147 |
replace the offending subterms (in our case @{text"?f ?x"}, which
|
|
148 |
is not a pattern) by adding new variables and conditions: @{text"?y =
|
|
149 |
?f ?x \<Longrightarrow> ?y \<in> range ?f = True"} is fine
|
|
150 |
as a conditional rewrite rule since conditions can be arbitrary
|
|
151 |
terms. However, this trick is not a panacea because the newly
|
11196
|
152 |
introduced conditions may be hard to solve.
|
10186
|
153 |
|
10885
|
154 |
There is no restriction on the form of the right-hand
|
10186
|
155 |
sides. They may not contain extraneous term or type variables, though.
|
|
156 |
*}
|
9958
|
157 |
|
10885
|
158 |
subsubsection{*The Preprocessor*}
|
9958
|
159 |
|
10845
|
160 |
text{*\label{sec:simp-preprocessor}
|
10885
|
161 |
When a theorem is declared a simplification rule, it need not be a
|
10186
|
162 |
conditional equation already. The simplifier will turn it into a set of
|
10885
|
163 |
conditional equations automatically. For example, @{prop"f x =
|
|
164 |
g x & h x = k x"} becomes the two separate
|
|
165 |
simplification rules @{prop"f x = g x"} and @{prop"h x = k x"}. In
|
10186
|
166 |
general, the input theorem is converted as follows:
|
|
167 |
\begin{eqnarray}
|
10885
|
168 |
\neg P &\mapsto& P = \hbox{\isa{False}} \nonumber\\
|
10186
|
169 |
P \longrightarrow Q &\mapsto& P \Longrightarrow Q \nonumber\\
|
|
170 |
P \land Q &\mapsto& P,\ Q \nonumber\\
|
|
171 |
\forall x.~P~x &\mapsto& P~\Var{x}\nonumber\\
|
|
172 |
\forall x \in A.\ P~x &\mapsto& \Var{x} \in A \Longrightarrow P~\Var{x} \nonumber\\
|
|
173 |
@{text if}\ P\ @{text then}\ Q\ @{text else}\ R &\mapsto&
|
|
174 |
P \Longrightarrow Q,\ \neg P \Longrightarrow R \nonumber
|
|
175 |
\end{eqnarray}
|
|
176 |
Once this conversion process is finished, all remaining non-equations
|
10885
|
177 |
$P$ are turned into trivial equations $P =\isa{True}$.
|
|
178 |
For example, the formula
|
|
179 |
\begin{center}@{prop"(p \<longrightarrow> t=u \<and> ~r) \<and> s"}\end{center}
|
10845
|
180 |
is converted into the three rules
|
10186
|
181 |
\begin{center}
|
10885
|
182 |
@{prop"p \<Longrightarrow> t = u"},\quad @{prop"p \<Longrightarrow> r = False"},\quad @{prop"s = True"}.
|
10186
|
183 |
\end{center}
|
|
184 |
\index{simplification rule|)}
|
9958
|
185 |
\index{simplification|)}
|
|
186 |
*}
|
|
187 |
(*<*)
|
|
188 |
end
|
|
189 |
(*>*)
|