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