doc-src/Ref/simplifier.tex
author nipkow
Wed, 20 May 1998 15:20:28 +0200
changeset 4947 15fd948d6c69
parent 4889 72cbd13deb16
child 5205 602354039306
permissions -rw-r--r--
Small mods.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     1
%% $Id$
3950
e9d5bcae8351 \label{simp-chap} -> chap:simplification
nipkow
parents: 3485
diff changeset
     2
\chapter{Simplification}
e9d5bcae8351 \label{simp-chap} -> chap:simplification
nipkow
parents: 3485
diff changeset
     3
\label{chap:simplification}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     4
\index{simplification|(}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     5
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
     6
This chapter describes Isabelle's generic simplification package.  It
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
     7
performs conditional and unconditional rewriting and uses contextual
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
     8
information (`local assumptions').  It provides several general hooks,
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
     9
which can provide automatic case splits during rewriting, for example.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    10
The simplifier is already set up for many of Isabelle's logics: \FOL,
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    11
\ZF, \HOL, \HOLCF.
1860
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
    12
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    13
The first section is a quick introduction to the simplifier that
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    14
should be sufficient to get started.  The later sections explain more
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    15
advanced features.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    16
1860
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
    17
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
    18
\section{Simplification for dummies}
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
    19
\label{sec:simp-for-dummies}
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
    20
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    21
Basic use of the simplifier is particularly easy because each theory
4557
wenzelm
parents: 4395
diff changeset
    22
is equipped with sensible default information controlling the rewrite
wenzelm
parents: 4395
diff changeset
    23
process --- namely the implicit {\em current
wenzelm
parents: 4395
diff changeset
    24
  simpset}\index{simpset!current}.  A suite of simple commands is
wenzelm
parents: 4395
diff changeset
    25
provided that refer to the implicit simpset of the current theory
wenzelm
parents: 4395
diff changeset
    26
context.
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    27
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    28
\begin{warn}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    29
  Make sure that you are working within the correct theory context.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    30
  Executing proofs interactively, or loading them from ML files
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    31
  without associated theories may require setting the current theory
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    32
  manually via the \ttindex{context} command.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    33
\end{warn}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    34
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    35
\subsection{Simplification tactics} \label{sec:simp-for-dummies-tacs}
1860
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
    36
\begin{ttbox}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    37
Simp_tac          : int -> tactic
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    38
Asm_simp_tac      : int -> tactic
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    39
Full_simp_tac     : int -> tactic
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    40
Asm_full_simp_tac : int -> tactic
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    41
trace_simp        : bool ref \hfill{\bf initially false}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    42
\end{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    43
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    44
\begin{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    45
\item[\ttindexbold{Simp_tac} $i$] simplifies subgoal~$i$ using the
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    46
  current simpset.  It may solve the subgoal completely if it has
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    47
  become trivial, using the simpset's solver tactic.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    48
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    49
\item[\ttindexbold{Asm_simp_tac}]\index{assumptions!in simplification}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    50
  is like \verb$Simp_tac$, but extracts additional rewrite rules from
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    51
  the local assumptions.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    52
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    53
\item[\ttindexbold{Full_simp_tac}] is like \verb$Simp_tac$, but also
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    54
  simplifies the assumptions (without using the assumptions to
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    55
  simplify each other or the actual goal).
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    56
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    57
\item[\ttindexbold{Asm_full_simp_tac}] is like \verb$Asm_simp_tac$,
4889
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
    58
  but also simplifies the assumptions. In particular, assumptions can
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
    59
  simplify each other.
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
    60
\footnote{\texttt{Asm_full_simp_tac} used to process the assumptions from
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
    61
  left to right. For backwards compatibilty reasons only there is now
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
    62
  \texttt{Asm_lr_simp_tac} that behaves like the old \texttt{Asm_full_simp_tac}.}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    63
\item[set \ttindexbold{trace_simp};] makes the simplifier output
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    64
  internal operations.  This includes rewrite steps, but also
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    65
  bookkeeping like modifications of the simpset.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    66
\end{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    67
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    68
\medskip
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    69
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    70
As an example, consider the theory of arithmetic in \HOL.  The (rather
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    71
trivial) goal $0 + (x + 0) = x + 0 + 0$ can be solved by a single call
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    72
of \texttt{Simp_tac} as follows:
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    73
\begin{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    74
context Arith.thy;
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    75
goal Arith.thy "0 + (x + 0) = x + 0 + 0";
1860
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
    76
{\out  1. 0 + (x + 0) = x + 0 + 0}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    77
by (Simp_tac 1);
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    78
{\out Level 1}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    79
{\out 0 + (x + 0) = x + 0 + 0}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    80
{\out No subgoals!}
1860
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
    81
\end{ttbox}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    82
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    83
The simplifier uses the current simpset of \texttt{Arith.thy}, which
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    84
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: 1387
diff changeset
    85
\Var{n}$.
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
    86
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    87
\medskip In many cases, assumptions of a subgoal are also needed in
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    88
the simplification process.  For example, \texttt{x = 0 ==> x + x = 0}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    89
is solved by \texttt{Asm_simp_tac} as follows:
1860
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
    90
\begin{ttbox}
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
    91
{\out  1. x = 0 ==> x + x = 0}
2479
57109c1a653d Updated account of implicit simpsets and clasets
paulson
parents: 2020
diff changeset
    92
by (Asm_simp_tac 1);
1860
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
    93
\end{ttbox}
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
    94
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
    95
\medskip \texttt{Asm_full_simp_tac} is the most powerful of this quartet
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    96
of tactics but may also loop where some of the others terminate.  For
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    97
example,
1860
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
    98
\begin{ttbox}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
    99
{\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: 1387
diff changeset
   100
\end{ttbox}
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
   101
is solved by \texttt{Simp_tac}, but \texttt{Asm_simp_tac} and {\tt
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   102
  Asm_simp_tac} loop because the rewrite rule $f\,\Var{x} =
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   103
g\,(f\,(g\,\Var{x}))$ extracted from the assumption does not
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   104
terminate.  Isabelle notices certain simple forms of nontermination,
4889
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
   105
but not this one. Because assumptions may simplify each other, there can be
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
   106
very subtle cases of nontermination.
1860
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
   107
 
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
   108
\begin{warn}
4889
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
   109
  \verb$Asm_full_simp_tac$ may miss opportunities to simplify an assumption
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
   110
  $A@i$ using an assumption $A@j$ in case $A@j$ is to the right of $A@i$.
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
   111
  For example, given the subgoal
1860
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
   112
\begin{ttbox}
4889
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
   113
{\out [| \dots f a \dots; P a; ALL x. P x --> f x = g x |] ==> \dots}
1860
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
   114
\end{ttbox}
4889
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
   115
\verb$Asm_full_simp_tac$ will not simplify the \texttt{f a} on the left.
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
   116
This problem can be overcome by reordering assumptions (see
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
   117
\S\ref{sec:reordering-asms}). Future versions of \verb$Asm_full_simp_tac$
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
   118
will not suffer from this deficiency.
1860
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
   119
\end{warn}
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
   120
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   121
\medskip
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   122
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
   123
Using the simplifier effectively may take a bit of experimentation.
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   124
Set the \verb$trace_simp$\index{tracing!of simplification} flag to get
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   125
a better idea of what is going on.  The resulting output can be
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   126
enormous, especially since invocations of the simplifier are often
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   127
nested (e.g.\ when solving conditions of rewrite rules).
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   128
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   129
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   130
\subsection{Modifying the current simpset}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   131
\begin{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   132
Addsimps    : thm list -> unit
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   133
Delsimps    : thm list -> unit
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   134
Addsimprocs : simproc list -> unit
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   135
Delsimprocs : simproc list -> unit
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   136
Addcongs    : thm list -> unit
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   137
Delcongs    : thm list -> unit
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   138
\end{ttbox}
1860
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
   139
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   140
Depending on the theory context, the \texttt{Add} and \texttt{Del}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   141
functions manipulate basic components of the associated current
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   142
simpset.  Internally, all rewrite rules have to be expressed as
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   143
(conditional) meta-equalities.  This form is derived automatically
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   144
from object-level equations that are supplied by the user.  Another
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   145
source of rewrite rules are \emph{simplification procedures}, that is
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   146
\ML\ functions that produce suitable theorems on demand, depending on
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   147
the current redex.  Congruences are a more advanced feature; see
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   148
\S\ref{sec:simp-congs}.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   149
1860
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
   150
\begin{ttdescription}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   151
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   152
\item[\ttindexbold{Addsimps} $thms$;] adds rewrite rules derived from
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   153
  $thms$ to the current simpset.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   154
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   155
\item[\ttindexbold{Delsimps} $thms$;] deletes rewrite rules derived
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   156
  from $thms$ from the current simpset.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   157
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   158
\item[\ttindexbold{Addsimprocs} $procs$;] adds simplification
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   159
  procedures $procs$ to the current simpset.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   160
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   161
\item[\ttindexbold{Delsimprocs} $procs$;] deletes simplification
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   162
  procedures $procs$ from the current simpset.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   163
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   164
\item[\ttindexbold{Addcongs} $thms$;] adds congruence rules to the
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   165
  current simpset.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   166
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   167
\item[\ttindexbold{Delcongs} $thms$;] deletes congruence rules to the
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   168
  current simpset.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   169
1860
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
   170
\end{ttdescription}
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
   171
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   172
When a new theory is built, its implicit simpset is initialized by the
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   173
union of the respective simpsets of its parent theories.  In addition,
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   174
certain theory definition constructs (e.g.\ \ttindex{datatype} and
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   175
\ttindex{primrec} in \HOL) implicitly augment the current simpset.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   176
Ordinary definitions are not added automatically!
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   177
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   178
It is up the user to manipulate the current simpset further by
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   179
explicitly adding or deleting theorems and simplification procedures.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   180
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   181
\medskip
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   182
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   183
Good simpsets are hard to design.  As a rule of thump, generally
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   184
useful ``simplification rules'' like $\Var{n}+0 = \Var{n}$ should be
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   185
added to the current simpset right after they have been proved.  Those
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   186
of a more specific nature (e.g.\ the laws of de~Morgan, which alter
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   187
the structure of a formula) should only be added for specific proofs
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   188
and deleted again afterwards.  Conversely, it may also happen that a
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   189
generally useful rule needs to be removed for a certain proof and is
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   190
added again afterwards.  The need of frequent temporary additions or
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   191
deletions may indicate a badly designed simpset.
1860
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
   192
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
   193
\begin{warn}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   194
  The union of the parent simpsets (as described above) is not always
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   195
  a good starting point for the new theory.  If some ancestors have
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   196
  deleted simplification rules because they are no longer wanted,
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   197
  while others have left those rules in, then the union will contain
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   198
  the unwanted rules.
1860
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
   199
\end{warn}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   200
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   201
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   202
\section{Simplification sets}\index{simplification sets} 
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   203
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   204
The simplifier is controlled by information contained in {\bf
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   205
  simpsets}.  These consist of several components, including rewrite
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   206
rules, simplification procedures, congruence rules, and the subgoaler,
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   207
solver and looper tactics.  The simplifier should be set up with
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   208
sensible defaults so that most simplifier calls specify only rewrite
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   209
rules or simplification procedures.  Experienced users can exploit the
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   210
other components to streamline proofs in more sophisticated manners.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   211
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   212
\subsection{Inspecting simpsets}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   213
\begin{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   214
print_ss : simpset -> unit
4889
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
   215
rep_ss   : simpset -> \{mss        : meta_simpset, 
4664
05d33fc7aa08 added minimal description of rep_ss
oheimb
parents: 4597
diff changeset
   216
                       subgoal_tac: simpset  -> int -> tactic,
05d33fc7aa08 added minimal description of rep_ss
oheimb
parents: 4597
diff changeset
   217
                       loop_tac   :             int -> tactic,
05d33fc7aa08 added minimal description of rep_ss
oheimb
parents: 4597
diff changeset
   218
                       finish_tac : thm list -> int -> tactic,
4889
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
   219
                unsafe_finish_tac : thm list -> int -> tactic\}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   220
\end{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   221
\begin{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   222
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   223
\item[\ttindexbold{print_ss} $ss$;] displays the printable contents of
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   224
  simpset $ss$.  This includes the rewrite rules and congruences in
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   225
  their internal form expressed as meta-equalities.  The names of the
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   226
  simplification procedures and the patterns they are invoked on are
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   227
  also shown.  The other parts, functions and tactics, are
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   228
  non-printable.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   229
4664
05d33fc7aa08 added minimal description of rep_ss
oheimb
parents: 4597
diff changeset
   230
\item[\ttindexbold{rep_ss} $ss$;] decomposes $ss$ as a record of its internal 
05d33fc7aa08 added minimal description of rep_ss
oheimb
parents: 4597
diff changeset
   231
  components, namely the meta_simpset, the subgoaler, the loop, and the safe
05d33fc7aa08 added minimal description of rep_ss
oheimb
parents: 4597
diff changeset
   232
  and unsafe solvers.
05d33fc7aa08 added minimal description of rep_ss
oheimb
parents: 4597
diff changeset
   233
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   234
\end{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   235
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   236
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   237
\subsection{Building simpsets}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   238
\begin{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   239
empty_ss : simpset
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   240
merge_ss : simpset * simpset -> simpset
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   241
\end{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   242
\begin{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   243
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   244
\item[\ttindexbold{empty_ss}] is the empty simpset.  This is not very
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   245
  useful under normal circumstances because it doesn't contain
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   246
  suitable tactics (subgoaler etc.).  When setting up the simplifier
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   247
  for a particular object-logic, one will typically define a more
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   248
  appropriate ``almost empty'' simpset.  For example, in \HOL\ this is
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   249
  called \ttindexbold{HOL_basic_ss}.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   250
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   251
\item[\ttindexbold{merge_ss} ($ss@1$, $ss@2$)] merges simpsets $ss@1$
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   252
  and $ss@2$ by building the union of their respective rewrite rules,
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   253
  simplification procedures and congruences.  The other components
4557
wenzelm
parents: 4395
diff changeset
   254
  (tactics etc.) cannot be merged, though; they are taken from either
wenzelm
parents: 4395
diff changeset
   255
  simpset\footnote{Actually from $ss@1$, but it would unwise to count
wenzelm
parents: 4395
diff changeset
   256
    on that.}.
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   257
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   258
\end{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   259
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   260
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   261
\subsection{Accessing the current simpset}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   262
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   263
\begin{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   264
simpset        : unit -> simpset
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   265
simpset_ref    : unit -> simpset ref
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   266
simpset_of     : theory -> simpset
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   267
simpset_ref_of : theory -> simpset ref
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   268
print_simpset  : theory -> unit
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   269
\end{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   270
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   271
Each theory contains a current simpset\index{simpset!current} stored
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   272
within a private ML reference variable.  This can be retrieved and
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   273
modified as follows.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   274
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   275
\begin{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   276
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   277
\item[\ttindexbold{simpset}();] retrieves the simpset value from the
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   278
  current theory context.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   279
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   280
\item[\ttindexbold{simpset_ref}();] retrieves the simpset reference
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   281
  variable from the current theory context.  This can be assigned to
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   282
  by using \texttt{:=} in ML.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   283
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   284
\item[\ttindexbold{simpset_of} $thy$;] retrieves the simpset value
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   285
  from theory $thy$.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   286
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   287
\item[\ttindexbold{simpset_ref_of} $thy$;] retrieves the simpset
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   288
  reference variable from theory $thy$.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   289
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   290
\item[\ttindexbold{print_simpset} $thy$;] prints the current simpset
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   291
  of theory $thy$ in the same way as \texttt{print_ss}.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   292
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   293
\end{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   294
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   295
332
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
   296
\subsection{Rewrite rules}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   297
\begin{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   298
addsimps : simpset * thm list -> simpset \hfill{\bf infix 4}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   299
delsimps : simpset * thm list -> simpset \hfill{\bf infix 4}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   300
\end{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   301
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   302
\index{rewrite rules|(} Rewrite rules are theorems expressing some
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   303
form of equality, for example:
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   304
\begin{eqnarray*}
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   305
  Suc(\Var{m}) + \Var{n} &=&      \Var{m} + Suc(\Var{n}) \\
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   306
  \Var{P}\conj\Var{P}    &\bimp&  \Var{P} \\
714
015ec0a9563a Updated description of valid lhss.
nipkow
parents: 698
diff changeset
   307
  \Var{A} \un \Var{B} &\equiv& \{x.x\in \Var{A} \disj x\in \Var{B}\}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   308
\end{eqnarray*}
1860
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
   309
Conditional rewrites such as $\Var{m}<\Var{n} \Imp \Var{m}/\Var{n} =
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   310
0$ are also permitted; the conditions can be arbitrary formulas.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   311
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   312
Internally, all rewrite rules are translated into meta-equalities,
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   313
theorems with conclusion $lhs \equiv rhs$.  Each simpset contains a
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   314
function for extracting equalities from arbitrary theorems.  For
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   315
example, $\neg(\Var{x}\in \{\})$ could be turned into $\Var{x}\in \{\}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   316
\equiv False$.  This function can be installed using
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   317
\ttindex{setmksimps} but only the definer of a logic should need to do
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   318
this; see \S\ref{sec:setmksimps}.  The function processes theorems
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   319
added by \texttt{addsimps} as well as local assumptions.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   320
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   321
\begin{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   322
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   323
\item[$ss$ \ttindexbold{addsimps} $thms$] adds rewrite rules derived
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   324
  from $thms$ to the simpset $ss$.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   325
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   326
\item[$ss$ \ttindexbold{delsimps} $thms$] deletes rewrite rules
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   327
  derived from $thms$ from the simpset $ss$.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   328
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   329
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   330
332
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
   331
\begin{warn}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   332
  The simplifier will accept all standard rewrite rules: those where
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   333
  all unknowns are of base type.  Hence ${\Var{i}+(\Var{j}+\Var{k})} =
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   334
  {(\Var{i}+\Var{j})+\Var{k}}$ is OK.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   335
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   336
  It will also deal gracefully with all rules whose left-hand sides
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   337
  are so-called {\em higher-order patterns}~\cite{nipkow-patterns}.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   338
  \indexbold{higher-order pattern}\indexbold{pattern, higher-order}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   339
  These are terms in $\beta$-normal form (this will always be the case
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   340
  unless you have done something strange) where each occurrence of an
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   341
  unknown is of the form $\Var{F}(x@1,\dots,x@n)$, where the $x@i$ are
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   342
  distinct bound variables. Hence $(\forall x.\Var{P}(x) \land
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   343
  \Var{Q}(x)) \bimp (\forall x.\Var{P}(x)) \land (\forall
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   344
  x.\Var{Q}(x))$ is also OK, in both directions.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   345
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   346
  In some rare cases the rewriter will even deal with quite general
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   347
  rules: for example ${\Var{f}(\Var{x})\in range(\Var{f})} = True$
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   348
  rewrites $g(a) \in range(g)$ to $True$, but will fail to match
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   349
  $g(h(b)) \in range(\lambda x.g(h(x)))$.  However, you can replace
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   350
  the offending subterms (in our case $\Var{f}(\Var{x})$, which is not
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   351
  a pattern) by adding new variables and conditions: $\Var{y} =
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   352
  \Var{f}(\Var{x}) \Imp \Var{y}\in range(\Var{f}) = True$ is
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   353
  acceptable as a conditional rewrite rule since conditions can be
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   354
  arbitrary terms.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   355
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   356
  There is basically no restriction on the form of the right-hand
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   357
  sides.  They may not contain extraneous term or type variables,
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   358
  though.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   359
\end{warn}
332
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
   360
\index{rewrite rules|)}
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
   361
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   362
4947
15fd948d6c69 Small mods.
nipkow
parents: 4889
diff changeset
   363
\subsection{*Simplification procedures}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   364
\begin{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   365
addsimprocs : simpset * simproc list -> simpset
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   366
delsimprocs : simpset * simproc list -> simpset
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   367
\end{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   368
4557
wenzelm
parents: 4395
diff changeset
   369
Simplification procedures are {\ML} objects of abstract type
wenzelm
parents: 4395
diff changeset
   370
\texttt{simproc}.  Basically they are just functions that may produce
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   371
\emph{proven} rewrite rules on demand.  They are associated with
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   372
certain patterns that conceptually represent left-hand sides of
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   373
equations; these are shown by \texttt{print_ss}.  During its
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   374
operation, the simplifier may offer a simplification procedure the
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   375
current redex and ask for a suitable rewrite rule.  Thus rules may be
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   376
specifically fashioned for particular situations, resulting in a more
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   377
powerful mechanism than term rewriting by a fixed set of rules.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   378
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   379
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   380
\begin{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   381
  
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
   382
\item[$ss$ \ttindexbold{addsimprocs} $procs$] adds the simplification
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   383
  procedures $procs$ to the current simpset.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   384
  
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
   385
\item[$ss$ \ttindexbold{delsimprocs} $procs$] deletes the simplification
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   386
  procedures $procs$ from the current simpset.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   387
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   388
\end{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   389
4557
wenzelm
parents: 4395
diff changeset
   390
For example, simplification procedures \ttindexbold{nat_cancel} of
wenzelm
parents: 4395
diff changeset
   391
\texttt{HOL/Arith} cancel common summands and constant factors out of
wenzelm
parents: 4395
diff changeset
   392
several relations of sums over natural numbers.
wenzelm
parents: 4395
diff changeset
   393
wenzelm
parents: 4395
diff changeset
   394
Consider the following goal, which after cancelling $a$ on both sides
wenzelm
parents: 4395
diff changeset
   395
contains a factor of $2$.  Simplifying with the simpset of
wenzelm
parents: 4395
diff changeset
   396
\texttt{Arith.thy} will do the cancellation automatically:
wenzelm
parents: 4395
diff changeset
   397
\begin{ttbox}
wenzelm
parents: 4395
diff changeset
   398
{\out 1. x + a + x < y + y + 2 + a + a + a + a + a}
wenzelm
parents: 4395
diff changeset
   399
by (Simp_tac 1);
wenzelm
parents: 4395
diff changeset
   400
{\out 1. x < Suc (a + (a + y))}
wenzelm
parents: 4395
diff changeset
   401
\end{ttbox}
wenzelm
parents: 4395
diff changeset
   402
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   403
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   404
\subsection{*Congruence rules}\index{congruence rules}\label{sec:simp-congs}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   405
\begin{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   406
addcongs   : simpset * thm list -> simpset \hfill{\bf infix 4}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   407
delcongs   : simpset * thm list -> simpset \hfill{\bf infix 4}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   408
addeqcongs : simpset * thm list -> simpset \hfill{\bf infix 4}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   409
deleqcongs : simpset * thm list -> simpset \hfill{\bf infix 4}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   410
\end{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   411
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   412
Congruence rules are meta-equalities of the form
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
   413
\[ \dots \Imp
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   414
   f(\Var{x@1},\ldots,\Var{x@n}) \equiv f(\Var{y@1},\ldots,\Var{y@n}).
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   415
\]
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   416
This governs the simplification of the arguments of~$f$.  For
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   417
example, some arguments can be simplified under additional assumptions:
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   418
\[ \List{\Var{P@1} \bimp \Var{Q@1};\; \Var{Q@1} \Imp \Var{P@2} \bimp \Var{Q@2}}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   419
   \Imp (\Var{P@1} \imp \Var{P@2}) \equiv (\Var{Q@1} \imp \Var{Q@2})
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   420
\]
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   421
Given this rule, the simplifier assumes $Q@1$ and extracts rewrite
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   422
rules from it when simplifying~$P@2$.  Such local assumptions are
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   423
effective for rewriting formulae such as $x=0\imp y+x=y$.  The local
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   424
assumptions are also provided as theorems to the solver; see
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   425
\S~\ref{sec:simp-solver} below.
698
23734672dc12 updated discussion of congruence rules in first section
lcp
parents: 332
diff changeset
   426
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   427
\begin{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   428
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   429
\item[$ss$ \ttindexbold{addcongs} $thms$] adds congruence rules to the
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   430
  simpset $ss$.  These are derived from $thms$ in an appropriate way,
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   431
  depending on the underlying object-logic.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   432
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   433
\item[$ss$ \ttindexbold{delcongs} $thms$] deletes congruence rules
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   434
  derived from $thms$.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   435
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   436
\item[$ss$ \ttindexbold{addeqcongs} $thms$] adds congruence rules in
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   437
  their internal form (conclusions using meta-equality) to simpset
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   438
  $ss$.  This is the basic mechanism that \texttt{addcongs} is built
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   439
  on.  It should be rarely used directly.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   440
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   441
\item[$ss$ \ttindexbold{deleqcongs} $thms$] deletes congruence rules
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   442
  in internal form from simpset $ss$.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   443
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   444
\end{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   445
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   446
\medskip
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   447
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   448
Here are some more examples.  The congruence rule for bounded
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   449
quantifiers also supplies contextual information, this time about the
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   450
bound variable:
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   451
\begin{eqnarray*}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   452
  &&\List{\Var{A}=\Var{B};\; 
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   453
          \Forall x. x\in \Var{B} \Imp \Var{P}(x) = \Var{Q}(x)} \Imp{} \\
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   454
 &&\qquad\qquad
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   455
    (\forall x\in \Var{A}.\Var{P}(x)) = (\forall x\in \Var{B}.\Var{Q}(x))
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   456
\end{eqnarray*}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   457
The congruence rule for conditional expressions can supply contextual
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   458
information for simplifying the arms:
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   459
\[ \List{\Var{p}=\Var{q};~ \Var{q} \Imp \Var{a}=\Var{c};~
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   460
         \neg\Var{q} \Imp \Var{b}=\Var{d}} \Imp
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   461
   if(\Var{p},\Var{a},\Var{b}) \equiv if(\Var{q},\Var{c},\Var{d})
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   462
\]
698
23734672dc12 updated discussion of congruence rules in first section
lcp
parents: 332
diff changeset
   463
A congruence rule can also {\em prevent\/} simplification of some arguments.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   464
Here is an alternative congruence rule for conditional expressions:
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   465
\[ \Var{p}=\Var{q} \Imp
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   466
   if(\Var{p},\Var{a},\Var{b}) \equiv if(\Var{q},\Var{a},\Var{b})
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   467
\]
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   468
Only the first argument is simplified; the others remain unchanged.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   469
This can make simplification much faster, but may require an extra case split
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   470
to prove the goal.  
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   471
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   472
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   473
\subsection{*The subgoaler}\label{sec:simp-subgoaler}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   474
\begin{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   475
setsubgoaler : simpset *  (simpset -> int -> tactic) -> simpset \hfill{\bf infix 4}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   476
prems_of_ss  : simpset -> thm list
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   477
\end{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   478
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   479
The subgoaler is the tactic used to solve subgoals arising out of
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   480
conditional rewrite rules or congruence rules.  The default should be
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   481
simplification itself.  Occasionally this strategy needs to be
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   482
changed.  For example, if the premise of a conditional rule is an
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   483
instance of its conclusion, as in $Suc(\Var{m}) < \Var{n} \Imp \Var{m}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   484
< \Var{n}$, the default strategy could loop.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   485
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   486
\begin{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   487
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   488
\item[$ss$ \ttindexbold{setsubgoaler} $tacf$] sets the subgoaler of
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   489
  $ss$ to $tacf$.  The function $tacf$ will be applied to the current
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   490
  simplifier context expressed as a simpset.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   491
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   492
\item[\ttindexbold{prems_of_ss} $ss$] retrieves the current set of
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   493
  premises from simplifier context $ss$.  This may be non-empty only
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   494
  if the simplifier has been told to utilize local assumptions in the
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   495
  first place, e.g.\ if invoked via \texttt{asm_simp_tac}.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   496
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   497
\end{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   498
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   499
As an example, consider the following subgoaler:
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   500
\begin{ttbox}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   501
fun subgoaler ss =
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   502
    assume_tac ORELSE'
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   503
    resolve_tac (prems_of_ss ss) ORELSE'
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   504
    asm_simp_tac ss;
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   505
\end{ttbox}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   506
This tactic first tries to solve the subgoal by assumption or by
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   507
resolving with with one of the premises, calling simplification only
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   508
if that fails.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   509
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   510
698
23734672dc12 updated discussion of congruence rules in first section
lcp
parents: 332
diff changeset
   511
\subsection{*The solver}\label{sec:simp-solver}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   512
\begin{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   513
setSolver  : simpset * (thm list -> int -> tactic) -> simpset \hfill{\bf infix 4}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   514
addSolver  : simpset * (thm list -> int -> tactic) -> simpset \hfill{\bf infix 4}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   515
setSSolver : simpset * (thm list -> int -> tactic) -> simpset \hfill{\bf infix 4}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   516
addSSolver : simpset * (thm list -> int -> tactic) -> simpset \hfill{\bf infix 4}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   517
\end{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   518
2628
1fe7c9f599c2 description of del(eq)congs, safe and unsafe solver
oheimb
parents: 2613
diff changeset
   519
The solver is a pair of tactics that attempt to solve a subgoal after
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   520
simplification.  Typically it just proves trivial subgoals such as
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
   521
\texttt{True} and $t=t$.  It could use sophisticated means such as {\tt
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   522
  blast_tac}, though that could make simplification expensive.
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   523
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
   524
Rewriting does not instantiate unknowns.  For example, rewriting
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
   525
cannot prove $a\in \Var{A}$ since this requires
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
   526
instantiating~$\Var{A}$.  The solver, however, is an arbitrary tactic
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
   527
and may instantiate unknowns as it pleases.  This is the only way the
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
   528
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: 3134
diff changeset
   529
contains extra variables.  When a simplification tactic is to be
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
   530
combined with other provers, especially with the classical reasoner,
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   531
it is important whether it can be considered safe or not.  For this
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   532
reason the solver is split into a safe and an unsafe part.
2628
1fe7c9f599c2 description of del(eq)congs, safe and unsafe solver
oheimb
parents: 2613
diff changeset
   533
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
   534
The standard simplification strategy solely uses the unsafe solver,
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   535
which is appropriate in most cases.  For special applications where
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
   536
the simplification process is not allowed to instantiate unknowns
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   537
within the goal, simplification starts with the safe solver, but may
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   538
still apply the ordinary unsafe one in nested simplifications for
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   539
conditional rules or congruences.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   540
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   541
\begin{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   542
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   543
\item[$ss$ \ttindexbold{setSSolver} $tacf$] installs $tacf$ as the
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   544
  \emph{safe} solver of $ss$.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   545
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   546
\item[$ss$ \ttindexbold{addSSolver} $tacf$] adds $tacf$ as an
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   547
  additional \emph{safe} solver; it will be tried after the solvers
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   548
  which had already been present in $ss$.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   549
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   550
\item[$ss$ \ttindexbold{setSolver} $tacf$] installs $tacf$ as the
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   551
  unsafe solver of $ss$.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   552
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   553
\item[$ss$ \ttindexbold{addSolver} $tacf$] adds $tacf$ as an
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   554
  additional unsafe solver; it will be tried after the solvers which
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   555
  had already been present in $ss$.
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   556
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   557
\end{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   558
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   559
\medskip
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   560
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   561
\index{assumptions!in simplification} The solver tactic is invoked
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   562
with a list of theorems, namely assumptions that hold in the local
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   563
context.  This may be non-empty only if the simplifier has been told
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   564
to utilize local assumptions in the first place, e.g.\ if invoked via
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   565
\texttt{asm_simp_tac}.  The solver is also presented the full goal
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   566
including its assumptions in any case.  Thus it can use these (e.g.\ 
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   567
by calling \texttt{assume_tac}), even if the list of premises is not
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   568
passed.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   569
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   570
\medskip
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   571
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   572
As explained in \S\ref{sec:simp-subgoaler}, the subgoaler is also used
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   573
to solve the premises of congruence rules.  These are usually of the
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   574
form $s = \Var{x}$, where $s$ needs to be simplified and $\Var{x}$
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   575
needs to be instantiated with the result.  Typically, the subgoaler
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   576
will invoke the simplifier at some point, which will eventually call
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   577
the solver.  For this reason, solver tactics must be prepared to solve
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   578
goals of the form $t = \Var{x}$, usually by reflexivity.  In
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   579
particular, reflexivity should be tried before any of the fancy
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
   580
tactics like \texttt{blast_tac}.
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   581
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
   582
It may even happen that due to simplification the subgoal is no longer
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
   583
an equality.  For example $False \bimp \Var{Q}$ could be rewritten to
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
   584
$\neg\Var{Q}$.  To cover this case, the solver could try resolving
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
   585
with the theorem $\neg False$.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   586
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   587
\medskip
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   588
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   589
\begin{warn}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   590
  If the simplifier aborts with the message \texttt{Failed congruence
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
   591
    proof!}, then the subgoaler or solver has failed to prove a
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
   592
  premise of a congruence rule.  This should never occur under normal
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
   593
  circumstances; it indicates that some congruence rule, or possibly
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
   594
  the subgoaler or solver, is faulty.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   595
\end{warn}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   596
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   597
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   598
\subsection{*The looper}\label{sec:simp-looper}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   599
\begin{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   600
setloop   : simpset * (int -> tactic) -> simpset \hfill{\bf infix 4}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   601
addloop   : simpset * (int -> tactic) -> simpset \hfill{\bf infix 4}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   602
addsplits : simpset * thm list -> simpset \hfill{\bf infix 4}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   603
\end{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   604
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   605
The looper is a tactic that is applied after simplification, in case
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   606
the solver failed to solve the simplified goal.  If the looper
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   607
succeeds, the simplification process is started all over again.  Each
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   608
of the subgoals generated by the looper is attacked in turn, in
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   609
reverse order.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   610
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   611
A typical looper is case splitting: the expansion of a conditional.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   612
Another possibility is to apply an elimination rule on the
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   613
assumptions.  More adventurous loopers could start an induction.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   614
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   615
\begin{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   616
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   617
\item[$ss$ \ttindexbold{setloop} $tacf$] installs $tacf$ as the looper
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   618
  of $ss$.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   619
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   620
\item[$ss$ \ttindexbold{addloop} $tacf$] adds $tacf$ as an additional
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   621
  looper; it will be tried after the loopers which had already been
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   622
  present in $ss$.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   623
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   624
\item[$ss$ \ttindexbold{addsplits} $thms$] adds
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   625
  \texttt{(split_tac~$thms$)} as an additional looper.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   626
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   627
\end{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   628
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   629
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   630
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   631
\section{The simplification tactics}\label{simp-tactics}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   632
\index{simplification!tactics}\index{tactics!simplification}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   633
\begin{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   634
simp_tac               : simpset -> int -> tactic
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   635
asm_simp_tac           : simpset -> int -> tactic
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   636
full_simp_tac          : simpset -> int -> tactic
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   637
asm_full_simp_tac      : simpset -> int -> tactic
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   638
safe_asm_full_simp_tac : simpset -> int -> tactic
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   639
SIMPSET                : (simpset -> tactic) -> tactic
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   640
SIMPSET'               : (simpset -> 'a -> tactic) -> 'a -> tactic
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   641
\end{ttbox}
2567
7a28e02e10b7 added addloop (and also documentation of addsolver
oheimb
parents: 2479
diff changeset
   642
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   643
These are the basic tactics that are underlying any actual
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   644
simplification work.  The rewriting strategy is always strictly bottom
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   645
up, except for congruence rules, which are applied while descending
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   646
into a term.  Conditions in conditional rewrite rules are solved
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   647
recursively before the rewrite rule is applied.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   648
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   649
\begin{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   650
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   651
\item[\ttindexbold{simp_tac}, \ttindexbold{asm_simp_tac},
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   652
  \ttindexbold{full_simp_tac}, \ttindexbold{asm_full_simp_tac}] are
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   653
  the basic simplification tactics that work exactly like their
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   654
  namesakes in \S\ref{sec:simp-for-dummies}, except that they are
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   655
  explicitly supplied with a simpset.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   656
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   657
\item[\ttindexbold{safe_asm_full_simp_tac}] is like
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   658
  \texttt{asm_full_simp_tac}, but uses the safe solver as explained in
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   659
  \S\ref{sec:simp-solver}.  This tactic is mainly intended for
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   660
  building special tools, e.g.\ for combining the simplifier with the
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   661
  classical reasoner.  It is rarely used directly.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   662
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   663
\item[\ttindexbold{SIMPSET} $tacf$, \ttindexbold{SIMPSET'} $tacf'$]
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   664
  are tacticals that make a tactic depend on the implicit current
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   665
  simpset of the theory associated with the proof state they are
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   666
  applied on.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   667
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   668
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   669
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   670
\medskip
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   671
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   672
Local modifications of simpsets within a proof are often much cleaner
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   673
by using above tactics in conjunction with explicit simpsets, rather
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   674
than their capitalized counterparts.  For example
1213
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   675
\begin{ttbox}
1860
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
   676
Addsimps \(thms\);
2479
57109c1a653d Updated account of implicit simpsets and clasets
paulson
parents: 2020
diff changeset
   677
by (Simp_tac \(i\));
1860
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
   678
Delsimps \(thms\);
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
   679
\end{ttbox}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   680
can be expressed more appropriately as
1860
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
   681
\begin{ttbox}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   682
by (simp_tac (simpset() addsimps \(thms\)) \(i\));
1213
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   683
\end{ttbox}
1860
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
   684
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   685
\medskip
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   686
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   687
Also note that functions depending implicitly on the current theory
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   688
context (like capital \texttt{Simp_tac} and the other commands of
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   689
\S\ref{sec:simp-for-dummies}) should be considered harmful outside of
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   690
actual proof scripts.  In particular, ML programs like theory
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   691
definition packages or special tactics should refer to simpsets only
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   692
explicitly, via the above tactics used in conjunction with
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   693
\texttt{simpset_of} or the \texttt{SIMPSET} tacticals.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   694
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   695
\begin{warn}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   696
  There is a subtle difference between \texttt{(SIMPSET'~$tacf$)} and
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   697
  \texttt{($tacf$~(simpset()))}.  For example \texttt{(SIMPSET'
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   698
    simp_tac)} would depend on the theory of the proof state it is
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   699
  applied to, while \texttt{(simp_tac (simpset()))} implicitly refers
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   700
  to the current theory context.  Both are usually the same in proof
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   701
  scripts, provided that goals are only stated within the current
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   702
  theory.  Robust programs would not count on that, of course.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   703
\end{warn}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   704
1860
71bfeecfa96c Documented simplification tactics which make use of the implicit simpset.
nipkow
parents: 1387
diff changeset
   705
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   706
\section{Forward simplification rules}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   707
\index{simplification!forward rules}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   708
\begin{ttbox}\index{*simplify}\index{*asm_simplify}\index{*full_simplify}\index{*asm_full_simplify}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   709
simplify          : simpset -> thm -> thm
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   710
asm_simplify      : simpset -> thm -> thm
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   711
full_simplify     : simpset -> thm -> thm
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   712
asm_full_simplify : simpset -> thm -> thm
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   713
\end{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   714
4557
wenzelm
parents: 4395
diff changeset
   715
These functions provide \emph{forward} rules for simplification.
wenzelm
parents: 4395
diff changeset
   716
Their effect is analogous to the corresponding tactics described in
wenzelm
parents: 4395
diff changeset
   717
\S\ref{simp-tactics}, but affect the whole theorem instead of just a
wenzelm
parents: 4395
diff changeset
   718
certain subgoal.  Also note that the looper~/ solver process as
wenzelm
parents: 4395
diff changeset
   719
described in \S\ref{sec:simp-looper} and \S\ref{sec:simp-solver} is
wenzelm
parents: 4395
diff changeset
   720
omitted in forward simplification.
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   721
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   722
\begin{warn}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   723
  Forward simplification should be used rarely in ordinary proof
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   724
  scripts.  It as mainly intended to provide an internal interface to
4557
wenzelm
parents: 4395
diff changeset
   725
  the simplifier for special utilities.
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   726
\end{warn}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   727
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   728
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   729
\section{Examples of using the simplifier}
3112
0f764be1583a fixed simplifier examples;
wenzelm
parents: 3108
diff changeset
   730
\index{examples!of simplification} Assume we are working within {\tt
0f764be1583a fixed simplifier examples;
wenzelm
parents: 3108
diff changeset
   731
  FOL} (cf.\ \texttt{FOL/ex/Nat}) and that
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   732
\begin{ttdescription}
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   733
\item[Nat.thy] 
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   734
  is a theory including the constants $0$, $Suc$ and $+$,
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   735
\item[add_0]
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   736
  is the rewrite rule $0+\Var{n} = \Var{n}$,
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   737
\item[add_Suc]
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   738
  is the rewrite rule $Suc(\Var{m})+\Var{n} = Suc(\Var{m}+\Var{n})$,
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   739
\item[induct]
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   740
  is the induction rule $\List{\Var{P}(0);\; \Forall x. \Var{P}(x)\Imp
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   741
    \Var{P}(Suc(x))} \Imp \Var{P}(\Var{n})$.
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   742
\end{ttdescription}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   743
We augment the implicit simpset inherited from \texttt{Nat} with the
4557
wenzelm
parents: 4395
diff changeset
   744
basic rewrite rules for addition of natural numbers:
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   745
\begin{ttbox}
3112
0f764be1583a fixed simplifier examples;
wenzelm
parents: 3108
diff changeset
   746
Addsimps [add_0, add_Suc];
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   747
\end{ttbox}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   748
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   749
\subsection{A trivial example}
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   750
Proofs by induction typically involve simplification.  Here is a proof
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   751
that~0 is a right identity:
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   752
\begin{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   753
goal Nat.thy "m+0 = m";
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   754
{\out Level 0}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   755
{\out m + 0 = m}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   756
{\out  1. m + 0 = m}
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   757
\end{ttbox}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   758
The first step is to perform induction on the variable~$m$.  This returns a
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   759
base case and inductive step as two subgoals:
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   760
\begin{ttbox}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   761
by (res_inst_tac [("n","m")] induct 1);
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   762
{\out Level 1}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   763
{\out m + 0 = m}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   764
{\out  1. 0 + 0 = 0}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   765
{\out  2. !!x. x + 0 = x ==> Suc(x) + 0 = Suc(x)}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   766
\end{ttbox}
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   767
Simplification solves the first subgoal trivially:
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   768
\begin{ttbox}
3112
0f764be1583a fixed simplifier examples;
wenzelm
parents: 3108
diff changeset
   769
by (Simp_tac 1);
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   770
{\out Level 2}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   771
{\out m + 0 = m}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   772
{\out  1. !!x. x + 0 = x ==> Suc(x) + 0 = Suc(x)}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   773
\end{ttbox}
3112
0f764be1583a fixed simplifier examples;
wenzelm
parents: 3108
diff changeset
   774
The remaining subgoal requires \ttindex{Asm_simp_tac} in order to use the
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   775
induction hypothesis as a rewrite rule:
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   776
\begin{ttbox}
3112
0f764be1583a fixed simplifier examples;
wenzelm
parents: 3108
diff changeset
   777
by (Asm_simp_tac 1);
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   778
{\out Level 3}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   779
{\out m + 0 = m}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   780
{\out No subgoals!}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   781
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   782
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   783
\subsection{An example of tracing}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
   784
\index{tracing!of simplification|(}\index{*trace_simp}
4557
wenzelm
parents: 4395
diff changeset
   785
wenzelm
parents: 4395
diff changeset
   786
Let us prove a similar result involving more complex terms.  We prove
wenzelm
parents: 4395
diff changeset
   787
that addition is commutative.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   788
\begin{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   789
goal Nat.thy "m+Suc(n) = Suc(m+n)";
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   790
{\out Level 0}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   791
{\out m + Suc(n) = Suc(m + n)}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   792
{\out  1. m + Suc(n) = Suc(m + n)}
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   793
\end{ttbox}
4557
wenzelm
parents: 4395
diff changeset
   794
Performing induction on~$m$ yields two subgoals:
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   795
\begin{ttbox}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   796
by (res_inst_tac [("n","m")] induct 1);
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   797
{\out Level 1}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   798
{\out m + Suc(n) = Suc(m + n)}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   799
{\out  1. 0 + Suc(n) = Suc(0 + n)}
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   800
{\out  2. !!x. x + Suc(n) = Suc(x + n) ==>}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   801
{\out          Suc(x) + Suc(n) = Suc(Suc(x) + n)}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   802
\end{ttbox}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   803
Simplification solves the first subgoal, this time rewriting two
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   804
occurrences of~0:
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   805
\begin{ttbox}
3112
0f764be1583a fixed simplifier examples;
wenzelm
parents: 3108
diff changeset
   806
by (Simp_tac 1);
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   807
{\out Level 2}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   808
{\out m + Suc(n) = Suc(m + n)}
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   809
{\out  1. !!x. x + Suc(n) = Suc(x + n) ==>}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   810
{\out          Suc(x) + Suc(n) = Suc(Suc(x) + n)}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   811
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   812
Switching tracing on illustrates how the simplifier solves the remaining
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   813
subgoal: 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   814
\begin{ttbox}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   815
set trace_simp;
3112
0f764be1583a fixed simplifier examples;
wenzelm
parents: 3108
diff changeset
   816
by (Asm_simp_tac 1);
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   817
\ttbreak
3112
0f764be1583a fixed simplifier examples;
wenzelm
parents: 3108
diff changeset
   818
{\out Adding rewrite rule:}
0f764be1583a fixed simplifier examples;
wenzelm
parents: 3108
diff changeset
   819
{\out .x + Suc(n) == Suc(.x + n)}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   820
\ttbreak
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   821
{\out Rewriting:}
3112
0f764be1583a fixed simplifier examples;
wenzelm
parents: 3108
diff changeset
   822
{\out Suc(.x) + Suc(n) == Suc(.x + Suc(n))}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   823
\ttbreak
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   824
{\out Rewriting:}
3112
0f764be1583a fixed simplifier examples;
wenzelm
parents: 3108
diff changeset
   825
{\out .x + Suc(n) == Suc(.x + n)}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   826
\ttbreak
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   827
{\out Rewriting:}
3112
0f764be1583a fixed simplifier examples;
wenzelm
parents: 3108
diff changeset
   828
{\out Suc(.x) + n == Suc(.x + n)}
0f764be1583a fixed simplifier examples;
wenzelm
parents: 3108
diff changeset
   829
\ttbreak
0f764be1583a fixed simplifier examples;
wenzelm
parents: 3108
diff changeset
   830
{\out Rewriting:}
0f764be1583a fixed simplifier examples;
wenzelm
parents: 3108
diff changeset
   831
{\out Suc(Suc(.x + n)) = Suc(Suc(.x + n)) == True}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   832
\ttbreak
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   833
{\out Level 3}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   834
{\out m + Suc(n) = Suc(m + n)}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   835
{\out No subgoals!}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   836
\end{ttbox}
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   837
Many variations are possible.  At Level~1 (in either example) we could have
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   838
solved both subgoals at once using the tactical \ttindex{ALLGOALS}:
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   839
\begin{ttbox}
3112
0f764be1583a fixed simplifier examples;
wenzelm
parents: 3108
diff changeset
   840
by (ALLGOALS Asm_simp_tac);
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   841
{\out Level 2}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   842
{\out m + Suc(n) = Suc(m + n)}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   843
{\out No subgoals!}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   844
\end{ttbox}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
   845
\index{tracing!of simplification|)}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   846
4557
wenzelm
parents: 4395
diff changeset
   847
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   848
\subsection{Free variables and simplification}
4557
wenzelm
parents: 4395
diff changeset
   849
wenzelm
parents: 4395
diff changeset
   850
Here is a conjecture to be proved for an arbitrary function~$f$
wenzelm
parents: 4395
diff changeset
   851
satisfying the law $f(Suc(\Var{n})) = Suc(f(\Var{n}))$:
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   852
\begin{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   853
val [prem] = goal Nat.thy
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   854
    "(!!n. f(Suc(n)) = Suc(f(n))) ==> f(i+j) = i+f(j)";
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   855
{\out Level 0}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   856
{\out f(i + j) = i + f(j)}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   857
{\out  1. f(i + j) = i + f(j)}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   858
\ttbreak
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   859
{\out val prem = "f(Suc(?n)) = Suc(f(?n))}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   860
{\out             [!!n. f(Suc(n)) = Suc(f(n))]" : thm}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   861
\end{ttbox}
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
   862
In the theorem~\texttt{prem}, note that $f$ is a free variable while
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   863
$\Var{n}$ is a schematic variable.
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   864
\begin{ttbox}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   865
by (res_inst_tac [("n","i")] induct 1);
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   866
{\out Level 1}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   867
{\out f(i + j) = i + f(j)}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   868
{\out  1. f(0 + j) = 0 + f(j)}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   869
{\out  2. !!x. f(x + j) = x + f(j) ==> f(Suc(x) + j) = Suc(x) + f(j)}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   870
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   871
We simplify each subgoal in turn.  The first one is trivial:
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   872
\begin{ttbox}
3112
0f764be1583a fixed simplifier examples;
wenzelm
parents: 3108
diff changeset
   873
by (Simp_tac 1);
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   874
{\out Level 2}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   875
{\out f(i + j) = i + f(j)}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   876
{\out  1. !!x. f(x + j) = x + f(j) ==> f(Suc(x) + j) = Suc(x) + f(j)}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   877
\end{ttbox}
3112
0f764be1583a fixed simplifier examples;
wenzelm
parents: 3108
diff changeset
   878
The remaining subgoal requires rewriting by the premise, so we add it
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   879
to the current simpset:
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   880
\begin{ttbox}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   881
by (asm_simp_tac (simpset() addsimps [prem]) 1);
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   882
{\out Level 3}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   883
{\out f(i + j) = i + f(j)}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   884
{\out No subgoals!}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   885
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   886
1213
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   887
\subsection{Reordering assumptions}
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   888
\label{sec:reordering-asms}
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   889
\index{assumptions!reordering}
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   890
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   891
As mentioned in \S\ref{sec:simp-for-dummies-tacs},
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   892
\ttindex{asm_full_simp_tac} may require the assumptions to be permuted
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   893
to be more effective.  Given the subgoal
1213
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   894
\begin{ttbox}
4889
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
   895
{\out 1. [| ALL x. P x --> f x = g x; Q(f a); P a; R |] ==> S}
1213
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   896
\end{ttbox}
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   897
we can rotate the assumptions two positions to the right
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   898
\begin{ttbox}
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   899
by (rotate_tac ~2 1);
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   900
\end{ttbox}
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   901
to obtain
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   902
\begin{ttbox}
4889
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
   903
{\out 1. [| P a; R; ALL x. P x --> f x = g x; Q(f a) |] ==> S}
1213
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   904
\end{ttbox}
4889
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
   905
which enables \verb$asm_full_simp_tac$ to simplify \verb$Q(f a)$ to
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
   906
\verb$Q(g a)$ because now all required assumptions are to the left of
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
   907
\verb$Q(f a)$.
1213
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   908
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   909
Since rotation alone cannot produce arbitrary permutations, you can also pick
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   910
out a particular assumption which needs to be rewritten and move it the the
3485
f27a30a18a17 Now there are TWO spaces after each full stop, so that the Emacs sentence
paulson
parents: 3134
diff changeset
   911
right end of the assumptions.  In the above case rotation can be replaced by
1213
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   912
\begin{ttbox}
4889
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
   913
by (dres_inst_tac [("psi","Q(f a)")] asm_rl 1);
1213
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   914
\end{ttbox}
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   915
which is more directed and leads to
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   916
\begin{ttbox}
4889
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
   917
{\out 1. [| ALL x. P x --> f x = g x; P a; R; Q(f a) |] ==> S}
1213
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   918
\end{ttbox}
a8f6d0fa2a59 added section on "Reordering assumptions".
nipkow
parents: 1101
diff changeset
   919
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   920
\begin{warn}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   921
  Reordering assumptions usually leads to brittle proofs and should be
4889
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
   922
  avoided.  Future versions of \verb$asm_full_simp_tac$ will completely
72cbd13deb16 New behaviour of asm_full_simp_tac.
nipkow
parents: 4798
diff changeset
   923
  remove the need for such manipulations.
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   924
\end{warn}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   925
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
   926
332
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
   927
\section{Permutative rewrite rules}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   928
\index{rewrite rules!permutative|(}
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   929
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   930
A rewrite rule is {\bf permutative} if the left-hand side and right-hand
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   931
side are the same up to renaming of variables.  The most common permutative
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   932
rule is commutativity: $x+y = y+x$.  Other examples include $(x-y)-z =
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   933
(x-z)-y$ in arithmetic and $insert(x,insert(y,A)) = insert(y,insert(x,A))$
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   934
for sets.  Such rules are common enough to merit special attention.
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   935
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   936
Because ordinary rewriting loops given such rules, the simplifier
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   937
employs a special strategy, called {\bf ordered
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   938
  rewriting}\index{rewriting!ordered}.  There is a standard
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   939
lexicographic ordering on terms.  This should be perfectly OK in most
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   940
cases, but can be changed for special applications.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   941
4947
15fd948d6c69 Small mods.
nipkow
parents: 4889
diff changeset
   942
\begin{ttbox}
15fd948d6c69 Small mods.
nipkow
parents: 4889
diff changeset
   943
settermless : simpset * (term * term -> bool) -> simpset \hfill{\bf infix 4}
15fd948d6c69 Small mods.
nipkow
parents: 4889
diff changeset
   944
\end{ttbox}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   945
\begin{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   946
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   947
\item[$ss$ \ttindexbold{settermless} $rel$] installs relation $rel$ as
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   948
  term order in simpset $ss$.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   949
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   950
\end{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   951
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   952
\medskip
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   953
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   954
A permutative rewrite rule is applied only if it decreases the given
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   955
term with respect to this ordering.  For example, commutativity
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   956
rewrites~$b+a$ to $a+b$, but then stops because $a+b$ is strictly less
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   957
than $b+a$.  The Boyer-Moore theorem prover~\cite{bm88book} also
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   958
employs ordered rewriting.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   959
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   960
Permutative rewrite rules are added to simpsets just like other
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   961
rewrite rules; the simplifier recognizes their special status
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   962
automatically.  They are most effective in the case of
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   963
associative-commutative operators.  (Associativity by itself is not
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   964
permutative.)  When dealing with an AC-operator~$f$, keep the
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   965
following points in mind:
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   966
\begin{itemize}\index{associative-commutative operators}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   967
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   968
\item The associative law must always be oriented from left to right,
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   969
  namely $f(f(x,y),z) = f(x,f(y,z))$.  The opposite orientation, if
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   970
  used with commutativity, leads to looping in conjunction with the
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   971
  standard term order.
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   972
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   973
\item To complete your set of rewrite rules, you must add not just
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   974
  associativity~(A) and commutativity~(C) but also a derived rule, {\bf
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
   975
    left-com\-mut\-ativ\-ity} (LC): $f(x,f(y,z)) = f(y,f(x,z))$.
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   976
\end{itemize}
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   977
Ordered rewriting with the combination of A, C, and~LC sorts a term
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   978
lexicographically:
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   979
\[\def\maps#1{\stackrel{#1}{\longmapsto}}
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   980
 (b+c)+a \maps{A} b+(c+a) \maps{C} b+(a+c) \maps{LC} a+(b+c) \]
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   981
Martin and Nipkow~\cite{martin-nipkow} discuss the theory and give many
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   982
examples; other algebraic structures are amenable to ordered rewriting,
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   983
such as boolean rings.
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   984
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
   985
\subsection{Example: sums of natural numbers}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   986
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   987
This example is again set in \HOL\ (see \texttt{HOL/ex/NatSum}).
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   988
Theory \thydx{Arith} contains natural numbers arithmetic.  Its
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   989
associated simpset contains many arithmetic laws including
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
   990
distributivity of~$\times$ over~$+$, while \texttt{add_ac} is a list
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   991
consisting of the A, C and LC laws for~$+$ on type \texttt{nat}.  Let
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
   992
us prove the theorem
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   993
\[ \sum@{i=1}^n i = n\times(n+1)/2. \]
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   994
%
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
   995
A functional~\texttt{sum} represents the summation operator under the
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
   996
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: 4560
diff changeset
   997
extend \texttt{Arith} as follows:
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   998
\begin{ttbox}
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   999
NatSum = Arith +
1387
9bcad9c22fd4 removed quotes from syntax and consts sections
clasohm
parents: 1213
diff changeset
  1000
consts sum     :: [nat=>nat, nat] => nat
4245
b9ce25073cc0 Updated the NatSum example
paulson
parents: 3950
diff changeset
  1001
primrec "sum" nat 
b9ce25073cc0 Updated the NatSum example
paulson
parents: 3950
diff changeset
  1002
  "sum f 0 = 0"
b9ce25073cc0 Updated the NatSum example
paulson
parents: 3950
diff changeset
  1003
  "sum f (Suc n) = f(n) + sum f n"
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1004
end
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1005
\end{ttbox}
4245
b9ce25073cc0 Updated the NatSum example
paulson
parents: 3950
diff changeset
  1006
The \texttt{primrec} declaration automatically adds rewrite rules for
4557
wenzelm
parents: 4395
diff changeset
  1007
\texttt{sum} to the default simpset.  We now remove the
wenzelm
parents: 4395
diff changeset
  1008
\texttt{nat_cancel} simplification procedures (in order not to spoil
wenzelm
parents: 4395
diff changeset
  1009
the example) and insert the AC-rules for~$+$:
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1010
\begin{ttbox}
4557
wenzelm
parents: 4395
diff changeset
  1011
Delsimprocs nat_cancel;
4245
b9ce25073cc0 Updated the NatSum example
paulson
parents: 3950
diff changeset
  1012
Addsimps add_ac;
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1013
\end{ttbox}
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1014
Our desired theorem now reads $\texttt{sum} \, (\lambda i.i) \, (n+1) =
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1015
n\times(n+1)/2$.  The Isabelle goal has both sides multiplied by~$2$:
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1016
\begin{ttbox}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
  1017
goal NatSum.thy "2 * sum (\%i.i) (Suc n) = n * Suc n";
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1018
{\out Level 0}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
  1019
{\out 2 * sum (\%i. i) (Suc n) = n * Suc n}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
  1020
{\out  1. 2 * sum (\%i. i) (Suc n) = n * Suc n}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1021
\end{ttbox}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
  1022
Induction should not be applied until the goal is in the simplest
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
  1023
form:
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1024
\begin{ttbox}
4245
b9ce25073cc0 Updated the NatSum example
paulson
parents: 3950
diff changeset
  1025
by (Simp_tac 1);
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1026
{\out Level 1}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
  1027
{\out 2 * sum (\%i. i) (Suc n) = n * Suc n}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
  1028
{\out  1. n + (sum (\%i. i) n + sum (\%i. i) n) = n * n}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1029
\end{ttbox}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
  1030
Ordered rewriting has sorted the terms in the left-hand side.  The
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
  1031
subgoal is now ready for induction:
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1032
\begin{ttbox}
4245
b9ce25073cc0 Updated the NatSum example
paulson
parents: 3950
diff changeset
  1033
by (induct_tac "n" 1);
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1034
{\out Level 2}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
  1035
{\out 2 * sum (\%i. i) (Suc n) = n * Suc n}
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
  1036
{\out  1. 0 + (sum (\%i. i) 0 + sum (\%i. i) 0) = 0 * 0}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1037
\ttbreak
4245
b9ce25073cc0 Updated the NatSum example
paulson
parents: 3950
diff changeset
  1038
{\out  2. !!n. n + (sum (\%i. i) n + sum (\%i. i) n) = n * n}
b9ce25073cc0 Updated the NatSum example
paulson
parents: 3950
diff changeset
  1039
{\out           ==> Suc n + (sum (\%i. i) (Suc n) + sum (\%i. i) (Suc n)) =}
b9ce25073cc0 Updated the NatSum example
paulson
parents: 3950
diff changeset
  1040
{\out               Suc n * Suc n}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1041
\end{ttbox}
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1042
Simplification proves both subgoals immediately:\index{*ALLGOALS}
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1043
\begin{ttbox}
4245
b9ce25073cc0 Updated the NatSum example
paulson
parents: 3950
diff changeset
  1044
by (ALLGOALS Asm_simp_tac);
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1045
{\out Level 3}
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 3087
diff changeset
  1046
{\out 2 * sum (\%i. i) (Suc n) = n * Suc n}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1047
{\out No subgoals!}
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1048
\end{ttbox}
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1049
Simplification cannot prove the induction step if we omit \texttt{add_ac} from
4245
b9ce25073cc0 Updated the NatSum example
paulson
parents: 3950
diff changeset
  1050
the simpset.  Observe that like terms have not been collected:
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1051
\begin{ttbox}
4245
b9ce25073cc0 Updated the NatSum example
paulson
parents: 3950
diff changeset
  1052
{\out Level 3}
b9ce25073cc0 Updated the NatSum example
paulson
parents: 3950
diff changeset
  1053
{\out 2 * sum (\%i. i) (Suc n) = n * Suc n}
b9ce25073cc0 Updated the NatSum example
paulson
parents: 3950
diff changeset
  1054
{\out  1. !!n. n + sum (\%i. i) n + (n + sum (\%i. i) n) = n + n * n}
b9ce25073cc0 Updated the NatSum example
paulson
parents: 3950
diff changeset
  1055
{\out           ==> n + (n + sum (\%i. i) n) + (n + (n + sum (\%i. i) n)) =}
b9ce25073cc0 Updated the NatSum example
paulson
parents: 3950
diff changeset
  1056
{\out               n + (n + (n + n * n))}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1057
\end{ttbox}
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1058
Ordered rewriting proves this by sorting the left-hand side.  Proving
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1059
arithmetic theorems without ordered rewriting requires explicit use of
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1060
commutativity.  This is tedious; try it and see!
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1061
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1062
Ordered rewriting is equally successful in proving
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1063
$\sum@{i=1}^n i^3 = n^2\times(n+1)^2/4$.
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1064
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1065
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1066
\subsection{Re-orienting equalities}
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1067
Ordered rewriting with the derived rule \texttt{symmetry} can reverse
4557
wenzelm
parents: 4395
diff changeset
  1068
equations:
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1069
\begin{ttbox}
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1070
val symmetry = prove_goal HOL.thy "(x=y) = (y=x)"
3128
d01d4c0c4b44 New acknowledgements; fixed overfull lines and tables
paulson
parents: 3112
diff changeset
  1071
                 (fn _ => [Blast_tac 1]);
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1072
\end{ttbox}
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1073
This is frequently useful.  Assumptions of the form $s=t$, where $t$ occurs
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1074
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: 4560
diff changeset
  1075
For example, ordered rewriting with \texttt{symmetry} can prove the goal
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1076
\[ f(a)=b \conj f(a)=c \imp b=c. \]
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1077
Here \texttt{symmetry} reverses both $f(a)=b$ and $f(a)=c$
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1078
because $f(a)$ is lexicographically greater than $b$ and~$c$.  These
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1079
re-oriented equations, as rewrite rules, replace $b$ and~$c$ in the
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1080
conclusion by~$f(a)$. 
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1081
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1082
Another example is the goal $\neg(t=u) \imp \neg(u=t)$.
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1083
The differing orientations make this appear difficult to prove.  Ordered
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1084
rewriting with \texttt{symmetry} makes the equalities agree.  (Without
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1085
knowing more about~$t$ and~$u$ we cannot say whether they both go to $t=u$
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1086
or~$u=t$.)  Then the simplifier can prove the goal outright.
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1087
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1088
\index{rewrite rules!permutative|)}
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1089
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1090
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1091
\section{*Coding simplification procedures}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1092
\begin{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1093
mk_simproc: string -> cterm list ->
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1094
              (Sign.sg -> thm list -> term -> thm option) -> simproc
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1095
\end{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1096
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1097
\begin{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1098
\item[\ttindexbold{mk_simproc}~$name$~$lhss$~$proc$] makes $proc$ a
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1099
  simplification procedure for left-hand side patterns $lhss$.  The
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1100
  name just serves as a comment.  The function $proc$ may be invoked
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1101
  by the simplifier for redex positions matched by one of $lhss$ as
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1102
  described below.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1103
\end{ttdescription}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1104
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1105
Simplification procedures are applied in a two-stage process as
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1106
follows: The simplifier tries to match the current redex position
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1107
against any one of the $lhs$ patterns of any simplification procedure.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1108
If this succeeds, it invokes the corresponding {\ML} function, passing
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1109
with the current signature, local assumptions and the (potential)
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1110
redex.  The result may be either \texttt{None} (indicating failure) or
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1111
\texttt{Some~$thm$}.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1112
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1113
Any successful result is supposed to be a (possibly conditional)
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1114
rewrite rule $t \equiv u$ that is applicable to the current redex.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1115
The rule will be applied just as any ordinary rewrite rule.  It is
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1116
expected to be already in \emph{internal form}, though, bypassing the
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1117
automatic preprocessing of object-level equivalences.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1118
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1119
\medskip
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1120
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1121
As an example of how to write your own simplification procedures,
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1122
consider eta-expansion of pair abstraction (see also
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1123
\texttt{HOL/Modelcheck/MCSyn} where this is used to provide external
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1124
model checker syntax).
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1125
  
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1126
The {\HOL} theory of tuples (see \texttt{HOL/Prod}) provides an
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1127
operator \texttt{split} together with some concrete syntax supporting
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1128
$\lambda\,(x,y).b$ abstractions.  Assume that we would like to offer a
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1129
tactic that rewrites any function $\lambda\,p.f\,p$ (where $p$ is of
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1130
some pair type) to $\lambda\,(x,y).f\,(x,y)$.  The corresponding rule
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1131
is:
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1132
\begin{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1133
pair_eta_expand:  (f::'a*'b=>'c) = (\%(x, y). f (x, y))
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1134
\end{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1135
Unfortunately, term rewriting using this rule directly would not
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1136
terminate!  We now use the simplification procedure mechanism in order
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1137
to stop the simplifier from applying this rule over and over again,
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1138
making it rewrite only actual abstractions.  The simplification
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1139
procedure \texttt{pair_eta_expand_proc} is defined as follows:
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1140
\begin{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1141
local
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1142
  val lhss =
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1143
    [read_cterm (sign_of Prod.thy) 
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1144
                ("f::'a*'b=>'c", TVar (("'z", 0), []))];
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1145
  val rew = mk_meta_eq pair_eta_expand; \medskip
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1146
  fun proc _ _ (Abs _) = Some rew
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1147
    | proc _ _ _ = None;
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1148
in
4560
wenzelm
parents: 4557
diff changeset
  1149
  val pair_eta_expand_proc = mk_simproc "pair_eta_expand" lhss proc;
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1150
end;
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1151
\end{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1152
This is an example of using \texttt{pair_eta_expand_proc}:
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1153
\begin{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1154
{\out 1. P (\%p::'a * 'a. fst p + snd p + z)}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1155
by (simp_tac (simpset() addsimprocs [pair_eta_expand_proc]) 1);
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1156
{\out 1. P (\%(x::'a,y::'a). x + y + z)}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1157
\end{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1158
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1159
\medskip
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1160
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1161
In the above example the simplification procedure just did fine
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1162
grained control over rule application, beyond higher-order pattern
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1163
matching.  Usually, procedures would do some more work, in particular
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1164
prove particular theorems depending on the current redex.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1165
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1166
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1167
\section{*Setting up the simplifier}\label{sec:setting-up-simp}
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1168
\index{simplification!setting up}
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1169
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1170
Setting up the simplifier for new logics is complicated.  This section
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1171
describes how the simplifier is installed for intuitionistic
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1172
first-order logic; the code is largely taken from {\tt
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1173
  FOL/simpdata.ML} of the Isabelle sources.
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1174
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1175
The simplifier and the case splitting tactic, which reside on separate
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1176
files, are not part of Pure Isabelle.  They must be loaded explicitly
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1177
by the object-logic as follows:
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1178
\begin{ttbox}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1179
use "$ISABELLE_HOME/src/Provers/simplifier.ML";
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1180
use "$ISABELLE_HOME/src/Provers/splitter.ML";
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1181
\end{ttbox}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1182
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1183
Simplification requires converting object-equalities to meta-level rewrite
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1184
rules.  This demands rules stating that equal terms and equivalent formulae
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1185
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: 4560
diff changeset
  1186
\texttt{FOL/IFOL.thy} contains the two lines
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1187
\begin{ttbox}\index{*eq_reflection theorem}\index{*iff_reflection theorem}
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1188
eq_reflection   "(x=y)   ==> (x==y)"
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1189
iff_reflection  "(P<->Q) ==> (P==Q)"
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1190
\end{ttbox}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1191
Of course, you should only assert such rules if they are true for your
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1192
particular logic.  In Constructive Type Theory, equality is a ternary
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1193
relation of the form $a=b\in A$; the type~$A$ determines the meaning
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1194
of the equality essentially as a partial equivalence relation.  The
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1195
present simplifier cannot be used.  Rewriting in \texttt{CTT} uses
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1196
another simplifier, which resides in the file {\tt
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1197
  Provers/typedsimp.ML} and is not documented.  Even this does not
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1198
work for later variants of Constructive Type Theory that use
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1199
intensional equality~\cite{nordstrom90}.
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1200
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1201
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1202
\subsection{A collection of standard rewrite rules}
4557
wenzelm
parents: 4395
diff changeset
  1203
wenzelm
parents: 4395
diff changeset
  1204
We first prove lots of standard rewrite rules about the logical
wenzelm
parents: 4395
diff changeset
  1205
connectives.  These include cancellation and associative laws.  We
wenzelm
parents: 4395
diff changeset
  1206
define a function that echoes the desired law and then supplies it the
wenzelm
parents: 4395
diff changeset
  1207
prover for intuitionistic \FOL:
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1208
\begin{ttbox}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1209
fun int_prove_fun s = 
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1210
 (writeln s;  
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1211
  prove_goal IFOL.thy s
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1212
   (fn prems => [ (cut_facts_tac prems 1), 
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1213
                  (IntPr.fast_tac 1) ]));
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1214
\end{ttbox}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1215
The following rewrite rules about conjunction are a selection of those
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1216
proved on \texttt{FOL/simpdata.ML}.  Later, these will be supplied to the
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1217
standard simpset.
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1218
\begin{ttbox}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1219
val conj_simps = map int_prove_fun
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1220
 ["P & True <-> P",      "True & P <-> P",
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1221
  "P & False <-> False", "False & P <-> False",
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1222
  "P & P <-> P",
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1223
  "P & ~P <-> False",    "~P & P <-> False",
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1224
  "(P & Q) & R <-> P & (Q & R)"];
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1225
\end{ttbox}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1226
The file also proves some distributive laws.  As they can cause exponential
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1227
blowup, they will not be included in the standard simpset.  Instead they
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1228
are merely bound to an \ML{} identifier, for user reference.
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1229
\begin{ttbox}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1230
val distrib_simps  = map int_prove_fun
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1231
 ["P & (Q | R) <-> P&Q | P&R", 
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1232
  "(Q | R) & P <-> Q&P | R&P",
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1233
  "(P | Q --> R) <-> (P --> R) & (Q --> R)"];
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1234
\end{ttbox}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1235
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1236
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1237
\subsection{Functions for preprocessing the rewrite rules}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1238
\label{sec:setmksimps}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1239
\begin{ttbox}\indexbold{*setmksimps}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1240
setmksimps : simpset * (thm -> thm list) -> simpset \hfill{\bf infix 4}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1241
\end{ttbox}
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1242
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: 4560
diff changeset
  1243
This will be installed by calling \texttt{setmksimps} below.  Preprocessing
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1244
occurs whenever rewrite rules are added, whether by user command or
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1245
automatically.  Preprocessing involves extracting atomic rewrites at the
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1246
object-level, then reflecting them to the meta-level.
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1247
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1248
To start, the function \texttt{gen_all} strips any meta-level
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1249
quantifiers from the front of the given theorem.  Usually there are none
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1250
anyway.
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1251
\begin{ttbox}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1252
fun gen_all th = forall_elim_vars (#maxidx(rep_thm th)+1) th;
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1253
\end{ttbox}
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1254
The function \texttt{atomize} analyses a theorem in order to extract
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1255
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: 4560
diff changeset
  1256
wildcard~\texttt{_}, is the coercion function \texttt{Trueprop}.
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1257
\begin{ttbox}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1258
fun atomize th = case concl_of th of 
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1259
    _ $ (Const("op &",_) $ _ $ _)   => atomize(th RS conjunct1) \at
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1260
                                       atomize(th RS conjunct2)
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1261
  | _ $ (Const("op -->",_) $ _ $ _) => atomize(th RS mp)
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1262
  | _ $ (Const("All",_) $ _)        => atomize(th RS spec)
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1263
  | _ $ (Const("True",_))           => []
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1264
  | _ $ (Const("False",_))          => []
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1265
  | _                               => [th];
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1266
\end{ttbox}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1267
There are several cases, depending upon the form of the conclusion:
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1268
\begin{itemize}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1269
\item Conjunction: extract rewrites from both conjuncts.
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1270
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1271
\item Implication: convert $P\imp Q$ to the meta-implication $P\Imp Q$ and
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1272
  extract rewrites from~$Q$; these will be conditional rewrites with the
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1273
  condition~$P$.
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1274
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1275
\item Universal quantification: remove the quantifier, replacing the bound
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1276
  variable by a schematic variable, and extract rewrites from the body.
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1277
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1278
\item \texttt{True} and \texttt{False} contain no useful rewrites.
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1279
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1280
\item Anything else: return the theorem in a singleton list.
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1281
\end{itemize}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1282
The resulting theorems are not literally atomic --- they could be
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1283
disjunctive, for example --- but are broken down as much as possible.  See
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1284
the file \texttt{ZF/simpdata.ML} for a sophisticated translation of
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1285
set-theoretic formulae into rewrite rules.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
  1286
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1287
The simplified rewrites must now be converted into meta-equalities.  The
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1288
rule \texttt{eq_reflection} converts equality rewrites, while {\tt
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1289
  iff_reflection} converts if-and-only-if rewrites.  The latter possibility
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1290
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: 4560
diff changeset
  1291
$P\equiv\texttt{False}$, and any other theorem~$P$ is converted to
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1292
$P\equiv\texttt{True}$.  The rules \texttt{iff_reflection_F} and {\tt
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1293
  iff_reflection_T} accomplish this conversion.
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1294
\begin{ttbox}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1295
val P_iff_F = int_prove_fun "~P ==> (P <-> False)";
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1296
val iff_reflection_F = P_iff_F RS iff_reflection;
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1297
\ttbreak
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1298
val P_iff_T = int_prove_fun "P ==> (P <-> True)";
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1299
val iff_reflection_T = P_iff_T RS iff_reflection;
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1300
\end{ttbox}
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1301
The function \texttt{mk_meta_eq} converts a theorem to a meta-equality
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1302
using the case analysis described above.
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1303
\begin{ttbox}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1304
fun mk_meta_eq th = case concl_of th of
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1305
    _ $ (Const("op =",_)$_$_)   => th RS eq_reflection
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1306
  | _ $ (Const("op <->",_)$_$_) => th RS iff_reflection
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1307
  | _ $ (Const("Not",_)$_)      => th RS iff_reflection_F
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1308
  | _                           => th RS iff_reflection_T;
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1309
\end{ttbox}
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1310
The three functions \texttt{gen_all}, \texttt{atomize} and \texttt{mk_meta_eq} will
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1311
be composed together and supplied below to \texttt{setmksimps}.
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1312
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1313
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1314
\subsection{Making the initial simpset}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1315
4798
7cfc85fc6fd7 no open Simplifier;
wenzelm
parents: 4664
diff changeset
  1316
It is time to assemble these items.  We define the infix operator
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1317
\ttindex{addcongs} to insert congruence rules; given a list of
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1318
theorems, it converts their conclusions into meta-equalities and
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1319
passes them to \ttindex{addeqcongs}.
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1320
\begin{ttbox}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1321
infix 4 addcongs;
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1322
fun ss addcongs congs =
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1323
    ss addeqcongs (congs RL [eq_reflection,iff_reflection]);
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1324
\end{ttbox}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1325
Furthermore, we define the infix operator \ttindex{addsplits}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1326
providing a convenient interface for adding split tactics.
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1327
\begin{ttbox}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1328
infix 4 addsplits;
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1329
fun ss addsplits splits = ss addloop (split_tac splits);
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1330
\end{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1331
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1332
The list \texttt{IFOL_simps} contains the default rewrite rules for
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1333
intuitionistic first-order logic.  The first of these is the reflexive law
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1334
expressed as the equivalence $(a=a)\bimp\texttt{True}$; the rewrite rule $a=a$ is
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1335
clearly useless.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1336
\begin{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1337
val IFOL_simps =
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1338
   [refl RS P_iff_T] \at conj_simps \at disj_simps \at not_simps \at 
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1339
    imp_simps \at iff_simps \at quant_simps;
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1340
\end{ttbox}
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1341
The list \texttt{triv_rls} contains trivial theorems for the solver.  Any
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1342
subgoal that is simplified to one of these will be removed.
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1343
\begin{ttbox}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1344
val notFalseI = int_prove_fun "~False";
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1345
val triv_rls = [TrueI,refl,iff_refl,notFalseI];
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1346
\end{ttbox}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1347
%
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1348
The basic simpset for intuitionistic \FOL{} is
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1349
\ttindexbold{FOL_basic_ss}.  It preprocess rewrites using {\tt
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1350
  gen_all}, \texttt{atomize} and \texttt{mk_meta_eq}.  It solves simplified
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1351
subgoals using \texttt{triv_rls} and assumptions, and by detecting
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1352
contradictions.  It uses \ttindex{asm_simp_tac} to tackle subgoals of
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1353
conditional rewrites.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1354
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1355
Other simpsets built from \texttt{FOL_basic_ss} will inherit these items.
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1356
In particular, \ttindexbold{IFOL_ss}, which introduces {\tt
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1357
  IFOL_simps} as rewrite rules.  \ttindexbold{FOL_ss} will later
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1358
extend \texttt{IFOL_ss} with classical rewrite rules such as $\neg\neg
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1359
P\bimp P$.
2628
1fe7c9f599c2 description of del(eq)congs, safe and unsafe solver
oheimb
parents: 2613
diff changeset
  1360
\index{*setmksimps}\index{*setSSolver}\index{*setSolver}\index{*setsubgoaler}
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1361
\index{*addsimps}\index{*addcongs}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1362
\begin{ttbox}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1363
fun unsafe_solver prems = FIRST'[resolve_tac (triv_rls {\at} prems),
2628
1fe7c9f599c2 description of del(eq)congs, safe and unsafe solver
oheimb
parents: 2613
diff changeset
  1364
                                 atac, etac FalseE];
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1365
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1366
fun   safe_solver prems = FIRST'[match_tac (triv_rls {\at} prems),
2628
1fe7c9f599c2 description of del(eq)congs, safe and unsafe solver
oheimb
parents: 2613
diff changeset
  1367
                                 eq_assume_tac, ematch_tac [FalseE]];
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1368
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1369
val FOL_basic_ss = empty_ss setsubgoaler asm_simp_tac
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1370
                            addsimprocs [defALL_regroup, defEX_regroup]
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1371
                            setSSolver   safe_solver
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1372
                            setSolver  unsafe_solver
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1373
                            setmksimps (map mk_meta_eq o 
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1374
                                        atomize o gen_all);
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1375
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1376
val IFOL_ss = FOL_basic_ss addsimps (IFOL_simps {\at} 
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1377
                                     int_ex_simps {\at} int_all_simps)
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1378
                           addcongs [imp_cong];
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1379
\end{ttbox}
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1380
This simpset takes \texttt{imp_cong} as a congruence rule in order to use
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1381
contextual information to simplify the conclusions of implications:
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1382
\[ \List{\Var{P}\bimp\Var{P'};\; \Var{P'} \Imp \Var{Q}\bimp\Var{Q'}} \Imp
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1383
   (\Var{P}\imp\Var{Q}) \bimp (\Var{P'}\imp\Var{Q'})
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1384
\]
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1385
By adding the congruence rule \texttt{conj_cong}, we could obtain a similar
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1386
effect for conjunctions.
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1387
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1388
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1389
\subsection{Case splitting}
4557
wenzelm
parents: 4395
diff changeset
  1390
wenzelm
parents: 4395
diff changeset
  1391
To set up case splitting, we must prove the theorem \texttt{meta_iffD}
wenzelm
parents: 4395
diff changeset
  1392
below and pass it to \ttindexbold{mk_case_split_tac}.  The tactic
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1393
\ttindexbold{split_tac} uses \texttt{mk_meta_eq}, defined above, to
4557
wenzelm
parents: 4395
diff changeset
  1394
convert the splitting rules to meta-equalities.
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1395
\begin{ttbox}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1396
val meta_iffD = 
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1397
    prove_goal FOL.thy "[| P==Q; Q |] ==> P"
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1398
        (fn [prem1,prem2] => [rewtac prem1, rtac prem2 1])
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1399
\ttbreak
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1400
fun split_tac splits =
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1401
    mk_case_split_tac meta_iffD (map mk_meta_eq splits);
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1402
\end{ttbox}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1403
%
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1404
The splitter replaces applications of a given function; the right-hand side
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1405
of the replacement can be anything.  For example, here is a splitting rule
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1406
for conditional expressions:
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1407
\[ \Var{P}(if(\Var{Q},\Var{x},\Var{y})) \bimp (\Var{Q} \imp \Var{P}(\Var{x}))
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1408
\conj (\lnot\Var{Q} \imp \Var{P}(\Var{y})) 
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1409
\] 
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1410
Another example is the elimination operator (which happens to be
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
  1411
called~$split$) for Cartesian products:
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1412
\[ \Var{P}(split(\Var{f},\Var{p})) \bimp (\forall a~b. \Var{p} =
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1413
\langle a,b\rangle \imp \Var{P}(\Var{f}(a,b))) 
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1414
\] 
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1415
Case splits should be allowed only when necessary; they are expensive
4597
a0bdee64194c Fixed a lot of overfull and underfull lines (hboxes)
paulson
parents: 4560
diff changeset
  1416
and hard to control.  Here is an example of use, where \texttt{expand_if}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1417
is the first rule above:
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1418
\begin{ttbox}
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1419
by (simp_tac (simpset() addloop (split_tac [expand_if])) 1);
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1420
\end{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1421
Users would usually prefer the following shortcut using
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1422
\ttindex{addsplits}:
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1423
\begin{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1424
by (simp_tac (simpset() addsplits [expand_if]) 1);
286
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1425
\end{ttbox}
e7efbf03562b first draft of Springer book
lcp
parents: 133
diff changeset
  1426
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
  1427
4395
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1428
\subsection{Theory data for implicit simpsets}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1429
\begin{ttbox}\indexbold{*simpset_thy_data}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1430
simpset_thy_data: string * (object * (object -> object) *
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1431
    (object * object -> object) * (Sign.sg -> object -> unit))
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1432
\end{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1433
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1434
Theory data for implicit simpsets has to be set up explicitly.  The
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1435
simplifier already provides an appropriate data kind definition
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1436
record.  This has to be installed into the base theory of any new
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1437
object-logic as \ttindexbold{thy_data} within the \texttt{ML} section.
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1438
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1439
This is done at the end of \texttt{IFOL.thy} as follows:
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1440
\begin{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1441
ML val thy_data = [Simplifier.simpset_thy_data];
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1442
\end{ttbox}
a2b726277050 major update;
wenzelm
parents: 4317
diff changeset
  1443
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
  1444
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
  1445
\index{simplification|)}