doc-src/Ref/document/simplifier.tex
changeset 48939 83bd9eb1c70c
parent 45645 4014bc2a09ff
equal deleted inserted replaced
48938:d468d72a458f 48939:83bd9eb1c70c
       
     1 
       
     2 \chapter{Simplification}
       
     3 \label{chap:simplification}
       
     4 \index{simplification|(}
       
     5 
       
     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.
       
    11 
       
    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 
       
    16 
       
    17 \section{Simplification for dummies}
       
    18 \label{sec:simp-for-dummies}
       
    19 
       
    20 Basic use of the simplifier is particularly easy because each theory
       
    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.
       
    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}
       
    35 \begin{ttbox}
       
    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}
       
    41 debug_simp        : bool ref \hfill{\bf initially false}
       
    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$,
       
    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}.}
       
    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.
       
    69 \end{ttdescription}
       
    70 
       
    71 \medskip
       
    72 
       
    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:
       
    76 \begin{ttbox}
       
    77 context Arith.thy;
       
    78 Goal "0 + (x + 0) = x + 0 + 0";
       
    79 {\out  1. 0 + (x + 0) = x + 0 + 0}
       
    80 by (Simp_tac 1);
       
    81 {\out Level 1}
       
    82 {\out 0 + (x + 0) = x + 0 + 0}
       
    83 {\out No subgoals!}
       
    84 \end{ttbox}
       
    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} =
       
    88 \Var{n}$.
       
    89 
       
    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:
       
    93 \begin{ttbox}
       
    94 {\out  1. x = 0 ==> x + x = 0}
       
    95 by (Asm_simp_tac 1);
       
    96 \end{ttbox}
       
    97 
       
    98 \medskip \texttt{Asm_full_simp_tac} is the most powerful of this quartet
       
    99 of tactics but may also loop where some of the others terminate.  For
       
   100 example,
       
   101 \begin{ttbox}
       
   102 {\out  1. ALL x. f x = g (f (g x)) ==> f 0 = f 0 + 0}
       
   103 \end{ttbox}
       
   104 is solved by \texttt{Simp_tac}, but \texttt{Asm_simp_tac} and {\tt
       
   105   Asm_full_simp_tac} loop because the rewrite rule $f\,\Var{x} =
       
   106 g\,(f\,(g\,\Var{x}))$ extracted from the assumption does not
       
   107 terminate.  Isabelle notices certain simple forms of nontermination,
       
   108 but not this one. Because assumptions may simplify each other, there can be
       
   109 very subtle cases of nontermination. For example, invoking
       
   110 {\tt Asm_full_simp_tac} on
       
   111 \begin{ttbox}
       
   112 {\out  1. [| P (f x); y = x; f x = f y |] ==> Q}
       
   113 \end{ttbox}
       
   114 gives rise to the infinite reduction sequence
       
   115 \[
       
   116 P\,(f\,x) \stackrel{f\,x = f\,y}{\longmapsto} P\,(f\,y) \stackrel{y = x}{\longmapsto}
       
   117 P\,(f\,x) \stackrel{f\,x = f\,y}{\longmapsto} \cdots
       
   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.
       
   124 
       
   125 \medskip
       
   126 
       
   127 Using the simplifier effectively may take a bit of experimentation.
       
   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
       
   142 Addsplits   : thm list -> unit
       
   143 Delsplits   : thm list -> unit
       
   144 \end{ttbox}
       
   145 
       
   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
       
   154 {\S}\ref{sec:simp-congs}.
       
   155 
       
   156 \begin{ttdescription}
       
   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   
       
   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
       
   180   current simpset.
       
   181 
       
   182 \end{ttdescription}
       
   183 
       
   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!
       
   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 
       
   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.
       
   203 
       
   204 \begin{warn}
       
   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
       
   209   the unwanted rules.  After this union is formed, changes to 
       
   210   a parent simpset have no effect on the child simpset.
       
   211 \end{warn}
       
   212 
       
   213 
       
   214 \section{Simplification sets}\index{simplification sets} 
       
   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
       
   227 rep_ss   : simpset -> \{mss        : meta_simpset, 
       
   228                        subgoal_tac: simpset  -> int -> tactic,
       
   229                        loop_tacs  : (string * (int -> tactic))list,
       
   230                        finish_tac : solver list,
       
   231                 unsafe_finish_tac : solver list\}
       
   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 
       
   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 
       
   246 \end{ttdescription}
       
   247 
       
   248 
       
   249 \subsection{Building simpsets}
       
   250 \begin{ttbox}
       
   251 empty_ss : simpset
       
   252 merge_ss : simpset * simpset -> simpset
       
   253 \end{ttbox}
       
   254 \begin{ttdescription}
       
   255   
       
   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}.
       
   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
       
   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.}.
       
   268 
       
   269 \end{ttdescription}
       
   270 
       
   271 
       
   272 \subsection{Rewrite rules}
       
   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:
       
   280 \begin{eqnarray*}
       
   281   Suc(\Var{m}) + \Var{n} &=&      \Var{m} + Suc(\Var{n}) \\
       
   282   \Var{P}\conj\Var{P}    &\bimp&  \Var{P} \\
       
   283   \Var{A} \un \Var{B} &\equiv& \{x.x\in \Var{A} \disj x\in \Var{B}\}
       
   284 \end{eqnarray*}
       
   285 Conditional rewrites such as $\Var{m}<\Var{n} \Imp \Var{m}/\Var{n} =
       
   286 0$ are also permitted; the conditions can be arbitrary formulas.
       
   287 
       
   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
       
   291 example, $\neg(\Var{x}\in \{\})$ could be turned into $\Var{x}\in \{\}
       
   292 \equiv False$.  This function can be installed using
       
   293 \ttindex{setmksimps} but only the definer of a logic should need to do
       
   294 this; see {\S}\ref{sec:setmksimps}.  The function processes theorems
       
   295 added by \texttt{addsimps} as well as local assumptions.
       
   296 
       
   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}
       
   306 
       
   307 \begin{warn}
       
   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.
       
   335 \end{warn}
       
   336 \index{rewrite rules|)}
       
   337 
       
   338 
       
   339 \subsection{*The subgoaler}\label{sec:simp-subgoaler}
       
   340 \begin{ttbox}
       
   341 setsubgoaler :
       
   342   simpset *  (simpset -> int -> tactic) -> simpset \hfill{\bf infix 4}
       
   343 prems_of_ss  : simpset -> thm list
       
   344 \end{ttbox}
       
   345 
       
   346 The subgoaler is the tactic used to solve subgoals arising out of
       
   347 conditional rewrite rules or congruence rules.  The default should be
       
   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.
       
   352 
       
   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:
       
   367 \begin{ttbox}
       
   368 fun subgoaler ss =
       
   369     assume_tac ORELSE'
       
   370     resolve_tac (prems_of_ss ss) ORELSE'
       
   371     asm_simp_tac ss;
       
   372 \end{ttbox}
       
   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 
       
   377 
       
   378 \subsection{*The solver}\label{sec:simp-solver}
       
   379 \begin{ttbox}
       
   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}
       
   385 \end{ttbox}
       
   386 
       
   387 A solver is a tactic that attempts to solve a subgoal after
       
   388 simplification.  Typically it just proves trivial subgoals such as
       
   389 \texttt{True} and $t=t$.  It could use sophisticated means such as {\tt
       
   390   blast_tac}, though that could make simplification expensive.
       
   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}.
       
   393 
       
   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
       
   399 contains extra variables.  When a simplification tactic is to be
       
   400 combined with other provers, especially with the classical reasoner,
       
   401 it is important whether it can be considered safe or not.  For this
       
   402 reason a simpset contains two solvers, a safe and an unsafe one.
       
   403 
       
   404 The standard simplification strategy solely uses the unsafe solver,
       
   405 which is appropriate in most cases.  For special applications where
       
   406 the simplification process is not allowed to instantiate unknowns
       
   407 within the goal, simplification starts with the safe solver, but may
       
   408 still apply the ordinary unsafe one in nested simplifications for
       
   409 conditional rules or congruences. Note that in this way the overall
       
   410 tactic is not totally safe:  it may instantiate unknowns that appear also 
       
   411 in other subgoals.
       
   412 
       
   413 \begin{ttdescription}
       
   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 
       
   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$.
       
   430 
       
   431 \end{ttdescription}
       
   432 
       
   433 \medskip
       
   434 
       
   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 
       
   446 As explained in {\S}\ref{sec:simp-subgoaler}, the subgoaler is also used
       
   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
       
   454 tactics like \texttt{blast_tac}.
       
   455 
       
   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
       
   458 $\neg\Var{Q}$.  To cover this case, the solver could try resolving
       
   459 with the theorem $\neg False$.
       
   460 
       
   461 \medskip
       
   462 
       
   463 \begin{warn}
       
   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.
       
   469 \end{warn}
       
   470 
       
   471 
       
   472 \subsection{*The looper}\label{sec:simp-looper}
       
   473 \begin{ttbox}
       
   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}
       
   477 addsplits : simpset * thm list -> simpset \hfill{\bf infix 4}
       
   478 delsplits : simpset * thm list -> simpset \hfill{\bf infix 4}
       
   479 \end{ttbox}
       
   480 
       
   481 The looper is a list of tactics that are applied after simplification, in case
       
   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 
       
   487 A typical looper is \index{case splitting}: the expansion of a conditional.
       
   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   
       
   493 \item[$ss$ \ttindexbold{setloop} $tacf$] installs $tacf$ as the only looper
       
   494   tactic of $ss$.
       
   495   
       
   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$.
       
   502   
       
   503 \item[$ss$ \ttindexbold{addsplits} $thms$] adds
       
   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$.
       
   508 
       
   509 \end{ttdescription}
       
   510 
       
   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}))
       
   515 \conj (\neg\Var{Q} \imp \Var{P}(\Var{y})) 
       
   516 \] 
       
   517 Another example is the elimination operator for Cartesian products (which
       
   518 happens to be called~$split$):  
       
   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
       
   525 \texttt{split_tac} with rules like \texttt{split_if} or \texttt{option.split}, 
       
   526 which do not split the subgoal, while the latter is done by 
       
   527 \texttt{split_asm_tac} with rules like \texttt{split_if_asm} or 
       
   528 \texttt{option.split_asm}, which split the subgoal.
       
   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}
       
   539 by (simp_tac (simpset() 
       
   540                  addloop ("split if", split_tac [split_if])) 1);
       
   541 \end{ttbox}
       
   542 Users would usually prefer the following shortcut using \texttt{addsplits}:
       
   543 \begin{ttbox}
       
   544 by (simp_tac (simpset() addsplits [split_if]) 1);
       
   545 \end{ttbox}
       
   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}.
       
   548 
       
   549 
       
   550 \section{The simplification tactics}\label{simp-tactics}
       
   551 \index{simplification!tactics}\index{tactics!simplification}
       
   552 \begin{ttbox}
       
   553 generic_simp_tac       : bool -> bool * bool * bool -> 
       
   554                          simpset -> int -> tactic
       
   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}
       
   561 
       
   562 \texttt{generic_simp_tac} is the basic tactic that is underlying any actual
       
   563 simplification work. The others are just instantiations of it. The rewriting 
       
   564 strategy is always strictly bottom up, except for congruence rules, 
       
   565 which are applied while descending into a term.  Conditions in conditional 
       
   566 rewrite rules are solved recursively before the rewrite rule is applied.
       
   567 
       
   568 \begin{ttdescription}
       
   569   
       
   570 \item[\ttindexbold{generic_simp_tac} $safe$ ($simp\_asm$, $use\_asm$, $mutual$)] 
       
   571   gives direct access to the various simplification modes: 
       
   572   \begin{itemize}
       
   573   \item if $safe$ is {\tt true}, the safe solver is used as explained in
       
   574   {\S}\ref{sec:simp-solver},  
       
   575   \item $simp\_asm$ determines whether the local assumptions are simplified,
       
   576   \item $use\_asm$ determines whether the assumptions are used as local rewrite 
       
   577    rules, and
       
   578   \item $mutual$ determines whether assumptions can simplify each other rather
       
   579   than being processed from left to right. 
       
   580   \end{itemize}
       
   581   This generic interface is intended 
       
   582   for building special tools, e.g.\ for combining the simplifier with the 
       
   583   classical reasoner. It is rarely used directly.
       
   584   
       
   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
       
   588   namesakes in {\S}\ref{sec:simp-for-dummies}, except that they are
       
   589   explicitly supplied with a simpset.
       
   590   
       
   591 \end{ttdescription}
       
   592 
       
   593 \medskip
       
   594 
       
   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
       
   598 \begin{ttbox}
       
   599 Addsimps \(thms\);
       
   600 by (Simp_tac \(i\));
       
   601 Delsimps \(thms\);
       
   602 \end{ttbox}
       
   603 can be expressed more appropriately as
       
   604 \begin{ttbox}
       
   605 by (simp_tac (simpset() addsimps \(thms\)) \(i\));
       
   606 \end{ttbox}
       
   607 
       
   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
       
   612 {\S}\ref{sec:simp-for-dummies}) should be considered harmful outside of
       
   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 
       
   618 
       
   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}
       
   622 simplify          : simpset -> thm -> thm
       
   623 asm_simplify      : simpset -> thm -> thm
       
   624 full_simplify     : simpset -> thm -> thm
       
   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
       
   630 \end{ttbox}
       
   631 
       
   632 The first four of these functions provide \emph{forward} rules for
       
   633 simplification.  Their effect is analogous to the corresponding
       
   634 tactics described in {\S}\ref{simp-tactics}, but affect the whole
       
   635 theorem instead of just a certain subgoal.  Also note that the
       
   636 looper~/ solver process as described in {\S}\ref{sec:simp-looper} and
       
   637 {\S}\ref{sec:simp-solver} is omitted in forward simplification.
       
   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.
       
   642 
       
   643 \begin{warn}
       
   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.
       
   647 \end{warn}
       
   648 
       
   649 
       
   650 \section{Permutative rewrite rules}
       
   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 
       
   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 
       
   665 \begin{ttbox}
       
   666 settermless : simpset * (term * term -> bool) -> simpset \hfill{\bf infix 4}
       
   667 \end{ttbox}
       
   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
       
   676 
       
   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:
       
   689 \begin{itemize}\index{associative-commutative operators}
       
   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.
       
   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
       
   698     left-com\-mut\-ativ\-ity} (LC): $f(x,f(y,z)) = f(y,f(x,z))$.
       
   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 
       
   708 \subsection{Example: sums of natural numbers}
       
   709 
       
   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
       
   715 \[ \sum@{i=1}^n i = n\times(n+1)/2. \]
       
   716 %
       
   717 A functional~\texttt{sum} represents the summation operator under the
       
   718 interpretation $\texttt{sum} \, f \, (n + 1) = \sum@{i=0}^n f\,i$.  We
       
   719 extend \texttt{Arith} as follows:
       
   720 \begin{ttbox}
       
   721 NatSum = Arith +
       
   722 consts sum     :: [nat=>nat, nat] => nat
       
   723 primrec 
       
   724   "sum f 0 = 0"
       
   725   "sum f (Suc n) = f(n) + sum f n"
       
   726 end
       
   727 \end{ttbox}
       
   728 The \texttt{primrec} declaration automatically adds rewrite rules for
       
   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~$+$:
       
   732 \begin{ttbox}
       
   733 Delsimprocs nat_cancel;
       
   734 Addsimps add_ac;
       
   735 \end{ttbox}
       
   736 Our desired theorem now reads $\texttt{sum} \, (\lambda i.i) \, (n+1) =
       
   737 n\times(n+1)/2$.  The Isabelle goal has both sides multiplied by~$2$:
       
   738 \begin{ttbox}
       
   739 Goal "2 * sum (\%i.i) (Suc n) = n * Suc n";
       
   740 {\out Level 0}
       
   741 {\out 2 * sum (\%i. i) (Suc n) = n * Suc n}
       
   742 {\out  1. 2 * sum (\%i. i) (Suc n) = n * Suc n}
       
   743 \end{ttbox}
       
   744 Induction should not be applied until the goal is in the simplest
       
   745 form:
       
   746 \begin{ttbox}
       
   747 by (Simp_tac 1);
       
   748 {\out Level 1}
       
   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}
       
   751 \end{ttbox}
       
   752 Ordered rewriting has sorted the terms in the left-hand side.  The
       
   753 subgoal is now ready for induction:
       
   754 \begin{ttbox}
       
   755 by (induct_tac "n" 1);
       
   756 {\out Level 2}
       
   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}
       
   759 \ttbreak
       
   760 {\out  2. !!n. n + (sum (\%i. i) n + sum (\%i. i) n) = n * n}
       
   761 {\out           ==> Suc n + (sum (\%i. i) (Suc n) + sum (\%i.\,i) (Suc n)) =}
       
   762 {\out               Suc n * Suc n}
       
   763 \end{ttbox}
       
   764 Simplification proves both subgoals immediately:\index{*ALLGOALS}
       
   765 \begin{ttbox}
       
   766 by (ALLGOALS Asm_simp_tac);
       
   767 {\out Level 3}
       
   768 {\out 2 * sum (\%i. i) (Suc n) = n * Suc n}
       
   769 {\out No subgoals!}
       
   770 \end{ttbox}
       
   771 Simplification cannot prove the induction step if we omit \texttt{add_ac} from
       
   772 the simpset.  Observe that like terms have not been collected:
       
   773 \begin{ttbox}
       
   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}
       
   777 {\out           ==> n + (n + sum (\%i. i) n) + (n + (n + sum (\%i.\,i) n)) =}
       
   778 {\out               n + (n + (n + n * n))}
       
   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}
       
   789 Ordered rewriting with the derived rule \texttt{symmetry} can reverse
       
   790 equations:
       
   791 \begin{ttbox}
       
   792 val symmetry = prove_goal HOL.thy "(x=y) = (y=x)"
       
   793                  (fn _ => [Blast_tac 1]);
       
   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.
       
   797 For example, ordered rewriting with \texttt{symmetry} can prove the goal
       
   798 \[ f(a)=b \conj f(a)=c \imp b=c. \]
       
   799 Here \texttt{symmetry} reverses both $f(a)=b$ and $f(a)=c$
       
   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 
       
   804 Another example is the goal $\neg(t=u) \imp \neg(u=t)$.
       
   805 The differing orientations make this appear difficult to prove.  Ordered
       
   806 rewriting with \texttt{symmetry} makes the equalities agree.  (Without
       
   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 
       
   813 \section{*Setting up the Simplifier}\label{sec:setting-up-simp}
       
   814 \index{simplification!setting up}
       
   815 
       
   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.
       
   820 
       
   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}):
       
   824 \begin{ttbox}
       
   825 use "\~\relax\~\relax/src/Provers/splitter.ML";
       
   826 \end{ttbox}
       
   827 
       
   828 Simplification requires converting object-equalities to meta-level rewrite
       
   829 rules.  This demands rules stating that equal terms and equivalent formulae
       
   830 are also equal at the meta-level.  The rule declaration part of the file
       
   831 \texttt{FOL/IFOL.thy} contains the two lines
       
   832 \begin{ttbox}\index{*eq_reflection theorem}\index{*iff_reflection theorem}
       
   833 eq_reflection   "(x=y)   ==> (x==y)"
       
   834 iff_reflection  "(P<->Q) ==> (P==Q)"
       
   835 \end{ttbox}
       
   836 Of course, you should only assert such rules if they are true for your
       
   837 particular logic.  In Constructive Type Theory, equality is a ternary
       
   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
       
   840 present simplifier cannot be used.  Rewriting in \texttt{CTT} uses
       
   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
       
   844 intensional equality~\cite{nordstrom90}.
       
   845 
       
   846 
       
   847 \subsection{A collection of standard rewrite rules}
       
   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
       
   852 prover for intuitionistic FOL:
       
   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), 
       
   858                   (IntPr.fast_tac 1) ]));
       
   859 \end{ttbox}
       
   860 The following rewrite rules about conjunction are a selection of those
       
   861 proved on \texttt{FOL/simpdata.ML}.  Later, these will be supplied to the
       
   862 standard simpset.
       
   863 \begin{ttbox}
       
   864 val conj_simps = map int_prove_fun
       
   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
       
   873 are merely bound to an \ML{} identifier, for user reference.
       
   874 \begin{ttbox}
       
   875 val distrib_simps  = map int_prove_fun
       
   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}
       
   883 \label{sec:setmksimps}
       
   884 \begin{ttbox}\indexbold{*setmksimps}
       
   885 setmksimps : simpset * (thm -> thm list) -> simpset \hfill{\bf infix 4}
       
   886 \end{ttbox}
       
   887 The next step is to define the function for preprocessing rewrite rules.
       
   888 This will be installed by calling \texttt{setmksimps} below.  Preprocessing
       
   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 
       
   893 To start, the function \texttt{gen_all} strips any meta-level
       
   894 quantifiers from the front of the given theorem.
       
   895 
       
   896 The function \texttt{atomize} analyses a theorem in order to extract
       
   897 atomic rewrite rules.  The head of all the patterns, matched by the
       
   898 wildcard~\texttt{_}, is the coercion function \texttt{Trueprop}.
       
   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.
       
   917 \item \texttt{True} and \texttt{False} contain no useful rewrites.
       
   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
       
   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 
       
   931 
       
   932 The simplified rewrites must now be converted into meta-equalities.  The
       
   933 rule \texttt{eq_reflection} converts equality rewrites, while {\tt
       
   934   iff_reflection} converts if-and-only-if rewrites.  The latter possibility
       
   935 can arise in two other ways: the negative theorem~$\neg P$ is converted to
       
   936 $P\equiv\texttt{False}$, and any other theorem~$P$ is converted to
       
   937 $P\equiv\texttt{True}$.  The rules \texttt{iff_reflection_F} and {\tt
       
   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}
       
   946 The function \texttt{mk_eq} converts a theorem to a meta-equality
       
   947 using the case analysis described above.
       
   948 \begin{ttbox}
       
   949 fun mk_eq th = case concl_of th of
       
   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}
       
   955 The 
       
   956 three functions \texttt{gen_all}, \texttt{atomize} and \texttt{mk_eq} 
       
   957 will be composed together and supplied below to \texttt{setmksimps}.
       
   958 
       
   959 
       
   960 \subsection{Making the initial simpset}
       
   961 
       
   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.
       
   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;
       
   970 \end{ttbox}
       
   971 The list \texttt{triv_rls} contains trivial theorems for the solver.  Any
       
   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}
       
   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}
       
   982 %
       
   983 The basic simpset for intuitionistic FOL is \ttindexbold{FOL_basic_ss}.  It
       
   984 preprocess rewrites using 
       
   985 {\tt gen_all}, \texttt{atomize} and \texttt{mk_eq}.
       
   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.
       
   989 
       
   990 Other simpsets built from \texttt{FOL_basic_ss} will inherit these items.
       
   991 In particular, \ttindexbold{IFOL_ss}, which introduces {\tt
       
   992   IFOL_simps} as rewrite rules.  \ttindexbold{FOL_ss} will later
       
   993 extend \texttt{IFOL_ss} with classical rewrite rules such as $\neg\neg
       
   994 P\bimp P$.
       
   995 \index{*setmksimps}\index{*setSSolver}\index{*setSolver}\index{*setsubgoaler}
       
   996 \index{*addsimps}\index{*addcongs}
       
   997 \begin{ttbox}
       
   998 fun unsafe_solver prems = FIRST'[resolve_tac (triv_rls {\at} prems),
       
   999                                  atac, etac FalseE];
       
  1000 
       
  1001 fun safe_solver prems = FIRST'[match_tac (triv_rls {\at} prems),
       
  1002                                eq_assume_tac, ematch_tac [FalseE]];
       
  1003 
       
  1004 val FOL_basic_ss =
       
  1005       empty_ss setsubgoaler asm_simp_tac
       
  1006                addsimprocs [defALL_regroup, defEX_regroup]
       
  1007                setSSolver   safe_solver
       
  1008                setSolver  unsafe_solver
       
  1009                setmksimps (map mk_eq o atomize o gen_all)
       
  1010                setmkcong mk_meta_cong;
       
  1011 
       
  1012 val IFOL_ss = 
       
  1013       FOL_basic_ss addsimps (IFOL_simps {\at} 
       
  1014                              int_ex_simps {\at} int_all_simps)
       
  1015                    addcongs [imp_cong];
       
  1016 \end{ttbox}
       
  1017 This simpset takes \texttt{imp_cong} as a congruence rule in order to use
       
  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 \]
       
  1022 By adding the congruence rule \texttt{conj_cong}, we could obtain a similar
       
  1023 effect for conjunctions.
       
  1024 
       
  1025 
       
  1026 \index{simplification|)}
       
  1027 
       
  1028 
       
  1029 %%% Local Variables: 
       
  1030 %%% mode: latex
       
  1031 %%% TeX-master: "ref"
       
  1032 %%% End: