| author | blanchet | 
| Tue, 20 Mar 2012 18:42:45 +0100 | |
| changeset 47053 | 7585d0120f1d | 
| parent 45645 | 4014bc2a09ff | 
| permissions | -rw-r--r-- | 
| 30184 
37969710e61f
removed parts of the manual that are clearly obsolete, or covered by
 wenzelm parents: 
16019diff
changeset | 1 | |
| 3950 | 2 | \chapter{Simplification}
 | 
| 3 | \label{chap:simplification}
 | |
| 104 | 4 | \index{simplification|(}
 | 
| 5 | ||
| 9695 | 6 | This chapter describes Isabelle's generic simplification package. It performs | 
| 7 | conditional and unconditional rewriting and uses contextual information | |
| 8 | (`local assumptions'). It provides several general hooks, which can provide | |
| 9 | automatic case splits during rewriting, for example. The simplifier is | |
| 10 | already set up for many of Isabelle's logics: FOL, ZF, HOL, HOLCF. | |
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 11 | |
| 4395 | 12 | The first section is a quick introduction to the simplifier that | 
| 13 | should be sufficient to get started. The later sections explain more | |
| 14 | advanced features. | |
| 15 | ||
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 16 | |
| 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 17 | \section{Simplification for dummies}
 | 
| 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 18 | \label{sec:simp-for-dummies}
 | 
| 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 19 | |
| 4395 | 20 | Basic use of the simplifier is particularly easy because each theory | 
| 4557 | 21 | is equipped with sensible default information controlling the rewrite | 
| 22 | process --- namely the implicit {\em current
 | |
| 23 |   simpset}\index{simpset!current}.  A suite of simple commands is
 | |
| 24 | provided that refer to the implicit simpset of the current theory | |
| 25 | context. | |
| 4395 | 26 | |
| 27 | \begin{warn}
 | |
| 28 | Make sure that you are working within the correct theory context. | |
| 29 | Executing proofs interactively, or loading them from ML files | |
| 30 | without associated theories may require setting the current theory | |
| 31 |   manually via the \ttindex{context} command.
 | |
| 32 | \end{warn}
 | |
| 33 | ||
| 34 | \subsection{Simplification tactics} \label{sec:simp-for-dummies-tacs}
 | |
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 35 | \begin{ttbox}
 | 
| 4395 | 36 | Simp_tac : int -> tactic | 
| 37 | Asm_simp_tac : int -> tactic | |
| 38 | Full_simp_tac : int -> tactic | |
| 39 | Asm_full_simp_tac : int -> tactic | |
| 40 | trace_simp        : bool ref \hfill{\bf initially false}
 | |
| 7920 | 41 | debug_simp        : bool ref \hfill{\bf initially false}
 | 
| 4395 | 42 | \end{ttbox}
 | 
| 43 | ||
| 44 | \begin{ttdescription}
 | |
| 45 | \item[\ttindexbold{Simp_tac} $i$] simplifies subgoal~$i$ using the
 | |
| 46 | current simpset. It may solve the subgoal completely if it has | |
| 47 | become trivial, using the simpset's solver tactic. | |
| 48 | ||
| 49 | \item[\ttindexbold{Asm_simp_tac}]\index{assumptions!in simplification}
 | |
| 50 | is like \verb$Simp_tac$, but extracts additional rewrite rules from | |
| 51 | the local assumptions. | |
| 52 | ||
| 53 | \item[\ttindexbold{Full_simp_tac}] is like \verb$Simp_tac$, but also
 | |
| 54 | simplifies the assumptions (without using the assumptions to | |
| 55 | simplify each other or the actual goal). | |
| 56 | ||
| 57 | \item[\ttindexbold{Asm_full_simp_tac}] is like \verb$Asm_simp_tac$,
 | |
| 4889 | 58 | but also simplifies the assumptions. In particular, assumptions can | 
| 59 | simplify each other. | |
| 60 | \footnote{\texttt{Asm_full_simp_tac} used to process the assumptions from
 | |
| 61 | left to right. For backwards compatibilty reasons only there is now | |
| 62 |   \texttt{Asm_lr_simp_tac} that behaves like the old \texttt{Asm_full_simp_tac}.}
 | |
| 7920 | 63 | \item[set \ttindexbold{trace_simp};] makes the simplifier output internal
 | 
| 64 | operations. This includes rewrite steps, but also bookkeeping like | |
| 65 | modifications of the simpset. | |
| 66 | \item[set \ttindexbold{debug_simp};] makes the simplifier output some extra
 | |
| 67 | information about internal operations. This includes any attempted | |
| 68 | invocation of simplification procedures. | |
| 4395 | 69 | \end{ttdescription}
 | 
| 70 | ||
| 71 | \medskip | |
| 72 | ||
| 9695 | 73 | As an example, consider the theory of arithmetic in HOL. The (rather trivial) | 
| 74 | goal $0 + (x + 0) = x + 0 + 0$ can be solved by a single call of | |
| 75 | \texttt{Simp_tac} as follows:
 | |
| 4395 | 76 | \begin{ttbox}
 | 
| 77 | context Arith.thy; | |
| 5205 | 78 | Goal "0 + (x + 0) = x + 0 + 0"; | 
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 79 | {\out  1. 0 + (x + 0) = x + 0 + 0}
 | 
| 4395 | 80 | by (Simp_tac 1); | 
| 81 | {\out Level 1}
 | |
| 82 | {\out 0 + (x + 0) = x + 0 + 0}
 | |
| 83 | {\out No subgoals!}
 | |
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 84 | \end{ttbox}
 | 
| 4395 | 85 | |
| 86 | The simplifier uses the current simpset of \texttt{Arith.thy}, which
 | |
| 87 | contains suitable theorems like $\Var{n}+0 = \Var{n}$ and $0+\Var{n} =
 | |
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 88 | \Var{n}$.
 | 
| 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 89 | |
| 4395 | 90 | \medskip In many cases, assumptions of a subgoal are also needed in | 
| 91 | the simplification process.  For example, \texttt{x = 0 ==> x + x = 0}
 | |
| 92 | is solved by \texttt{Asm_simp_tac} as follows:
 | |
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 93 | \begin{ttbox}
 | 
| 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 94 | {\out  1. x = 0 ==> x + x = 0}
 | 
| 2479 | 95 | by (Asm_simp_tac 1); | 
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 96 | \end{ttbox}
 | 
| 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 97 | |
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 98 | \medskip \texttt{Asm_full_simp_tac} is the most powerful of this quartet
 | 
| 4395 | 99 | of tactics but may also loop where some of the others terminate. For | 
| 100 | example, | |
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 101 | \begin{ttbox}
 | 
| 4395 | 102 | {\out  1. ALL x. f x = g (f (g x)) ==> f 0 = f 0 + 0}
 | 
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 103 | \end{ttbox}
 | 
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 104 | is solved by \texttt{Simp_tac}, but \texttt{Asm_simp_tac} and {\tt
 | 
| 13616 | 105 |   Asm_full_simp_tac} loop because the rewrite rule $f\,\Var{x} =
 | 
| 4395 | 106 | g\,(f\,(g\,\Var{x}))$ extracted from the assumption does not
 | 
| 107 | terminate. Isabelle notices certain simple forms of nontermination, | |
| 4889 | 108 | but not this one. Because assumptions may simplify each other, there can be | 
| 13616 | 109 | very subtle cases of nontermination. For example, invoking | 
| 110 | {\tt Asm_full_simp_tac} on
 | |
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 111 | \begin{ttbox}
 | 
| 13616 | 112 | {\out  1. [| P (f x); y = x; f x = f y |] ==> Q}
 | 
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 113 | \end{ttbox}
 | 
| 13616 | 114 | gives rise to the infinite reduction sequence | 
| 115 | \[ | |
| 13693 
77052bb8aed3
Removed obsolete section about reordering assumptions.
 berghofe parents: 
13616diff
changeset | 116 | P\,(f\,x) \stackrel{f\,x = f\,y}{\longmapsto} P\,(f\,y) \stackrel{y = x}{\longmapsto}
 | 
| 
77052bb8aed3
Removed obsolete section about reordering assumptions.
 berghofe parents: 
13616diff
changeset | 117 | P\,(f\,x) \stackrel{f\,x = f\,y}{\longmapsto} \cdots
 | 
| 13616 | 118 | \] | 
| 119 | whereas applying the same tactic to | |
| 120 | \begin{ttbox}
 | |
| 121 | {\out  1. [| y = x; f x = f y; P (f x) |] ==> Q}
 | |
| 122 | \end{ttbox}
 | |
| 123 | terminates. | |
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 124 | |
| 4395 | 125 | \medskip | 
| 126 | ||
| 3108 | 127 | Using the simplifier effectively may take a bit of experimentation. | 
| 4395 | 128 | Set the \verb$trace_simp$\index{tracing!of simplification} flag to get
 | 
| 129 | a better idea of what is going on. The resulting output can be | |
| 130 | enormous, especially since invocations of the simplifier are often | |
| 131 | nested (e.g.\ when solving conditions of rewrite rules). | |
| 132 | ||
| 133 | ||
| 134 | \subsection{Modifying the current simpset}
 | |
| 135 | \begin{ttbox}
 | |
| 136 | Addsimps : thm list -> unit | |
| 137 | Delsimps : thm list -> unit | |
| 138 | Addsimprocs : simproc list -> unit | |
| 139 | Delsimprocs : simproc list -> unit | |
| 140 | Addcongs : thm list -> unit | |
| 141 | Delcongs : thm list -> unit | |
| 5549 | 142 | Addsplits : thm list -> unit | 
| 143 | Delsplits : thm list -> unit | |
| 4395 | 144 | \end{ttbox}
 | 
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 145 | |
| 4395 | 146 | Depending on the theory context, the \texttt{Add} and \texttt{Del}
 | 
| 147 | functions manipulate basic components of the associated current | |
| 148 | simpset. Internally, all rewrite rules have to be expressed as | |
| 149 | (conditional) meta-equalities. This form is derived automatically | |
| 150 | from object-level equations that are supplied by the user. Another | |
| 151 | source of rewrite rules are \emph{simplification procedures}, that is
 | |
| 152 | \ML\ functions that produce suitable theorems on demand, depending on | |
| 153 | the current redex. Congruences are a more advanced feature; see | |
| 11181 
d04f57b91166
renamed addaltern to addafter, addSaltern to addSafter
 oheimb parents: 
11162diff
changeset | 154 | {\S}\ref{sec:simp-congs}.
 | 
| 4395 | 155 | |
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 156 | \begin{ttdescription}
 | 
| 4395 | 157 | |
| 158 | \item[\ttindexbold{Addsimps} $thms$;] adds rewrite rules derived from
 | |
| 159 | $thms$ to the current simpset. | |
| 160 | ||
| 161 | \item[\ttindexbold{Delsimps} $thms$;] deletes rewrite rules derived
 | |
| 162 | from $thms$ from the current simpset. | |
| 163 | ||
| 164 | \item[\ttindexbold{Addsimprocs} $procs$;] adds simplification
 | |
| 165 | procedures $procs$ to the current simpset. | |
| 166 | ||
| 167 | \item[\ttindexbold{Delsimprocs} $procs$;] deletes simplification
 | |
| 168 | procedures $procs$ from the current simpset. | |
| 169 | ||
| 170 | \item[\ttindexbold{Addcongs} $thms$;] adds congruence rules to the
 | |
| 171 | current simpset. | |
| 172 | ||
| 5549 | 173 | \item[\ttindexbold{Delcongs} $thms$;] deletes congruence rules from the
 | 
| 174 | current simpset. | |
| 175 | ||
| 176 | \item[\ttindexbold{Addsplits} $thms$;] adds splitting rules to the
 | |
| 177 | current simpset. | |
| 178 | ||
| 179 | \item[\ttindexbold{Delsplits} $thms$;] deletes splitting rules from the
 | |
| 4395 | 180 | current simpset. | 
| 181 | ||
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 182 | \end{ttdescription}
 | 
| 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 183 | |
| 9695 | 184 | When a new theory is built, its implicit simpset is initialized by the union | 
| 185 | of the respective simpsets of its parent theories. In addition, certain | |
| 186 | theory definition constructs (e.g.\ \ttindex{datatype} and \ttindex{primrec}
 | |
| 187 | in HOL) implicitly augment the current simpset. Ordinary definitions are not | |
| 188 | added automatically! | |
| 4395 | 189 | |
| 190 | It is up the user to manipulate the current simpset further by | |
| 191 | explicitly adding or deleting theorems and simplification procedures. | |
| 192 | ||
| 193 | \medskip | |
| 194 | ||
| 5205 | 195 | Good simpsets are hard to design. Rules that obviously simplify, | 
| 196 | like $\Var{n}+0 = \Var{n}$, should be added to the current simpset right after
 | |
| 197 | they have been proved. More specific ones (such as distributive laws, which | |
| 198 | duplicate subterms) should be added only for specific proofs and deleted | |
| 199 | afterwards. Conversely, sometimes a rule needs | |
| 200 | to be removed for a certain proof and restored afterwards. The need of | |
| 201 | frequent additions or deletions may indicate a badly designed | |
| 202 | simpset. | |
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 203 | |
| 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 204 | \begin{warn}
 | 
| 4395 | 205 | The union of the parent simpsets (as described above) is not always | 
| 206 | a good starting point for the new theory. If some ancestors have | |
| 207 | deleted simplification rules because they are no longer wanted, | |
| 208 | while others have left those rules in, then the union will contain | |
| 5205 | 209 | the unwanted rules. After this union is formed, changes to | 
| 210 | a parent simpset have no effect on the child simpset. | |
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 211 | \end{warn}
 | 
| 104 | 212 | |
| 213 | ||
| 286 | 214 | \section{Simplification sets}\index{simplification sets} 
 | 
| 4395 | 215 | |
| 216 | The simplifier is controlled by information contained in {\bf
 | |
| 217 | simpsets}. These consist of several components, including rewrite | |
| 218 | rules, simplification procedures, congruence rules, and the subgoaler, | |
| 219 | solver and looper tactics. The simplifier should be set up with | |
| 220 | sensible defaults so that most simplifier calls specify only rewrite | |
| 221 | rules or simplification procedures. Experienced users can exploit the | |
| 222 | other components to streamline proofs in more sophisticated manners. | |
| 223 | ||
| 224 | \subsection{Inspecting simpsets}
 | |
| 225 | \begin{ttbox}
 | |
| 226 | print_ss : simpset -> unit | |
| 4889 | 227 | rep_ss   : simpset -> \{mss        : meta_simpset, 
 | 
| 4664 | 228 | subgoal_tac: simpset -> int -> tactic, | 
| 7620 | 229 | loop_tacs : (string * (int -> tactic))list, | 
| 230 | finish_tac : solver list, | |
| 231 | unsafe_finish_tac : solver list\} | |
| 4395 | 232 | \end{ttbox}
 | 
| 233 | \begin{ttdescription}
 | |
| 234 | ||
| 235 | \item[\ttindexbold{print_ss} $ss$;] displays the printable contents of
 | |
| 236 | simpset $ss$. This includes the rewrite rules and congruences in | |
| 237 | their internal form expressed as meta-equalities. The names of the | |
| 238 | simplification procedures and the patterns they are invoked on are | |
| 239 | also shown. The other parts, functions and tactics, are | |
| 240 | non-printable. | |
| 241 | ||
| 4664 | 242 | \item[\ttindexbold{rep_ss} $ss$;] decomposes $ss$ as a record of its internal 
 | 
| 243 | components, namely the meta_simpset, the subgoaler, the loop, and the safe | |
| 244 | and unsafe solvers. | |
| 245 | ||
| 4395 | 246 | \end{ttdescription}
 | 
| 247 | ||
| 323 | 248 | |
| 4395 | 249 | \subsection{Building simpsets}
 | 
| 250 | \begin{ttbox}
 | |
| 251 | empty_ss : simpset | |
| 252 | merge_ss : simpset * simpset -> simpset | |
| 253 | \end{ttbox}
 | |
| 254 | \begin{ttdescription}
 | |
| 255 | ||
| 9695 | 256 | \item[\ttindexbold{empty_ss}] is the empty simpset.  This is not very useful
 | 
| 257 | under normal circumstances because it doesn't contain suitable tactics | |
| 258 | (subgoaler etc.). When setting up the simplifier for a particular | |
| 259 | object-logic, one will typically define a more appropriate ``almost empty'' | |
| 260 |   simpset.  For example, in HOL this is called \ttindexbold{HOL_basic_ss}.
 | |
| 4395 | 261 | |
| 262 | \item[\ttindexbold{merge_ss} ($ss@1$, $ss@2$)] merges simpsets $ss@1$
 | |
| 263 | and $ss@2$ by building the union of their respective rewrite rules, | |
| 264 | simplification procedures and congruences. The other components | |
| 4557 | 265 | (tactics etc.) cannot be merged, though; they are taken from either | 
| 266 |   simpset\footnote{Actually from $ss@1$, but it would unwise to count
 | |
| 267 | on that.}. | |
| 4395 | 268 | |
| 269 | \end{ttdescription}
 | |
| 270 | ||
| 271 | ||
| 332 | 272 | \subsection{Rewrite rules}
 | 
| 4395 | 273 | \begin{ttbox}
 | 
| 274 | addsimps : simpset * thm list -> simpset \hfill{\bf infix 4}
 | |
| 275 | delsimps : simpset * thm list -> simpset \hfill{\bf infix 4}
 | |
| 276 | \end{ttbox}
 | |
| 277 | ||
| 278 | \index{rewrite rules|(} Rewrite rules are theorems expressing some
 | |
| 279 | form of equality, for example: | |
| 323 | 280 | \begin{eqnarray*}
 | 
| 281 |   Suc(\Var{m}) + \Var{n} &=&      \Var{m} + Suc(\Var{n}) \\
 | |
| 282 |   \Var{P}\conj\Var{P}    &\bimp&  \Var{P} \\
 | |
| 714 | 283 |   \Var{A} \un \Var{B} &\equiv& \{x.x\in \Var{A} \disj x\in \Var{B}\}
 | 
| 323 | 284 | \end{eqnarray*}
 | 
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 285 | Conditional rewrites such as $\Var{m}<\Var{n} \Imp \Var{m}/\Var{n} =
 | 
| 4395 | 286 | 0$ are also permitted; the conditions can be arbitrary formulas. | 
| 104 | 287 | |
| 4395 | 288 | Internally, all rewrite rules are translated into meta-equalities, | 
| 289 | theorems with conclusion $lhs \equiv rhs$. Each simpset contains a | |
| 290 | function for extracting equalities from arbitrary theorems. For | |
| 11181 
d04f57b91166
renamed addaltern to addafter, addSaltern to addSafter
 oheimb parents: 
11162diff
changeset | 291 | example, $\neg(\Var{x}\in \{\})$ could be turned into $\Var{x}\in \{\}
 | 
| 4395 | 292 | \equiv False$. This function can be installed using | 
| 293 | \ttindex{setmksimps} but only the definer of a logic should need to do
 | |
| 11181 
d04f57b91166
renamed addaltern to addafter, addSaltern to addSafter
 oheimb parents: 
11162diff
changeset | 294 | this; see {\S}\ref{sec:setmksimps}.  The function processes theorems
 | 
| 4395 | 295 | added by \texttt{addsimps} as well as local assumptions.
 | 
| 104 | 296 | |
| 4395 | 297 | \begin{ttdescription}
 | 
| 298 | ||
| 299 | \item[$ss$ \ttindexbold{addsimps} $thms$] adds rewrite rules derived
 | |
| 300 | from $thms$ to the simpset $ss$. | |
| 301 | ||
| 302 | \item[$ss$ \ttindexbold{delsimps} $thms$] deletes rewrite rules
 | |
| 303 | derived from $thms$ from the simpset $ss$. | |
| 304 | ||
| 305 | \end{ttdescription}
 | |
| 104 | 306 | |
| 332 | 307 | \begin{warn}
 | 
| 4395 | 308 | The simplifier will accept all standard rewrite rules: those where | 
| 309 |   all unknowns are of base type.  Hence ${\Var{i}+(\Var{j}+\Var{k})} =
 | |
| 310 |   {(\Var{i}+\Var{j})+\Var{k}}$ is OK.
 | |
| 311 | ||
| 312 | It will also deal gracefully with all rules whose left-hand sides | |
| 313 |   are so-called {\em higher-order patterns}~\cite{nipkow-patterns}.
 | |
| 314 |   \indexbold{higher-order pattern}\indexbold{pattern, higher-order}
 | |
| 315 | These are terms in $\beta$-normal form (this will always be the case | |
| 316 | unless you have done something strange) where each occurrence of an | |
| 317 |   unknown is of the form $\Var{F}(x@1,\dots,x@n)$, where the $x@i$ are
 | |
| 318 |   distinct bound variables. Hence $(\forall x.\Var{P}(x) \land
 | |
| 319 |   \Var{Q}(x)) \bimp (\forall x.\Var{P}(x)) \land (\forall
 | |
| 320 |   x.\Var{Q}(x))$ is also OK, in both directions.
 | |
| 321 | ||
| 322 | In some rare cases the rewriter will even deal with quite general | |
| 323 |   rules: for example ${\Var{f}(\Var{x})\in range(\Var{f})} = True$
 | |
| 324 | rewrites $g(a) \in range(g)$ to $True$, but will fail to match | |
| 325 | $g(h(b)) \in range(\lambda x.g(h(x)))$. However, you can replace | |
| 326 |   the offending subterms (in our case $\Var{f}(\Var{x})$, which is not
 | |
| 327 |   a pattern) by adding new variables and conditions: $\Var{y} =
 | |
| 328 |   \Var{f}(\Var{x}) \Imp \Var{y}\in range(\Var{f}) = True$ is
 | |
| 329 | acceptable as a conditional rewrite rule since conditions can be | |
| 330 | arbitrary terms. | |
| 331 | ||
| 332 | There is basically no restriction on the form of the right-hand | |
| 333 | sides. They may not contain extraneous term or type variables, | |
| 334 | though. | |
| 104 | 335 | \end{warn}
 | 
| 332 | 336 | \index{rewrite rules|)}
 | 
| 337 | ||
| 4395 | 338 | |
| 339 | \subsection{*The subgoaler}\label{sec:simp-subgoaler}
 | |
| 340 | \begin{ttbox}
 | |
| 7990 | 341 | setsubgoaler : | 
| 342 |   simpset *  (simpset -> int -> tactic) -> simpset \hfill{\bf infix 4}
 | |
| 4395 | 343 | prems_of_ss : simpset -> thm list | 
| 344 | \end{ttbox}
 | |
| 345 | ||
| 104 | 346 | The subgoaler is the tactic used to solve subgoals arising out of | 
| 347 | conditional rewrite rules or congruence rules. The default should be | |
| 4395 | 348 | simplification itself. Occasionally this strategy needs to be | 
| 349 | changed. For example, if the premise of a conditional rule is an | |
| 350 | instance of its conclusion, as in $Suc(\Var{m}) < \Var{n} \Imp \Var{m}
 | |
| 351 | < \Var{n}$, the default strategy could loop.
 | |
| 104 | 352 | |
| 4395 | 353 | \begin{ttdescription}
 | 
| 354 | ||
| 355 | \item[$ss$ \ttindexbold{setsubgoaler} $tacf$] sets the subgoaler of
 | |
| 356 | $ss$ to $tacf$. The function $tacf$ will be applied to the current | |
| 357 | simplifier context expressed as a simpset. | |
| 358 | ||
| 359 | \item[\ttindexbold{prems_of_ss} $ss$] retrieves the current set of
 | |
| 360 | premises from simplifier context $ss$. This may be non-empty only | |
| 361 | if the simplifier has been told to utilize local assumptions in the | |
| 362 |   first place, e.g.\ if invoked via \texttt{asm_simp_tac}.
 | |
| 363 | ||
| 364 | \end{ttdescription}
 | |
| 365 | ||
| 366 | As an example, consider the following subgoaler: | |
| 104 | 367 | \begin{ttbox}
 | 
| 4395 | 368 | fun subgoaler ss = | 
| 369 | assume_tac ORELSE' | |
| 370 | resolve_tac (prems_of_ss ss) ORELSE' | |
| 371 | asm_simp_tac ss; | |
| 104 | 372 | \end{ttbox}
 | 
| 4395 | 373 | This tactic first tries to solve the subgoal by assumption or by | 
| 374 | resolving with with one of the premises, calling simplification only | |
| 375 | if that fails. | |
| 376 | ||
| 104 | 377 | |
| 698 
23734672dc12
updated discussion of congruence rules in first section
 lcp parents: 
332diff
changeset | 378 | \subsection{*The solver}\label{sec:simp-solver}
 | 
| 4395 | 379 | \begin{ttbox}
 | 
| 7620 | 380 | mk_solver : string -> (thm list -> int -> tactic) -> solver | 
| 381 | setSolver  : simpset * solver -> simpset \hfill{\bf infix 4}
 | |
| 382 | addSolver  : simpset * solver -> simpset \hfill{\bf infix 4}
 | |
| 383 | setSSolver : simpset * solver -> simpset \hfill{\bf infix 4}
 | |
| 384 | addSSolver : simpset * solver -> simpset \hfill{\bf infix 4}
 | |
| 4395 | 385 | \end{ttbox}
 | 
| 386 | ||
| 7620 | 387 | A solver is a tactic that attempts to solve a subgoal after | 
| 4395 | 388 | simplification. Typically it just proves trivial subgoals such as | 
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 389 | \texttt{True} and $t=t$.  It could use sophisticated means such as {\tt
 | 
| 4395 | 390 | blast_tac}, though that could make simplification expensive. | 
| 7620 | 391 | To keep things more abstract, solvers are packaged up in type | 
| 392 | \texttt{solver}. The only way to create a solver is via \texttt{mk_solver}.
 | |
| 286 | 393 | |
| 3108 | 394 | Rewriting does not instantiate unknowns. For example, rewriting | 
| 395 | cannot prove $a\in \Var{A}$ since this requires
 | |
| 396 | instantiating~$\Var{A}$.  The solver, however, is an arbitrary tactic
 | |
| 397 | and may instantiate unknowns as it pleases. This is the only way the | |
| 398 | simplifier can handle a conditional rewrite rule whose condition | |
| 3485 
f27a30a18a17
Now there are TWO spaces after each full stop, so that the Emacs sentence
 paulson parents: 
3134diff
changeset | 399 | contains extra variables. When a simplification tactic is to be | 
| 3108 | 400 | combined with other provers, especially with the classical reasoner, | 
| 4395 | 401 | it is important whether it can be considered safe or not. For this | 
| 7620 | 402 | reason a simpset contains two solvers, a safe and an unsafe one. | 
| 2628 
1fe7c9f599c2
description of del(eq)congs, safe and unsafe solver
 oheimb parents: 
2613diff
changeset | 403 | |
| 3108 | 404 | The standard simplification strategy solely uses the unsafe solver, | 
| 4395 | 405 | which is appropriate in most cases. For special applications where | 
| 3108 | 406 | the simplification process is not allowed to instantiate unknowns | 
| 4395 | 407 | within the goal, simplification starts with the safe solver, but may | 
| 408 | still apply the ordinary unsafe one in nested simplifications for | |
| 9398 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 409 | conditional rules or congruences. Note that in this way the overall | 
| 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 410 | tactic is not totally safe: it may instantiate unknowns that appear also | 
| 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 411 | in other subgoals. | 
| 4395 | 412 | |
| 413 | \begin{ttdescription}
 | |
| 7620 | 414 | \item[\ttindexbold{mk_solver} $s$ $tacf$] converts $tacf$ into a new solver;
 | 
| 415 | the string $s$ is only attached as a comment and has no other significance. | |
| 416 | ||
| 4395 | 417 | \item[$ss$ \ttindexbold{setSSolver} $tacf$] installs $tacf$ as the
 | 
| 418 |   \emph{safe} solver of $ss$.
 | |
| 419 | ||
| 420 | \item[$ss$ \ttindexbold{addSSolver} $tacf$] adds $tacf$ as an
 | |
| 421 |   additional \emph{safe} solver; it will be tried after the solvers
 | |
| 422 | which had already been present in $ss$. | |
| 423 | ||
| 424 | \item[$ss$ \ttindexbold{setSolver} $tacf$] installs $tacf$ as the
 | |
| 425 | unsafe solver of $ss$. | |
| 426 | ||
| 427 | \item[$ss$ \ttindexbold{addSolver} $tacf$] adds $tacf$ as an
 | |
| 428 | additional unsafe solver; it will be tried after the solvers which | |
| 429 | had already been present in $ss$. | |
| 323 | 430 | |
| 4395 | 431 | \end{ttdescription}
 | 
| 432 | ||
| 433 | \medskip | |
| 104 | 434 | |
| 4395 | 435 | \index{assumptions!in simplification} The solver tactic is invoked
 | 
| 436 | with a list of theorems, namely assumptions that hold in the local | |
| 437 | context. This may be non-empty only if the simplifier has been told | |
| 438 | to utilize local assumptions in the first place, e.g.\ if invoked via | |
| 439 | \texttt{asm_simp_tac}.  The solver is also presented the full goal
 | |
| 440 | including its assumptions in any case. Thus it can use these (e.g.\ | |
| 441 | by calling \texttt{assume_tac}), even if the list of premises is not
 | |
| 442 | passed. | |
| 443 | ||
| 444 | \medskip | |
| 445 | ||
| 11181 
d04f57b91166
renamed addaltern to addafter, addSaltern to addSafter
 oheimb parents: 
11162diff
changeset | 446 | As explained in {\S}\ref{sec:simp-subgoaler}, the subgoaler is also used
 | 
| 4395 | 447 | to solve the premises of congruence rules. These are usually of the | 
| 448 | form $s = \Var{x}$, where $s$ needs to be simplified and $\Var{x}$
 | |
| 449 | needs to be instantiated with the result. Typically, the subgoaler | |
| 450 | will invoke the simplifier at some point, which will eventually call | |
| 451 | the solver. For this reason, solver tactics must be prepared to solve | |
| 452 | goals of the form $t = \Var{x}$, usually by reflexivity.  In
 | |
| 453 | particular, reflexivity should be tried before any of the fancy | |
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 454 | tactics like \texttt{blast_tac}.
 | 
| 323 | 455 | |
| 3108 | 456 | It may even happen that due to simplification the subgoal is no longer | 
| 457 | an equality.  For example $False \bimp \Var{Q}$ could be rewritten to
 | |
| 11181 
d04f57b91166
renamed addaltern to addafter, addSaltern to addSafter
 oheimb parents: 
11162diff
changeset | 458 | $\neg\Var{Q}$.  To cover this case, the solver could try resolving
 | 
| 
d04f57b91166
renamed addaltern to addafter, addSaltern to addSafter
 oheimb parents: 
11162diff
changeset | 459 | with the theorem $\neg False$. | 
| 104 | 460 | |
| 4395 | 461 | \medskip | 
| 462 | ||
| 104 | 463 | \begin{warn}
 | 
| 13938 | 464 | If a premise of a congruence rule cannot be proved, then the | 
| 465 | congruence is ignored. This should only happen if the rule is | |
| 466 |   \emph{conditional} --- that is, contains premises not of the form $t
 | |
| 467 |   = \Var{x}$; otherwise it indicates that some congruence rule, or
 | |
| 468 | possibly the subgoaler or solver, is faulty. | |
| 104 | 469 | \end{warn}
 | 
| 470 | ||
| 323 | 471 | |
| 4395 | 472 | \subsection{*The looper}\label{sec:simp-looper}
 | 
| 473 | \begin{ttbox}
 | |
| 5549 | 474 | setloop   : simpset *           (int -> tactic)  -> simpset \hfill{\bf infix 4}
 | 
| 475 | addloop   : simpset * (string * (int -> tactic)) -> simpset \hfill{\bf infix 4}
 | |
| 476 | delloop   : simpset *  string                    -> simpset \hfill{\bf infix 4}
 | |
| 4395 | 477 | addsplits : simpset * thm list -> simpset \hfill{\bf infix 4}
 | 
| 5549 | 478 | delsplits : simpset * thm list -> simpset \hfill{\bf infix 4}
 | 
| 4395 | 479 | \end{ttbox}
 | 
| 480 | ||
| 5549 | 481 | The looper is a list of tactics that are applied after simplification, in case | 
| 4395 | 482 | the solver failed to solve the simplified goal. If the looper | 
| 483 | succeeds, the simplification process is started all over again. Each | |
| 484 | of the subgoals generated by the looper is attacked in turn, in | |
| 485 | reverse order. | |
| 486 | ||
| 9398 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 487 | A typical looper is \index{case splitting}: the expansion of a conditional.
 | 
| 4395 | 488 | Another possibility is to apply an elimination rule on the | 
| 489 | assumptions. More adventurous loopers could start an induction. | |
| 490 | ||
| 491 | \begin{ttdescription}
 | |
| 492 | ||
| 5549 | 493 | \item[$ss$ \ttindexbold{setloop} $tacf$] installs $tacf$ as the only looper
 | 
| 494 | tactic of $ss$. | |
| 4395 | 495 | |
| 5549 | 496 | \item[$ss$ \ttindexbold{addloop} $(name,tacf)$] adds $tacf$ as an additional
 | 
| 497 | looper tactic with name $name$; it will be tried after the looper tactics | |
| 498 | that had already been present in $ss$. | |
| 499 | ||
| 500 | \item[$ss$ \ttindexbold{delloop} $name$] deletes the looper tactic $name$
 | |
| 501 | from $ss$. | |
| 4395 | 502 | |
| 503 | \item[$ss$ \ttindexbold{addsplits} $thms$] adds
 | |
| 5549 | 504 | split tactics for $thms$ as additional looper tactics of $ss$. | 
| 505 | ||
| 506 | \item[$ss$ \ttindexbold{addsplits} $thms$] deletes the
 | |
| 507 | split tactics for $thms$ from the looper tactics of $ss$. | |
| 4395 | 508 | |
| 509 | \end{ttdescription}
 | |
| 510 | ||
| 5549 | 511 | The splitter replaces applications of a given function; the right-hand side | 
| 512 | of the replacement can be anything. For example, here is a splitting rule | |
| 513 | for conditional expressions: | |
| 514 | \[ \Var{P}(if(\Var{Q},\Var{x},\Var{y})) \bimp (\Var{Q} \imp \Var{P}(\Var{x}))
 | |
| 11181 
d04f57b91166
renamed addaltern to addafter, addSaltern to addSafter
 oheimb parents: 
11162diff
changeset | 515 | \conj (\neg\Var{Q} \imp \Var{P}(\Var{y})) 
 | 
| 5549 | 516 | \] | 
| 8136 | 517 | Another example is the elimination operator for Cartesian products (which | 
| 518 | happens to be called~$split$): | |
| 5549 | 519 | \[ \Var{P}(split(\Var{f},\Var{p})) \bimp (\forall a~b. \Var{p} =
 | 
| 520 | \langle a,b\rangle \imp \Var{P}(\Var{f}(a,b))) 
 | |
| 521 | \] | |
| 522 | ||
| 523 | For technical reasons, there is a distinction between case splitting in the | |
| 524 | conclusion and in the premises of a subgoal. The former is done by | |
| 9398 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 525 | \texttt{split_tac} with rules like \texttt{split_if} or \texttt{option.split}, 
 | 
| 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 526 | which do not split the subgoal, while the latter is done by | 
| 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 527 | \texttt{split_asm_tac} with rules like \texttt{split_if_asm} or 
 | 
| 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 528 | \texttt{option.split_asm}, which split the subgoal.
 | 
| 5549 | 529 | The operator \texttt{addsplits} automatically takes care of which tactic to
 | 
| 530 | call, analyzing the form of the rules given as argument. | |
| 531 | \begin{warn}
 | |
| 532 | Due to \texttt{split_asm_tac}, the simplifier may split subgoals!
 | |
| 533 | \end{warn}
 | |
| 534 | ||
| 535 | Case splits should be allowed only when necessary; they are expensive | |
| 536 | and hard to control.  Here is an example of use, where \texttt{split_if}
 | |
| 537 | is the first rule above: | |
| 538 | \begin{ttbox}
 | |
| 8136 | 539 | by (simp_tac (simpset() | 
| 540 |                  addloop ("split if", split_tac [split_if])) 1);
 | |
| 5549 | 541 | \end{ttbox}
 | 
| 5776 | 542 | Users would usually prefer the following shortcut using \texttt{addsplits}:
 | 
| 5549 | 543 | \begin{ttbox}
 | 
| 544 | by (simp_tac (simpset() addsplits [split_if]) 1); | |
| 545 | \end{ttbox}
 | |
| 8136 | 546 | Case-splitting on conditional expressions is usually beneficial, so it is | 
| 547 | enabled by default in the object-logics \texttt{HOL} and \texttt{FOL}.
 | |
| 104 | 548 | |
| 549 | ||
| 4395 | 550 | \section{The simplification tactics}\label{simp-tactics}
 | 
| 551 | \index{simplification!tactics}\index{tactics!simplification}
 | |
| 552 | \begin{ttbox}
 | |
| 9398 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 553 | generic_simp_tac : bool -> bool * bool * bool -> | 
| 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 554 | simpset -> int -> tactic | 
| 4395 | 555 | simp_tac : simpset -> int -> tactic | 
| 556 | asm_simp_tac : simpset -> int -> tactic | |
| 557 | full_simp_tac : simpset -> int -> tactic | |
| 558 | asm_full_simp_tac : simpset -> int -> tactic | |
| 559 | safe_asm_full_simp_tac : simpset -> int -> tactic | |
| 560 | \end{ttbox}
 | |
| 2567 | 561 | |
| 9398 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 562 | \texttt{generic_simp_tac} is the basic tactic that is underlying any actual
 | 
| 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 563 | simplification work. The others are just instantiations of it. The rewriting | 
| 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 564 | strategy is always strictly bottom up, except for congruence rules, | 
| 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 565 | which are applied while descending into a term. Conditions in conditional | 
| 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 566 | rewrite rules are solved recursively before the rewrite rule is applied. | 
| 104 | 567 | |
| 4395 | 568 | \begin{ttdescription}
 | 
| 569 | ||
| 9398 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 570 | \item[\ttindexbold{generic_simp_tac} $safe$ ($simp\_asm$, $use\_asm$, $mutual$)] 
 | 
| 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 571 | gives direct access to the various simplification modes: | 
| 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 572 |   \begin{itemize}
 | 
| 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 573 |   \item if $safe$ is {\tt true}, the safe solver is used as explained in
 | 
| 11181 
d04f57b91166
renamed addaltern to addafter, addSaltern to addSafter
 oheimb parents: 
11162diff
changeset | 574 |   {\S}\ref{sec:simp-solver},  
 | 
| 9398 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 575 | \item $simp\_asm$ determines whether the local assumptions are simplified, | 
| 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 576 | \item $use\_asm$ determines whether the assumptions are used as local rewrite | 
| 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 577 | rules, and | 
| 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 578 | \item $mutual$ determines whether assumptions can simplify each other rather | 
| 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 579 | than being processed from left to right. | 
| 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 580 |   \end{itemize}
 | 
| 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 581 | This generic interface is intended | 
| 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 582 | for building special tools, e.g.\ for combining the simplifier with the | 
| 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 583 | classical reasoner. It is rarely used directly. | 
| 
0ee9b2819155
removed safe_asm_full_simp_tac, added generic_simp_tac
 oheimb parents: 
8136diff
changeset | 584 | |
| 4395 | 585 | \item[\ttindexbold{simp_tac}, \ttindexbold{asm_simp_tac},
 | 
| 586 |   \ttindexbold{full_simp_tac}, \ttindexbold{asm_full_simp_tac}] are
 | |
| 587 | the basic simplification tactics that work exactly like their | |
| 11181 
d04f57b91166
renamed addaltern to addafter, addSaltern to addSafter
 oheimb parents: 
11162diff
changeset | 588 |   namesakes in {\S}\ref{sec:simp-for-dummies}, except that they are
 | 
| 4395 | 589 | explicitly supplied with a simpset. | 
| 590 | ||
| 591 | \end{ttdescription}
 | |
| 104 | 592 | |
| 4395 | 593 | \medskip | 
| 104 | 594 | |
| 4395 | 595 | Local modifications of simpsets within a proof are often much cleaner | 
| 596 | by using above tactics in conjunction with explicit simpsets, rather | |
| 597 | than their capitalized counterparts. For example | |
| 1213 | 598 | \begin{ttbox}
 | 
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 599 | Addsimps \(thms\); | 
| 2479 | 600 | by (Simp_tac \(i\)); | 
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 601 | Delsimps \(thms\); | 
| 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 602 | \end{ttbox}
 | 
| 4395 | 603 | can be expressed more appropriately as | 
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 604 | \begin{ttbox}
 | 
| 4395 | 605 | by (simp_tac (simpset() addsimps \(thms\)) \(i\)); | 
| 1213 | 606 | \end{ttbox}
 | 
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 607 | |
| 4395 | 608 | \medskip | 
| 609 | ||
| 610 | Also note that functions depending implicitly on the current theory | |
| 611 | context (like capital \texttt{Simp_tac} and the other commands of
 | |
| 11181 
d04f57b91166
renamed addaltern to addafter, addSaltern to addSafter
 oheimb parents: 
11162diff
changeset | 612 | {\S}\ref{sec:simp-for-dummies}) should be considered harmful outside of
 | 
| 4395 | 613 | actual proof scripts. In particular, ML programs like theory | 
| 614 | definition packages or special tactics should refer to simpsets only | |
| 615 | explicitly, via the above tactics used in conjunction with | |
| 616 | \texttt{simpset_of} or the \texttt{SIMPSET} tacticals.
 | |
| 617 | ||
| 1860 
71bfeecfa96c
Documented simplification tactics which make use of the implicit simpset.
 nipkow parents: 
1387diff
changeset | 618 | |
| 5370 | 619 | \section{Forward rules and conversions}
 | 
| 620 | \index{simplification!forward rules}\index{simplification!conversions}
 | |
| 621 | \begin{ttbox}\index{*simplify}\index{*asm_simplify}\index{*full_simplify}\index{*asm_full_simplify}\index{*Simplifier.rewrite}\index{*Simplifier.asm_rewrite}\index{*Simplifier.full_rewrite}\index{*Simplifier.asm_full_rewrite}
 | |
| 4395 | 622 | simplify : simpset -> thm -> thm | 
| 623 | asm_simplify : simpset -> thm -> thm | |
| 624 | full_simplify : simpset -> thm -> thm | |
| 5370 | 625 | asm_full_simplify : simpset -> thm -> thm\medskip | 
| 626 | Simplifier.rewrite : simpset -> cterm -> thm | |
| 627 | Simplifier.asm_rewrite : simpset -> cterm -> thm | |
| 628 | Simplifier.full_rewrite : simpset -> cterm -> thm | |
| 629 | Simplifier.asm_full_rewrite : simpset -> cterm -> thm | |
| 4395 | 630 | \end{ttbox}
 | 
| 631 | ||
| 5370 | 632 | The first four of these functions provide \emph{forward} rules for
 | 
| 633 | simplification. Their effect is analogous to the corresponding | |
| 11181 
d04f57b91166
renamed addaltern to addafter, addSaltern to addSafter
 oheimb parents: 
11162diff
changeset | 634 | tactics described in {\S}\ref{simp-tactics}, but affect the whole
 | 
| 5370 | 635 | theorem instead of just a certain subgoal. Also note that the | 
| 11181 
d04f57b91166
renamed addaltern to addafter, addSaltern to addSafter
 oheimb parents: 
11162diff
changeset | 636 | looper~/ solver process as described in {\S}\ref{sec:simp-looper} and
 | 
| 
d04f57b91166
renamed addaltern to addafter, addSaltern to addSafter
 oheimb parents: 
11162diff
changeset | 637 | {\S}\ref{sec:simp-solver} is omitted in forward simplification.
 | 
| 5370 | 638 | |
| 639 | The latter four are \emph{conversions}, establishing proven equations
 | |
| 640 | of the form $t \equiv u$ where the l.h.s.\ $t$ has been given as | |
| 641 | argument. | |
| 4395 | 642 | |
| 643 | \begin{warn}
 | |
| 5370 | 644 | Forward simplification rules and conversions should be used rarely | 
| 645 | in ordinary proof scripts. The main intention is to provide an | |
| 646 | internal interface to the simplifier for special utilities. | |
| 4395 | 647 | \end{warn}
 | 
| 648 | ||
| 649 | ||
| 332 | 650 | \section{Permutative rewrite rules}
 | 
| 323 | 651 | \index{rewrite rules!permutative|(}
 | 
| 652 | ||
| 653 | A rewrite rule is {\bf permutative} if the left-hand side and right-hand
 | |
| 654 | side are the same up to renaming of variables. The most common permutative | |
| 655 | rule is commutativity: $x+y = y+x$. Other examples include $(x-y)-z = | |
| 656 | (x-z)-y$ in arithmetic and $insert(x,insert(y,A)) = insert(y,insert(x,A))$ | |
| 657 | for sets. Such rules are common enough to merit special attention. | |
| 658 | ||
| 4395 | 659 | Because ordinary rewriting loops given such rules, the simplifier | 
| 660 | employs a special strategy, called {\bf ordered
 | |
| 661 |   rewriting}\index{rewriting!ordered}.  There is a standard
 | |
| 662 | lexicographic ordering on terms. This should be perfectly OK in most | |
| 663 | cases, but can be changed for special applications. | |
| 664 | ||
| 4947 | 665 | \begin{ttbox}
 | 
| 666 | settermless : simpset * (term * term -> bool) -> simpset \hfill{\bf infix 4}
 | |
| 667 | \end{ttbox}
 | |
| 4395 | 668 | \begin{ttdescription}
 | 
| 669 | ||
| 670 | \item[$ss$ \ttindexbold{settermless} $rel$] installs relation $rel$ as
 | |
| 671 | term order in simpset $ss$. | |
| 672 | ||
| 673 | \end{ttdescription}
 | |
| 674 | ||
| 675 | \medskip | |
| 323 | 676 | |
| 4395 | 677 | A permutative rewrite rule is applied only if it decreases the given | 
| 678 | term with respect to this ordering. For example, commutativity | |
| 679 | rewrites~$b+a$ to $a+b$, but then stops because $a+b$ is strictly less | |
| 680 | than $b+a$.  The Boyer-Moore theorem prover~\cite{bm88book} also
 | |
| 681 | employs ordered rewriting. | |
| 682 | ||
| 683 | Permutative rewrite rules are added to simpsets just like other | |
| 684 | rewrite rules; the simplifier recognizes their special status | |
| 685 | automatically. They are most effective in the case of | |
| 686 | associative-commutative operators. (Associativity by itself is not | |
| 687 | permutative.) When dealing with an AC-operator~$f$, keep the | |
| 688 | following points in mind: | |
| 323 | 689 | \begin{itemize}\index{associative-commutative operators}
 | 
| 4395 | 690 | |
| 691 | \item The associative law must always be oriented from left to right, | |
| 692 | namely $f(f(x,y),z) = f(x,f(y,z))$. The opposite orientation, if | |
| 693 | used with commutativity, leads to looping in conjunction with the | |
| 694 | standard term order. | |
| 323 | 695 | |
| 696 | \item To complete your set of rewrite rules, you must add not just | |
| 697 |   associativity~(A) and commutativity~(C) but also a derived rule, {\bf
 | |
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 698 | left-com\-mut\-ativ\-ity} (LC): $f(x,f(y,z)) = f(y,f(x,z))$. | 
| 323 | 699 | \end{itemize}
 | 
| 700 | Ordered rewriting with the combination of A, C, and~LC sorts a term | |
| 701 | lexicographically: | |
| 702 | \[\def\maps#1{\stackrel{#1}{\longmapsto}}
 | |
| 703 |  (b+c)+a \maps{A} b+(c+a) \maps{C} b+(a+c) \maps{LC} a+(b+c) \]
 | |
| 704 | Martin and Nipkow~\cite{martin-nipkow} discuss the theory and give many
 | |
| 705 | examples; other algebraic structures are amenable to ordered rewriting, | |
| 706 | such as boolean rings. | |
| 707 | ||
| 3108 | 708 | \subsection{Example: sums of natural numbers}
 | 
| 4395 | 709 | |
| 9695 | 710 | This example is again set in HOL (see \texttt{HOL/ex/NatSum}).  Theory
 | 
| 711 | \thydx{Arith} contains natural numbers arithmetic.  Its associated simpset
 | |
| 712 | contains many arithmetic laws including distributivity of~$\times$ over~$+$, | |
| 713 | while \texttt{add_ac} is a list consisting of the A, C and LC laws for~$+$ on
 | |
| 714 | type \texttt{nat}.  Let us prove the theorem
 | |
| 323 | 715 | \[ \sum@{i=1}^n i = n\times(n+1)/2. \]
 | 
| 716 | % | |
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 717 | A functional~\texttt{sum} represents the summation operator under the
 | 
| 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 718 | interpretation $\texttt{sum} \, f \, (n + 1) = \sum@{i=0}^n f\,i$.  We
 | 
| 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 719 | extend \texttt{Arith} as follows:
 | 
| 323 | 720 | \begin{ttbox}
 | 
| 721 | NatSum = Arith + | |
| 1387 | 722 | consts sum :: [nat=>nat, nat] => nat | 
| 9445 
6c93b1eb11f8
Corrected example which still used old primrec syntax.
 berghofe parents: 
9398diff
changeset | 723 | primrec | 
| 4245 | 724 | "sum f 0 = 0" | 
| 725 | "sum f (Suc n) = f(n) + sum f n" | |
| 323 | 726 | end | 
| 727 | \end{ttbox}
 | |
| 4245 | 728 | The \texttt{primrec} declaration automatically adds rewrite rules for
 | 
| 4557 | 729 | \texttt{sum} to the default simpset.  We now remove the
 | 
| 730 | \texttt{nat_cancel} simplification procedures (in order not to spoil
 | |
| 731 | the example) and insert the AC-rules for~$+$: | |
| 323 | 732 | \begin{ttbox}
 | 
| 4557 | 733 | Delsimprocs nat_cancel; | 
| 4245 | 734 | Addsimps add_ac; | 
| 323 | 735 | \end{ttbox}
 | 
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 736 | Our desired theorem now reads $\texttt{sum} \, (\lambda i.i) \, (n+1) =
 | 
| 323 | 737 | n\times(n+1)/2$. The Isabelle goal has both sides multiplied by~$2$: | 
| 738 | \begin{ttbox}
 | |
| 5205 | 739 | Goal "2 * sum (\%i.i) (Suc n) = n * Suc n"; | 
| 323 | 740 | {\out Level 0}
 | 
| 3108 | 741 | {\out 2 * sum (\%i. i) (Suc n) = n * Suc n}
 | 
| 742 | {\out  1. 2 * sum (\%i. i) (Suc n) = n * Suc n}
 | |
| 323 | 743 | \end{ttbox}
 | 
| 3108 | 744 | Induction should not be applied until the goal is in the simplest | 
| 745 | form: | |
| 323 | 746 | \begin{ttbox}
 | 
| 4245 | 747 | by (Simp_tac 1); | 
| 323 | 748 | {\out Level 1}
 | 
| 3108 | 749 | {\out 2 * sum (\%i. i) (Suc n) = n * Suc n}
 | 
| 750 | {\out  1. n + (sum (\%i. i) n + sum (\%i. i) n) = n * n}
 | |
| 323 | 751 | \end{ttbox}
 | 
| 3108 | 752 | Ordered rewriting has sorted the terms in the left-hand side. The | 
| 753 | subgoal is now ready for induction: | |
| 323 | 754 | \begin{ttbox}
 | 
| 4245 | 755 | by (induct_tac "n" 1); | 
| 323 | 756 | {\out Level 2}
 | 
| 3108 | 757 | {\out 2 * sum (\%i. i) (Suc n) = n * Suc n}
 | 
| 758 | {\out  1. 0 + (sum (\%i. i) 0 + sum (\%i. i) 0) = 0 * 0}
 | |
| 323 | 759 | \ttbreak | 
| 4245 | 760 | {\out  2. !!n. n + (sum (\%i. i) n + sum (\%i. i) n) = n * n}
 | 
| 8136 | 761 | {\out           ==> Suc n + (sum (\%i. i) (Suc n) + sum (\%i.\,i) (Suc n)) =}
 | 
| 4245 | 762 | {\out               Suc n * Suc n}
 | 
| 323 | 763 | \end{ttbox}
 | 
| 764 | Simplification proves both subgoals immediately:\index{*ALLGOALS}
 | |
| 765 | \begin{ttbox}
 | |
| 4245 | 766 | by (ALLGOALS Asm_simp_tac); | 
| 323 | 767 | {\out Level 3}
 | 
| 3108 | 768 | {\out 2 * sum (\%i. i) (Suc n) = n * Suc n}
 | 
| 323 | 769 | {\out No subgoals!}
 | 
| 770 | \end{ttbox}
 | |
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 771 | Simplification cannot prove the induction step if we omit \texttt{add_ac} from
 | 
| 4245 | 772 | the simpset. Observe that like terms have not been collected: | 
| 323 | 773 | \begin{ttbox}
 | 
| 4245 | 774 | {\out Level 3}
 | 
| 775 | {\out 2 * sum (\%i. i) (Suc n) = n * Suc n}
 | |
| 776 | {\out  1. !!n. n + sum (\%i. i) n + (n + sum (\%i. i) n) = n + n * n}
 | |
| 8136 | 777 | {\out           ==> n + (n + sum (\%i. i) n) + (n + (n + sum (\%i.\,i) n)) =}
 | 
| 4245 | 778 | {\out               n + (n + (n + n * n))}
 | 
| 323 | 779 | \end{ttbox}
 | 
| 780 | Ordered rewriting proves this by sorting the left-hand side. Proving | |
| 781 | arithmetic theorems without ordered rewriting requires explicit use of | |
| 782 | commutativity. This is tedious; try it and see! | |
| 783 | ||
| 784 | Ordered rewriting is equally successful in proving | |
| 785 | $\sum@{i=1}^n i^3 = n^2\times(n+1)^2/4$.
 | |
| 786 | ||
| 787 | ||
| 788 | \subsection{Re-orienting equalities}
 | |
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 789 | Ordered rewriting with the derived rule \texttt{symmetry} can reverse
 | 
| 4557 | 790 | equations: | 
| 323 | 791 | \begin{ttbox}
 | 
| 792 | val symmetry = prove_goal HOL.thy "(x=y) = (y=x)" | |
| 3128 
d01d4c0c4b44
New acknowledgements; fixed overfull lines and tables
 paulson parents: 
3112diff
changeset | 793 | (fn _ => [Blast_tac 1]); | 
| 323 | 794 | \end{ttbox}
 | 
| 795 | This is frequently useful. Assumptions of the form $s=t$, where $t$ occurs | |
| 796 | in the conclusion but not~$s$, can often be brought into the right form. | |
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 797 | For example, ordered rewriting with \texttt{symmetry} can prove the goal
 | 
| 323 | 798 | \[ f(a)=b \conj f(a)=c \imp b=c. \] | 
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 799 | Here \texttt{symmetry} reverses both $f(a)=b$ and $f(a)=c$
 | 
| 323 | 800 | because $f(a)$ is lexicographically greater than $b$ and~$c$. These | 
| 801 | re-oriented equations, as rewrite rules, replace $b$ and~$c$ in the | |
| 802 | conclusion by~$f(a)$. | |
| 803 | ||
| 11181 
d04f57b91166
renamed addaltern to addafter, addSaltern to addSafter
 oheimb parents: 
11162diff
changeset | 804 | Another example is the goal $\neg(t=u) \imp \neg(u=t)$. | 
| 323 | 805 | The differing orientations make this appear difficult to prove. Ordered | 
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 806 | rewriting with \texttt{symmetry} makes the equalities agree.  (Without
 | 
| 323 | 807 | knowing more about~$t$ and~$u$ we cannot say whether they both go to $t=u$ | 
| 808 | or~$u=t$.) Then the simplifier can prove the goal outright. | |
| 809 | ||
| 810 | \index{rewrite rules!permutative|)}
 | |
| 811 | ||
| 812 | ||
| 7990 | 813 | \section{*Setting up the Simplifier}\label{sec:setting-up-simp}
 | 
| 323 | 814 | \index{simplification!setting up}
 | 
| 286 | 815 | |
| 9712 | 816 | Setting up the simplifier for new logics is complicated in the general case. | 
| 817 | This section describes how the simplifier is installed for intuitionistic | |
| 818 | first-order logic; the code is largely taken from {\tt FOL/simpdata.ML} of the
 | |
| 819 | Isabelle sources. | |
| 286 | 820 | |
| 16019 | 821 | The case splitting tactic, which resides on a separate files, is not part of | 
| 822 | Pure Isabelle. It needs to be loaded explicitly by the object-logic as | |
| 823 | follows (below \texttt{\~\relax\~\relax} refers to \texttt{\$ISABELLE_HOME}):
 | |
| 286 | 824 | \begin{ttbox}
 | 
| 6569 | 825 | use "\~\relax\~\relax/src/Provers/splitter.ML"; | 
| 286 | 826 | \end{ttbox}
 | 
| 827 | ||
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 828 | Simplification requires converting object-equalities to meta-level rewrite | 
| 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 829 | rules. This demands rules stating that equal terms and equivalent formulae | 
| 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 830 | are also equal at the meta-level. The rule declaration part of the file | 
| 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 831 | \texttt{FOL/IFOL.thy} contains the two lines
 | 
| 323 | 832 | \begin{ttbox}\index{*eq_reflection theorem}\index{*iff_reflection theorem}
 | 
| 286 | 833 | eq_reflection "(x=y) ==> (x==y)" | 
| 834 | iff_reflection "(P<->Q) ==> (P==Q)" | |
| 835 | \end{ttbox}
 | |
| 323 | 836 | Of course, you should only assert such rules if they are true for your | 
| 286 | 837 | particular logic. In Constructive Type Theory, equality is a ternary | 
| 4395 | 838 | relation of the form $a=b\in A$; the type~$A$ determines the meaning | 
| 839 | of the equality essentially as a partial equivalence relation. The | |
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 840 | present simplifier cannot be used.  Rewriting in \texttt{CTT} uses
 | 
| 4395 | 841 | another simplifier, which resides in the file {\tt
 | 
| 842 | Provers/typedsimp.ML} and is not documented. Even this does not | |
| 843 | work for later variants of Constructive Type Theory that use | |
| 323 | 844 | intensional equality~\cite{nordstrom90}.
 | 
| 286 | 845 | |
| 846 | ||
| 847 | \subsection{A collection of standard rewrite rules}
 | |
| 4557 | 848 | |
| 849 | We first prove lots of standard rewrite rules about the logical | |
| 850 | connectives. These include cancellation and associative laws. We | |
| 851 | define a function that echoes the desired law and then supplies it the | |
| 9695 | 852 | prover for intuitionistic FOL: | 
| 286 | 853 | \begin{ttbox}
 | 
| 854 | fun int_prove_fun s = | |
| 855 | (writeln s; | |
| 856 | prove_goal IFOL.thy s | |
| 857 | (fn prems => [ (cut_facts_tac prems 1), | |
| 4395 | 858 | (IntPr.fast_tac 1) ])); | 
| 286 | 859 | \end{ttbox}
 | 
| 860 | The following rewrite rules about conjunction are a selection of those | |
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 861 | proved on \texttt{FOL/simpdata.ML}.  Later, these will be supplied to the
 | 
| 286 | 862 | standard simpset. | 
| 863 | \begin{ttbox}
 | |
| 4395 | 864 | val conj_simps = map int_prove_fun | 
| 286 | 865 | ["P & True <-> P", "True & P <-> P", | 
| 866 | "P & False <-> False", "False & P <-> False", | |
| 867 | "P & P <-> P", | |
| 868 | "P & ~P <-> False", "~P & P <-> False", | |
| 869 | "(P & Q) & R <-> P & (Q & R)"]; | |
| 870 | \end{ttbox}
 | |
| 871 | The file also proves some distributive laws. As they can cause exponential | |
| 872 | blowup, they will not be included in the standard simpset. Instead they | |
| 323 | 873 | are merely bound to an \ML{} identifier, for user reference.
 | 
| 286 | 874 | \begin{ttbox}
 | 
| 4395 | 875 | val distrib_simps = map int_prove_fun | 
| 286 | 876 | ["P & (Q | R) <-> P&Q | P&R", | 
| 877 | "(Q | R) & P <-> Q&P | R&P", | |
| 878 | "(P | Q --> R) <-> (P --> R) & (Q --> R)"]; | |
| 879 | \end{ttbox}
 | |
| 880 | ||
| 881 | ||
| 882 | \subsection{Functions for preprocessing the rewrite rules}
 | |
| 323 | 883 | \label{sec:setmksimps}
 | 
| 4395 | 884 | \begin{ttbox}\indexbold{*setmksimps}
 | 
| 885 | setmksimps : simpset * (thm -> thm list) -> simpset \hfill{\bf infix 4}
 | |
| 886 | \end{ttbox}
 | |
| 286 | 887 | The next step is to define the function for preprocessing rewrite rules. | 
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 888 | This will be installed by calling \texttt{setmksimps} below.  Preprocessing
 | 
| 286 | 889 | occurs whenever rewrite rules are added, whether by user command or | 
| 890 | automatically. Preprocessing involves extracting atomic rewrites at the | |
| 891 | object-level, then reflecting them to the meta-level. | |
| 892 | ||
| 12725 | 893 | To start, the function \texttt{gen_all} strips any meta-level
 | 
| 12717 | 894 | quantifiers from the front of the given theorem. | 
| 5549 | 895 | |
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 896 | The function \texttt{atomize} analyses a theorem in order to extract
 | 
| 286 | 897 | atomic rewrite rules. The head of all the patterns, matched by the | 
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 898 | wildcard~\texttt{_}, is the coercion function \texttt{Trueprop}.
 | 
| 286 | 899 | \begin{ttbox}
 | 
| 900 | fun atomize th = case concl_of th of | |
| 901 |     _ $ (Const("op &",_) $ _ $ _)   => atomize(th RS conjunct1) \at
 | |
| 902 | atomize(th RS conjunct2) | |
| 903 |   | _ $ (Const("op -->",_) $ _ $ _) => atomize(th RS mp)
 | |
| 904 |   | _ $ (Const("All",_) $ _)        => atomize(th RS spec)
 | |
| 905 |   | _ $ (Const("True",_))           => []
 | |
| 906 |   | _ $ (Const("False",_))          => []
 | |
| 907 | | _ => [th]; | |
| 908 | \end{ttbox}
 | |
| 909 | There are several cases, depending upon the form of the conclusion: | |
| 910 | \begin{itemize}
 | |
| 911 | \item Conjunction: extract rewrites from both conjuncts. | |
| 912 | \item Implication: convert $P\imp Q$ to the meta-implication $P\Imp Q$ and | |
| 913 | extract rewrites from~$Q$; these will be conditional rewrites with the | |
| 914 | condition~$P$. | |
| 915 | \item Universal quantification: remove the quantifier, replacing the bound | |
| 916 | variable by a schematic variable, and extract rewrites from the body. | |
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 917 | \item \texttt{True} and \texttt{False} contain no useful rewrites.
 | 
| 286 | 918 | \item Anything else: return the theorem in a singleton list. | 
| 919 | \end{itemize}
 | |
| 920 | The resulting theorems are not literally atomic --- they could be | |
| 5549 | 921 | disjunctive, for example --- but are broken down as much as possible. | 
| 922 | See the file \texttt{ZF/simpdata.ML} for a sophisticated translation of
 | |
| 923 | set-theoretic formulae into rewrite rules. | |
| 924 | ||
| 925 | For standard situations like the above, | |
| 926 | there is a generic auxiliary function \ttindexbold{mk_atomize} that takes a 
 | |
| 927 | list of pairs $(name, thms)$, where $name$ is an operator name and | |
| 928 | $thms$ is a list of theorems to resolve with in case the pattern matches, | |
| 929 | and returns a suitable \texttt{atomize} function.
 | |
| 930 | ||
| 104 | 931 | |
| 286 | 932 | The simplified rewrites must now be converted into meta-equalities. The | 
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 933 | rule \texttt{eq_reflection} converts equality rewrites, while {\tt
 | 
| 286 | 934 | iff_reflection} converts if-and-only-if rewrites. The latter possibility | 
| 11181 
d04f57b91166
renamed addaltern to addafter, addSaltern to addSafter
 oheimb parents: 
11162diff
changeset | 935 | can arise in two other ways: the negative theorem~$\neg P$ is converted to | 
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 936 | $P\equiv\texttt{False}$, and any other theorem~$P$ is converted to
 | 
| 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 937 | $P\equiv\texttt{True}$.  The rules \texttt{iff_reflection_F} and {\tt
 | 
| 286 | 938 | iff_reflection_T} accomplish this conversion. | 
| 939 | \begin{ttbox}
 | |
| 940 | val P_iff_F = int_prove_fun "~P ==> (P <-> False)"; | |
| 941 | val iff_reflection_F = P_iff_F RS iff_reflection; | |
| 942 | \ttbreak | |
| 943 | val P_iff_T = int_prove_fun "P ==> (P <-> True)"; | |
| 944 | val iff_reflection_T = P_iff_T RS iff_reflection; | |
| 945 | \end{ttbox}
 | |
| 5549 | 946 | The function \texttt{mk_eq} converts a theorem to a meta-equality
 | 
| 286 | 947 | using the case analysis described above. | 
| 948 | \begin{ttbox}
 | |
| 5549 | 949 | fun mk_eq th = case concl_of th of | 
| 286 | 950 |     _ $ (Const("op =",_)$_$_)   => th RS eq_reflection
 | 
| 951 |   | _ $ (Const("op <->",_)$_$_) => th RS iff_reflection
 | |
| 952 |   | _ $ (Const("Not",_)$_)      => th RS iff_reflection_F
 | |
| 953 | | _ => th RS iff_reflection_T; | |
| 954 | \end{ttbox}
 | |
| 11162 
9e2ec5f02217
debugging: replaced gen_all by forall_elim_vars_safe
 oheimb parents: 
9712diff
changeset | 955 | The | 
| 12725 | 956 | three functions \texttt{gen_all}, \texttt{atomize} and \texttt{mk_eq} 
 | 
| 5549 | 957 | will be composed together and supplied below to \texttt{setmksimps}.
 | 
| 286 | 958 | |
| 959 | ||
| 960 | \subsection{Making the initial simpset}
 | |
| 4395 | 961 | |
| 9712 | 962 | It is time to assemble these items.  The list \texttt{IFOL_simps} contains the
 | 
| 963 | default rewrite rules for intuitionistic first-order logic. The first of | |
| 964 | these is the reflexive law expressed as the equivalence | |
| 965 | $(a=a)\bimp\texttt{True}$; the rewrite rule $a=a$ is clearly useless.
 | |
| 4395 | 966 | \begin{ttbox}
 | 
| 967 | val IFOL_simps = | |
| 968 | [refl RS P_iff_T] \at conj_simps \at disj_simps \at not_simps \at | |
| 969 | imp_simps \at iff_simps \at quant_simps; | |
| 286 | 970 | \end{ttbox}
 | 
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 971 | The list \texttt{triv_rls} contains trivial theorems for the solver.  Any
 | 
| 286 | 972 | subgoal that is simplified to one of these will be removed. | 
| 973 | \begin{ttbox}
 | |
| 974 | val notFalseI = int_prove_fun "~False"; | |
| 975 | val triv_rls = [TrueI,refl,iff_refl,notFalseI]; | |
| 976 | \end{ttbox}
 | |
| 9712 | 977 | We also define the function \ttindex{mk_meta_cong} to convert the conclusion
 | 
| 978 | of congruence rules into meta-equalities. | |
| 979 | \begin{ttbox}
 | |
| 980 | fun mk_meta_cong rl = standard (mk_meta_eq (mk_meta_prems rl)); | |
| 981 | \end{ttbox}
 | |
| 323 | 982 | % | 
| 9695 | 983 | The basic simpset for intuitionistic FOL is \ttindexbold{FOL_basic_ss}.  It
 | 
| 11162 
9e2ec5f02217
debugging: replaced gen_all by forall_elim_vars_safe
 oheimb parents: 
9712diff
changeset | 984 | preprocess rewrites using | 
| 12725 | 985 | {\tt gen_all}, \texttt{atomize} and \texttt{mk_eq}.
 | 
| 9695 | 986 | It solves simplified subgoals using \texttt{triv_rls} and assumptions, and by
 | 
| 987 | detecting contradictions.  It uses \ttindex{asm_simp_tac} to tackle subgoals
 | |
| 988 | of conditional rewrites. | |
| 4395 | 989 | |
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 990 | Other simpsets built from \texttt{FOL_basic_ss} will inherit these items.
 | 
| 4395 | 991 | In particular, \ttindexbold{IFOL_ss}, which introduces {\tt
 | 
| 992 |   IFOL_simps} as rewrite rules.  \ttindexbold{FOL_ss} will later
 | |
| 11181 
d04f57b91166
renamed addaltern to addafter, addSaltern to addSafter
 oheimb parents: 
11162diff
changeset | 993 | extend \texttt{IFOL_ss} with classical rewrite rules such as $\neg\neg
 | 
| 4395 | 994 | P\bimp P$. | 
| 2628 
1fe7c9f599c2
description of del(eq)congs, safe and unsafe solver
 oheimb parents: 
2613diff
changeset | 995 | \index{*setmksimps}\index{*setSSolver}\index{*setSolver}\index{*setsubgoaler}
 | 
| 286 | 996 | \index{*addsimps}\index{*addcongs}
 | 
| 997 | \begin{ttbox}
 | |
| 4395 | 998 | fun unsafe_solver prems = FIRST'[resolve_tac (triv_rls {\at} prems),
 | 
| 2628 
1fe7c9f599c2
description of del(eq)congs, safe and unsafe solver
 oheimb parents: 
2613diff
changeset | 999 | atac, etac FalseE]; | 
| 4395 | 1000 | |
| 8136 | 1001 | fun safe_solver prems = FIRST'[match_tac (triv_rls {\at} prems),
 | 
| 1002 | eq_assume_tac, ematch_tac [FalseE]]; | |
| 4395 | 1003 | |
| 9712 | 1004 | val FOL_basic_ss = | 
| 8136 | 1005 | empty_ss setsubgoaler asm_simp_tac | 
| 1006 | addsimprocs [defALL_regroup, defEX_regroup] | |
| 1007 | setSSolver safe_solver | |
| 1008 | setSolver unsafe_solver | |
| 12725 | 1009 | setmksimps (map mk_eq o atomize o gen_all) | 
| 9712 | 1010 | setmkcong mk_meta_cong; | 
| 4395 | 1011 | |
| 8136 | 1012 | val IFOL_ss = | 
| 1013 |       FOL_basic_ss addsimps (IFOL_simps {\at} 
 | |
| 1014 |                              int_ex_simps {\at} int_all_simps)
 | |
| 1015 | addcongs [imp_cong]; | |
| 286 | 1016 | \end{ttbox}
 | 
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 1017 | This simpset takes \texttt{imp_cong} as a congruence rule in order to use
 | 
| 286 | 1018 | contextual information to simplify the conclusions of implications: | 
| 1019 | \[ \List{\Var{P}\bimp\Var{P'};\; \Var{P'} \Imp \Var{Q}\bimp\Var{Q'}} \Imp
 | |
| 1020 |    (\Var{P}\imp\Var{Q}) \bimp (\Var{P'}\imp\Var{Q'})
 | |
| 1021 | \] | |
| 4597 
a0bdee64194c
Fixed a lot of overfull and underfull lines (hboxes)
 paulson parents: 
4560diff
changeset | 1022 | By adding the congruence rule \texttt{conj_cong}, we could obtain a similar
 | 
| 286 | 1023 | effect for conjunctions. | 
| 1024 | ||
| 1025 | ||
| 104 | 1026 | \index{simplification|)}
 | 
| 5370 | 1027 | |
| 1028 | ||
| 1029 | %%% Local Variables: | |
| 1030 | %%% mode: latex | |
| 1031 | %%% TeX-master: "ref" | |
| 1032 | %%% End: |