doc-src/Intro/getting.tex
author wenzelm
Mon, 28 Aug 2000 13:52:38 +0200
changeset 9695 ec7d7f877712
parent 5205 602354039306
child 14148 6580d374a509
permissions -rw-r--r--
proper setup of iman.sty/extra.sty/ttbox.sty;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
     1
%% $Id$
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
     2
\part{Getting Started with Isabelle}\label{chap:getting}
3103
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
     3
Let us consider how to perform simple proofs using Isabelle.  At
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
     4
present, Isabelle's user interface is \ML.  Proofs are conducted by
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
     5
applying certain \ML{} functions, which update a stored proof state.
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
     6
Basically, all syntax must be expressed using plain {\sc ascii}
3485
f27a30a18a17 Now there are TWO spaces after each full stop, so that the Emacs sentence
paulson
parents: 3199
diff changeset
     7
characters.  There are also mechanisms built into Isabelle that support
3103
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
     8
alternative syntaxes, for example using mathematical symbols from a
3485
f27a30a18a17 Now there are TWO spaces after each full stop, so that the Emacs sentence
paulson
parents: 3199
diff changeset
     9
special screen font.  The meta-logic and major object-logics already
3103
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
    10
provide such fancy output as an option.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    11
3103
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
    12
Object-logics are built upon Pure Isabelle, which implements the
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
    13
meta-logic and provides certain fundamental data structures: types,
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
    14
terms, signatures, theorems and theories, tactics and tacticals.
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
    15
These data structures have the corresponding \ML{} types \texttt{typ},
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
    16
\texttt{term}, \texttt{Sign.sg}, \texttt{thm}, \texttt{theory} and \texttt{tactic};
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
    17
tacticals have function types such as \texttt{tactic->tactic}.  Isabelle
3103
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
    18
users can operate on these data structures by writing \ML{} programs.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    19
4802
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
    20
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
    21
\section{Forward proof}\label{sec:forward} \index{forward proof|(}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    22
This section describes the concrete syntax for types, terms and theorems,
4802
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
    23
and demonstrates forward proof.  The examples are set in first-order logic.
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
    24
The command to start Isabelle running first-order logic is
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
    25
\begin{ttbox}
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
    26
isabelle FOL
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
    27
\end{ttbox}
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
    28
Note that just typing \texttt{isabelle} usually brings up higher-order logic
9695
ec7d7f877712 proper setup of iman.sty/extra.sty/ttbox.sty;
wenzelm
parents: 5205
diff changeset
    29
(HOL) by default.
4802
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
    30
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    31
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    32
\subsection{Lexical matters}
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
    33
\index{identifiers}\index{reserved words} 
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    34
An {\bf identifier} is a string of letters, digits, underscores~(\verb|_|)
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    35
and single quotes~({\tt'}), beginning with a letter.  Single quotes are
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
    36
regarded as primes; for instance \texttt{x'} is read as~$x'$.  Identifiers are
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    37
separated by white space and special characters.  {\bf Reserved words} are
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    38
identifiers that appear in Isabelle syntax definitions.
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    39
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    40
An Isabelle theory can declare symbols composed of special characters, such
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    41
as {\tt=}, {\tt==}, {\tt=>} and {\tt==>}.  (The latter three are part of
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    42
the syntax of the meta-logic.)  Such symbols may be run together; thus if
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    43
\verb|}| and \verb|{| are used for set brackets then \verb|{{a},{a,b}}| is
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    44
valid notation for a set of sets --- but only if \verb|}}| and \verb|{{|
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    45
have not been declared as symbols!  The parser resolves any ambiguity by
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    46
taking the longest possible symbol that has been declared.  Thus the string
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    47
{\tt==>} is read as a single symbol.  But \hbox{\tt= =>} is read as two
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
    48
symbols.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    49
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    50
Identifiers that are not reserved words may serve as free variables or
331
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
    51
constants.  A {\bf type identifier} consists of an identifier prefixed by a
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
    52
prime, for example {\tt'a} and \hbox{\tt'hello}.  Type identifiers stand
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
    53
for (free) type variables, which remain fixed during a proof.
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
    54
\index{type identifiers}
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
    55
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
    56
An {\bf unknown}\index{unknowns} (or type unknown) consists of a question
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
    57
mark, an identifier (or type identifier), and a subscript.  The subscript,
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
    58
a non-negative integer,
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
    59
allows the renaming of unknowns prior to unification.%
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
    60
\footnote{The subscript may appear after the identifier, separated by a
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
    61
  dot; this prevents ambiguity when the identifier ends with a digit.  Thus
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
    62
  {\tt?z6.0} has identifier {\tt"z6"} and subscript~0, while {\tt?a0.5}
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
    63
  has identifier {\tt"a0"} and subscript~5.  If the identifier does not
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
    64
  end with a digit, then no dot appears and a subscript of~0 is omitted;
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
    65
  for example, {\tt?hello} has identifier {\tt"hello"} and subscript
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
    66
  zero, while {\tt?z6} has identifier {\tt"z"} and subscript~6.  The same
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
    67
  conventions apply to type unknowns.  The question mark is {\it not\/}
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
    68
  part of the identifier!}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    69
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    70
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    71
\subsection{Syntax of types and terms}
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
    72
\index{classes!built-in|bold}\index{syntax!of types and terms}
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
    73
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
    74
Classes are denoted by identifiers; the built-in class \cldx{logic}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    75
contains the `logical' types.  Sorts are lists of classes enclosed in
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
    76
braces~\} and \{; singleton sorts may be abbreviated by dropping the braces.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    77
3103
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
    78
\index{types!syntax of|bold}\index{sort constraints} Types are written
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
    79
with a syntax like \ML's.  The built-in type \tydx{prop} is the type
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
    80
of propositions.  Type variables can be constrained to particular
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
    81
classes or sorts, for example \texttt{'a::term} and \texttt{?'b::\ttlbrace
3103
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
    82
  ord, arith\ttrbrace}.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    83
\[\dquotes
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
    84
\index{*:: symbol}\index{*=> symbol}
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
    85
\index{{}@{\tt\ttlbrace} symbol}\index{{}@{\tt\ttrbrace} symbol}
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
    86
\index{*[ symbol}\index{*] symbol}
4802
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
    87
\begin{array}{ll}
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
    88
    \multicolumn{2}{c}{\hbox{ASCII Notation for Types}} \\ \hline
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
    89
  \alpha "::" C              & \hbox{class constraint} \\
3103
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
    90
  \alpha "::" "\ttlbrace" C@1 "," \ldots "," C@n "\ttrbrace" &
4802
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
    91
        \hbox{sort constraint} \\
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
    92
  \sigma " => " \tau        & \hbox{function type } \sigma\To\tau \\
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
    93
  "[" \sigma@1 "," \ldots "," \sigma@n "] => " \tau 
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
    94
       & \hbox{$n$-argument function type} \\
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
    95
  "(" \tau@1"," \ldots "," \tau@n ")" tycon & \hbox{type construction}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    96
\end{array} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    97
\]
216d6ed87399 Initial revision
lcp
parents:
diff changeset
    98
Terms are those of the typed $\lambda$-calculus.
331
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
    99
\index{terms!syntax of|bold}\index{type constraints}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   100
\[\dquotes
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   101
\index{%@{\tt\%} symbol}\index{lambda abs@$\lambda$-abstractions}
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   102
\index{*:: symbol}
4802
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
   103
\begin{array}{ll}
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
   104
    \multicolumn{2}{c}{\hbox{ASCII Notation for Terms}} \\ \hline
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
   105
  t "::" \sigma         & \hbox{type constraint} \\
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
   106
  "\%" x "." t          & \hbox{abstraction } \lambda x.t \\
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
   107
  "\%" x@1\ldots x@n "." t  & \hbox{abstraction over several arguments} \\
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
   108
  t "(" u@1"," \ldots "," u@n ")" &
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
   109
     \hbox{application to several arguments (FOL and ZF)} \\
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
   110
  t\; u@1 \ldots\; u@n & \hbox{application to several arguments (HOL)}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   111
\end{array}  
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   112
\]
9695
ec7d7f877712 proper setup of iman.sty/extra.sty/ttbox.sty;
wenzelm
parents: 5205
diff changeset
   113
Note that HOL uses its traditional ``higher-order'' syntax for application,
ec7d7f877712 proper setup of iman.sty/extra.sty/ttbox.sty;
wenzelm
parents: 5205
diff changeset
   114
which differs from that used in FOL.
4802
c15f46833f7a Simplified the syntax description; mentioned FOL vs HOL
paulson
parents: 4244
diff changeset
   115
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   116
The theorems and rules of an object-logic are represented by theorems in
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   117
the meta-logic, which are expressed using meta-formulae.  Since the
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   118
meta-logic is higher-order, meta-formulae~$\phi$, $\psi$, $\theta$,~\ldots{}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   119
are just terms of type~\texttt{prop}.  
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   120
\index{meta-implication}
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   121
\index{meta-quantifiers}\index{meta-equality}
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   122
\index{*"!"! symbol}\index{*"["| symbol}\index{*"|"] symbol}
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   123
\index{*== symbol}\index{*=?= symbol}\index{*==> symbol}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   124
\[\dquotes
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   125
  \begin{array}{l@{\quad}l@{\quad}l}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   126
    \multicolumn{3}{c}{\hbox{ASCII Notation for Meta-Formulae}} \\ \hline
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   127
  a " == " b    & a\equiv b &   \hbox{meta-equality} \\
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   128
  a " =?= " b   & a\qeq b &     \hbox{flex-flex constraint} \\
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   129
  \phi " ==> " \psi & \phi\Imp \psi & \hbox{meta-implication} \\
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   130
  "[|" \phi@1 ";" \ldots ";" \phi@n "|] ==> " \psi & 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   131
  \List{\phi@1;\ldots;\phi@n} \Imp \psi & \hbox{nested implication} \\
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   132
  "!!" x "." \phi & \Forall x.\phi & \hbox{meta-quantification} \\
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   133
  "!!" x@1\ldots x@n "." \phi & 
3103
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
   134
  \Forall x@1. \ldots x@n.\phi & \hbox{nested quantification}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   135
  \end{array}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   136
\]
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   137
Flex-flex constraints are meta-equalities arising from unification; they
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   138
require special treatment.  See~\S\ref{flexflex}.
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   139
\index{flex-flex constraints}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   140
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   141
\index{*Trueprop constant}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   142
Most logics define the implicit coercion $Trueprop$ from object-formulae to
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   143
propositions.  This could cause an ambiguity: in $P\Imp Q$, do the
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   144
variables $P$ and $Q$ stand for meta-formulae or object-formulae?  If the
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   145
latter, $P\Imp Q$ really abbreviates $Trueprop(P)\Imp Trueprop(Q)$.  To
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   146
prevent such ambiguities, Isabelle's syntax does not allow a meta-formula
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   147
to consist of a variable.  Variables of type~\tydx{prop} are seldom
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   148
useful, but you can make a variable stand for a meta-formula by prefixing
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   149
it with the symbol \texttt{PROP}:\index{*PROP symbol}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   150
\begin{ttbox} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   151
PROP ?psi ==> PROP ?theta 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   152
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   153
3103
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
   154
Symbols of object-logics are typically rendered into {\sc ascii} as
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
   155
follows:
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   156
\[ \begin{tabular}{l@{\quad}l@{\quad}l}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   157
      \tt True          & $\top$        & true \\
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   158
      \tt False         & $\bot$        & false \\
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   159
      \tt $P$ \& $Q$    & $P\conj Q$    & conjunction \\
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   160
      \tt $P$ | $Q$     & $P\disj Q$    & disjunction \\
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   161
      \verb'~' $P$      & $\neg P$      & negation \\
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   162
      \tt $P$ --> $Q$   & $P\imp Q$     & implication \\
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   163
      \tt $P$ <-> $Q$   & $P\bimp Q$    & bi-implication \\
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   164
      \tt ALL $x\,y\,z$ .\ $P$  & $\forall x\,y\,z.P$   & for all \\
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   165
      \tt EX  $x\,y\,z$ .\ $P$  & $\exists x\,y\,z.P$   & there exists
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   166
   \end{tabular}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   167
\]
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   168
To illustrate the notation, consider two axioms for first-order logic:
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   169
$$ \List{P; Q} \Imp P\conj Q                 \eqno(\conj I) $$
3103
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
   170
$$ \List{\exists x.P(x); \Forall x. P(x)\imp Q} \Imp Q \eqno(\exists E) $$
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
   171
$({\conj}I)$ translates into {\sc ascii} characters as
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   172
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   173
[| ?P; ?Q |] ==> ?P & ?Q
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   174
\end{ttbox}
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   175
The schematic variables let unification instantiate the rule.  To avoid
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   176
cluttering logic definitions with question marks, Isabelle converts any
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   177
free variables in a rule to schematic variables; we normally declare
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   178
$({\conj}I)$ as
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   179
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   180
[| P; Q |] ==> P & Q
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   181
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   182
This variables convention agrees with the treatment of variables in goals.
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   183
Free variables in a goal remain fixed throughout the proof.  After the
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   184
proof is finished, Isabelle converts them to scheme variables in the
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   185
resulting theorem.  Scheme variables in a goal may be replaced by terms
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   186
during the proof, supporting answer extraction, program synthesis, and so
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   187
forth.
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   188
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   189
For a final example, the rule $(\exists E)$ is rendered in {\sc ascii} as
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   190
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   191
[| EX x.P(x);  !!x. P(x) ==> Q |] ==> Q
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   192
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   193
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   194
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   195
\subsection{Basic operations on theorems}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   196
\index{theorems!basic operations on|bold}
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   197
\index{LCF system}
331
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   198
Meta-level theorems have the \ML{} type \mltydx{thm}.  They represent the
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   199
theorems and inference rules of object-logics.  Isabelle's meta-logic is
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   200
implemented using the {\sc lcf} approach: each meta-level inference rule is
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   201
represented by a function from theorems to theorems.  Object-level rules
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   202
are taken as axioms.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   203
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   204
The main theorem printing commands are \texttt{prth}, \texttt{prths} and~{\tt
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   205
  prthq}.  Of the other operations on theorems, most useful are \texttt{RS}
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   206
and \texttt{RSN}, which perform resolution.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   207
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   208
\index{theorems!printing of}
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   209
\begin{ttdescription}
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   210
\item[\ttindex{prth} {\it thm};]
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   211
  pretty-prints {\it thm\/} at the terminal.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   212
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   213
\item[\ttindex{prths} {\it thms};]
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   214
  pretty-prints {\it thms}, a list of theorems.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   215
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   216
\item[\ttindex{prthq} {\it thmq};]
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   217
  pretty-prints {\it thmq}, a sequence of theorems; this is useful for
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   218
  inspecting the output of a tactic.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   219
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   220
\item[$thm1$ RS $thm2$] \index{*RS} 
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   221
  resolves the conclusion of $thm1$ with the first premise of~$thm2$.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   222
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   223
\item[$thm1$ RSN $(i,thm2)$] \index{*RSN} 
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   224
  resolves the conclusion of $thm1$ with the $i$th premise of~$thm2$.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   225
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   226
\item[\ttindex{standard} $thm$]  
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   227
  puts $thm$ into a standard format.  It also renames schematic variables
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   228
  to have subscript zero, improving readability and reducing subscript
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   229
  growth.
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   230
\end{ttdescription}
9695
ec7d7f877712 proper setup of iman.sty/extra.sty/ttbox.sty;
wenzelm
parents: 5205
diff changeset
   231
The rules of a theory are normally bound to \ML\ identifiers.  Suppose we are
ec7d7f877712 proper setup of iman.sty/extra.sty/ttbox.sty;
wenzelm
parents: 5205
diff changeset
   232
running an Isabelle session containing theory~FOL, natural deduction
ec7d7f877712 proper setup of iman.sty/extra.sty/ttbox.sty;
wenzelm
parents: 5205
diff changeset
   233
first-order logic.\footnote{For a listing of the FOL rules and their \ML{}
ec7d7f877712 proper setup of iman.sty/extra.sty/ttbox.sty;
wenzelm
parents: 5205
diff changeset
   234
  names, turn to
331
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   235
\iflabelundefined{fol-rules}{{\em Isabelle's Object-Logics}}%
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   236
           {page~\pageref{fol-rules}}.}
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   237
Let us try an example given in~\S\ref{joining}.  We
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   238
first print \tdx{mp}, which is the rule~$({\imp}E)$, then resolve it with
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   239
itself.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   240
\begin{ttbox} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   241
prth mp; 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   242
{\out [| ?P --> ?Q; ?P |] ==> ?Q}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   243
{\out val it = "[| ?P --> ?Q; ?P |] ==> ?Q" : thm}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   244
prth (mp RS mp);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   245
{\out [| ?P1 --> ?P --> ?Q; ?P1; ?P |] ==> ?Q}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   246
{\out val it = "[| ?P1 --> ?P --> ?Q; ?P1; ?P |] ==> ?Q" : thm}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   247
\end{ttbox}
331
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   248
User input appears in {\footnotesize\tt typewriter characters}, and output
4244
f50dace8be9f New, higher-level definition of \\out macro
paulson
parents: 3485
diff changeset
   249
appears in{\out slanted typewriter characters}.  \ML's response {\out val
331
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   250
  }~\ldots{} is compiler-dependent and will sometimes be suppressed.  This
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   251
session illustrates two formats for the display of theorems.  Isabelle's
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   252
top-level displays theorems as \ML{} values, enclosed in quotes.  Printing
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   253
commands like \texttt{prth} omit the quotes and the surrounding \texttt{val
331
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   254
  \ldots :\ thm}.  Ignoring their side-effects, the commands are identity
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   255
functions.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   256
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   257
To contrast \texttt{RS} with \texttt{RSN}, we resolve
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   258
\tdx{conjunct1}, which stands for~$(\conj E1)$, with~\tdx{mp}.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   259
\begin{ttbox} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   260
conjunct1 RS mp;
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   261
{\out val it = "[| (?P --> ?Q) & ?Q1; ?P |] ==> ?Q" : thm}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   262
conjunct1 RSN (2,mp);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   263
{\out val it = "[| ?P --> ?Q; ?P & ?Q1 |] ==> ?Q" : thm}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   264
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   265
These correspond to the following proofs:
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   266
\[ \infer[({\imp}E)]{Q}{\infer[({\conj}E1)]{P\imp Q}{(P\imp Q)\conj Q@1} & P}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   267
   \qquad
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   268
   \infer[({\imp}E)]{Q}{P\imp Q & \infer[({\conj}E1)]{P}{P\conj Q@1}} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   269
\]
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   270
%
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   271
Rules can be derived by pasting other rules together.  Let us join
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   272
\tdx{spec}, which stands for~$(\forall E)$, with \texttt{mp} and {\tt
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   273
  conjunct1}.  In \ML{}, the identifier~\texttt{it} denotes the value just
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   274
printed.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   275
\begin{ttbox} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   276
spec;
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   277
{\out val it = "ALL x. ?P(x) ==> ?P(?x)" : thm}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   278
it RS mp;
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   279
{\out val it = "[| ALL x. ?P3(x) --> ?Q2(x); ?P3(?x1) |] ==>}
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   280
{\out           ?Q2(?x1)" : thm}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   281
it RS conjunct1;
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   282
{\out val it = "[| ALL x. ?P4(x) --> ?P6(x) & ?Q5(x); ?P4(?x2) |] ==>}
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   283
{\out           ?P6(?x2)" : thm}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   284
standard it;
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   285
{\out val it = "[| ALL x. ?P(x) --> ?Pa(x) & ?Q(x); ?P(?x) |] ==>}
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   286
{\out           ?Pa(?x)" : thm}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   287
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   288
By resolving $(\forall E)$ with (${\imp}E)$ and (${\conj}E1)$, we have
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   289
derived a destruction rule for formulae of the form $\forall x.
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   290
P(x)\imp(Q(x)\conj R(x))$.  Used with destruct-resolution, such specialized
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   291
rules provide a way of referring to particular assumptions.
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   292
\index{assumptions!use of}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   293
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   294
\subsection{*Flex-flex constraints} \label{flexflex}
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   295
\index{flex-flex constraints|bold}\index{unknowns!function}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   296
In higher-order unification, {\bf flex-flex} equations are those where both
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   297
sides begin with a function unknown, such as $\Var{f}(0)\qeq\Var{g}(0)$.
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   298
They admit a trivial unifier, here $\Var{f}\equiv \lambda x.\Var{a}$ and
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   299
$\Var{g}\equiv \lambda y.\Var{a}$, where $\Var{a}$ is a new unknown.  They
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   300
admit many other unifiers, such as $\Var{f} \equiv \lambda x.\Var{g}(0)$
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   301
and $\{\Var{f} \equiv \lambda x.x,\, \Var{g} \equiv \lambda x.0\}$.  Huet's
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   302
procedure does not enumerate the unifiers; instead, it retains flex-flex
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   303
equations as constraints on future unifications.  Flex-flex constraints
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   304
occasionally become attached to a proof state; more frequently, they appear
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   305
during use of \texttt{RS} and~\texttt{RSN}:
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   306
\begin{ttbox} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   307
refl;
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   308
{\out val it = "?a = ?a" : thm}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   309
exI;
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   310
{\out val it = "?P(?x) ==> EX x. ?P(x)" : thm}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   311
refl RS exI;
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   312
{\out val it = "?a3(?x) =?= ?a2(?x) ==> EX x. ?a3(x) = ?a2(x)" : thm}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   313
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   314
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   315
\noindent
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   316
Renaming variables, this is $\exists x.\Var{f}(x)=\Var{g}(x)$ with
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   317
the constraint ${\Var{f}(\Var{u})\qeq\Var{g}(\Var{u})}$.  Instances
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   318
satisfying the constraint include $\exists x.\Var{f}(x)=\Var{f}(x)$ and
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   319
$\exists x.x=\Var{u}$.  Calling \ttindex{flexflex_rule} removes all
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   320
constraints by applying the trivial unifier:\index{*prthq}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   321
\begin{ttbox} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   322
prthq (flexflex_rule it);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   323
{\out EX x. ?a4 = ?a4}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   324
\end{ttbox} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   325
Isabelle simplifies flex-flex equations to eliminate redundant bound
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   326
variables.  In $\lambda x\,y.\Var{f}(k(y),x) \qeq \lambda x\,y.\Var{g}(y)$,
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   327
there is no bound occurrence of~$x$ on the right side; thus, there will be
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   328
none on the left in a common instance of these terms.  Choosing a new
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   329
variable~$\Var{h}$, Isabelle assigns $\Var{f}\equiv \lambda u\,v.?h(u)$,
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   330
simplifying the left side to $\lambda x\,y.\Var{h}(k(y))$.  Dropping $x$
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   331
from the equation leaves $\lambda y.\Var{h}(k(y)) \qeq \lambda
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   332
y.\Var{g}(y)$.  By $\eta$-conversion, this simplifies to the assignment
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   333
$\Var{g}\equiv\lambda y.?h(k(y))$.
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   334
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   335
\begin{warn}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   336
\ttindex{RS} and \ttindex{RSN} fail (by raising exception \texttt{THM}) unless
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   337
the resolution delivers {\bf exactly one} resolvent.  For multiple results,
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   338
use \ttindex{RL} and \ttindex{RLN}, which operate on theorem lists.  The
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   339
following example uses \ttindex{read_instantiate} to create an instance
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   340
of \tdx{refl} containing no schematic variables.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   341
\begin{ttbox} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   342
val reflk = read_instantiate [("a","k")] refl;
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   343
{\out val reflk = "k = k" : thm}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   344
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   345
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   346
\noindent
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   347
A flex-flex constraint is no longer possible; resolution does not find a
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   348
unique unifier:
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   349
\begin{ttbox} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   350
reflk RS exI;
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   351
{\out uncaught exception THM}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   352
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   353
Using \ttindex{RL} this time, we discover that there are four unifiers, and
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   354
four resolvents:
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   355
\begin{ttbox} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   356
[reflk] RL [exI];
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   357
{\out val it = ["EX x. x = x", "EX x. k = x",}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   358
{\out           "EX x. x = k", "EX x. k = k"] : thm list}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   359
\end{ttbox} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   360
\end{warn}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   361
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   362
\index{forward proof|)}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   363
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   364
\section{Backward proof}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   365
Although \texttt{RS} and \texttt{RSN} are fine for simple forward reasoning,
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   366
large proofs require tactics.  Isabelle provides a suite of commands for
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   367
conducting a backward proof using tactics.
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   368
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   369
\subsection{The basic tactics}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   370
The tactics \texttt{assume_tac}, {\tt
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   371
resolve_tac}, \texttt{eresolve_tac}, and \texttt{dresolve_tac} suffice for most
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   372
single-step proofs.  Although \texttt{eresolve_tac} and \texttt{dresolve_tac} are
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   373
not strictly necessary, they simplify proofs involving elimination and
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   374
destruction rules.  All the tactics act on a subgoal designated by a
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   375
positive integer~$i$, failing if~$i$ is out of range.  The resolution
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   376
tactics try their list of theorems in left-to-right order.
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   377
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   378
\begin{ttdescription}
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   379
\item[\ttindex{assume_tac} {\it i}] \index{tactics!assumption}
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   380
  is the tactic that attempts to solve subgoal~$i$ by assumption.  Proof by
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   381
  assumption is not a trivial step; it can falsify other subgoals by
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   382
  instantiating shared variables.  There may be several ways of solving the
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   383
  subgoal by assumption.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   384
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   385
\item[\ttindex{resolve_tac} {\it thms} {\it i}]\index{tactics!resolution}
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   386
  is the basic resolution tactic, used for most proof steps.  The $thms$
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   387
  represent object-rules, which are resolved against subgoal~$i$ of the
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   388
  proof state.  For each rule, resolution forms next states by unifying the
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   389
  conclusion with the subgoal and inserting instantiated premises in its
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   390
  place.  A rule can admit many higher-order unifiers.  The tactic fails if
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   391
  none of the rules generates next states.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   392
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   393
\item[\ttindex{eresolve_tac} {\it thms} {\it i}] \index{elim-resolution}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   394
  performs elim-resolution.  Like \texttt{resolve_tac~{\it thms}~{\it i\/}}
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   395
  followed by \texttt{assume_tac~{\it i}}, it applies a rule then solves its
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   396
  first premise by assumption.  But \texttt{eresolve_tac} additionally deletes
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   397
  that assumption from any subgoals arising from the resolution.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   398
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   399
\item[\ttindex{dresolve_tac} {\it thms} {\it i}]
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   400
  \index{forward proof}\index{destruct-resolution}
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   401
  performs destruct-resolution with the~$thms$, as described
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   402
  in~\S\ref{destruct}.  It is useful for forward reasoning from the
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   403
  assumptions.
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   404
\end{ttdescription}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   405
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   406
\subsection{Commands for backward proof}
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   407
\index{proofs!commands for}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   408
Tactics are normally applied using the subgoal module, which maintains a
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   409
proof state and manages the proof construction.  It allows interactive
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   410
backtracking through the proof space, going away to prove lemmas, etc.; of
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   411
its many commands, most important are the following:
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   412
\begin{ttdescription}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   413
\item[\ttindex{Goal} {\it formula}; ] 
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   414
begins a new proof, where $theory$ is usually an \ML\ identifier
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   415
and the {\it formula\/} is written as an \ML\ string.
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   416
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   417
\item[\ttindex{by} {\it tactic}; ] 
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   418
applies the {\it tactic\/} to the current proof
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   419
state, raising an exception if the tactic fails.
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   420
3103
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
   421
\item[\ttindex{undo}(); ]
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   422
  reverts to the previous proof state.  Undo can be repeated but cannot be
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   423
  undone.  Do not omit the parentheses; typing {\tt\ \ undo;\ \ } merely
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   424
  causes \ML\ to echo the value of that function.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   425
3103
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
   426
\item[\ttindex{result}();]
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   427
returns the theorem just proved, in a standard format.  It fails if
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   428
unproved subgoals are left, etc.
3103
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
   429
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
   430
\item[\ttindex{qed} {\it name};] is the usual way of ending a proof.
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   431
  It gets the theorem using \texttt{result}, stores it in Isabelle's
3103
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
   432
  theorem database and binds it to an \ML{} identifier.
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
   433
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   434
\end{ttdescription}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   435
The commands and tactics given above are cumbersome for interactive use.
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   436
Although our examples will use the full commands, you may prefer Isabelle's
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   437
shortcuts:
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   438
\begin{center} \tt
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   439
\index{*br} \index{*be} \index{*bd} \index{*ba}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   440
\begin{tabular}{l@{\qquad\rm abbreviates\qquad}l}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   441
    ba {\it i};           & by (assume_tac {\it i}); \\
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   442
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   443
    br {\it thm} {\it i}; & by (resolve_tac [{\it thm}] {\it i}); \\
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   444
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   445
    be {\it thm} {\it i}; & by (eresolve_tac [{\it thm}] {\it i}); \\
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   446
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   447
    bd {\it thm} {\it i}; & by (dresolve_tac [{\it thm}] {\it i}); 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   448
\end{tabular}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   449
\end{center}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   450
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   451
\subsection{A trivial example in propositional logic}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   452
\index{examples!propositional}
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   453
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   454
Directory \texttt{FOL} of the Isabelle distribution defines the theory of
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   455
first-order logic.  Let us try the example from \S\ref{prop-proof},
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   456
entering the goal $P\disj P\imp P$ in that theory.\footnote{To run these
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   457
  examples, see the file \texttt{FOL/ex/intro.ML}.}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   458
\begin{ttbox}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   459
Goal "P|P --> P"; 
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   460
{\out Level 0} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   461
{\out P | P --> P} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   462
{\out 1. P | P --> P} 
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   463
\end{ttbox}\index{level of a proof}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   464
Isabelle responds by printing the initial proof state, which has $P\disj
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   465
P\imp P$ as the main goal and the only subgoal.  The {\bf level} of the
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   466
state is the number of \texttt{by} commands that have been applied to reach
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   467
it.  We now use \ttindex{resolve_tac} to apply the rule \tdx{impI},
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   468
or~$({\imp}I)$, to subgoal~1:
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   469
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   470
by (resolve_tac [impI] 1); 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   471
{\out Level 1} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   472
{\out P | P --> P} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   473
{\out 1. P | P ==> P}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   474
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   475
In the new proof state, subgoal~1 is $P$ under the assumption $P\disj P$.
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   476
(The meta-implication {\tt==>} indicates assumptions.)  We apply
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   477
\tdx{disjE}, or~(${\disj}E)$, to that subgoal:
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   478
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   479
by (resolve_tac [disjE] 1); 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   480
{\out Level 2} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   481
{\out P | P --> P} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   482
{\out 1. P | P ==> ?P1 | ?Q1} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   483
{\out 2. [| P | P; ?P1 |] ==> P} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   484
{\out 3. [| P | P; ?Q1 |] ==> P}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   485
\end{ttbox}
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   486
At Level~2 there are three subgoals, each provable by assumption.  We
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   487
deviate from~\S\ref{prop-proof} by tackling subgoal~3 first, using
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   488
\ttindex{assume_tac}.  This affects subgoal~1, updating {\tt?Q1} to~{\tt
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   489
  P}.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   490
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   491
by (assume_tac 3); 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   492
{\out Level 3} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   493
{\out P | P --> P} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   494
{\out 1. P | P ==> ?P1 | P} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   495
{\out 2. [| P | P; ?P1 |] ==> P}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   496
\end{ttbox}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   497
Next we tackle subgoal~2, instantiating {\tt?P1} to~\texttt{P} in subgoal~1.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   498
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   499
by (assume_tac 2); 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   500
{\out Level 4} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   501
{\out P | P --> P} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   502
{\out 1. P | P ==> P | P}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   503
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   504
Lastly we prove the remaining subgoal by assumption:
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   505
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   506
by (assume_tac 1); 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   507
{\out Level 5} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   508
{\out P | P --> P} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   509
{\out No subgoals!}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   510
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   511
Isabelle tells us that there are no longer any subgoals: the proof is
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   512
complete.  Calling \texttt{qed} stores the theorem.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   513
\begin{ttbox}
3103
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
   514
qed "mythm";
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   515
{\out val mythm = "?P | ?P --> ?P" : thm} 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   516
\end{ttbox}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   517
Isabelle has replaced the free variable~\texttt{P} by the scheme
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   518
variable~{\tt?P}\@.  Free variables in the proof state remain fixed
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   519
throughout the proof.  Isabelle finally converts them to scheme variables
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   520
so that the resulting theorem can be instantiated with any formula.
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   521
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   522
As an exercise, try doing the proof as in \S\ref{prop-proof}, observing how
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   523
instantiations affect the proof state.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   524
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   525
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   526
\subsection{Part of a distributive law}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   527
\index{examples!propositional}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   528
To demonstrate the tactics \ttindex{eresolve_tac}, \ttindex{dresolve_tac}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   529
and the tactical \texttt{REPEAT}, let us prove part of the distributive
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   530
law 
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   531
\[ (P\conj Q)\disj R \,\bimp\, (P\disj R)\conj (Q\disj R). \]
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   532
We begin by stating the goal to Isabelle and applying~$({\imp}I)$ to it:
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   533
\begin{ttbox}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   534
Goal "(P & Q) | R  --> (P | R)";
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   535
{\out Level 0}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   536
{\out P & Q | R --> P | R}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   537
{\out  1. P & Q | R --> P | R}
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   538
\ttbreak
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   539
by (resolve_tac [impI] 1);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   540
{\out Level 1}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   541
{\out P & Q | R --> P | R}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   542
{\out  1. P & Q | R ==> P | R}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   543
\end{ttbox}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   544
Previously we applied~(${\disj}E)$ using \texttt{resolve_tac}, but 
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   545
\ttindex{eresolve_tac} deletes the assumption after use.  The resulting proof
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   546
state is simpler.
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   547
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   548
by (eresolve_tac [disjE] 1);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   549
{\out Level 2}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   550
{\out P & Q | R --> P | R}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   551
{\out  1. P & Q ==> P | R}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   552
{\out  2. R ==> P | R}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   553
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   554
Using \ttindex{dresolve_tac}, we can apply~(${\conj}E1)$ to subgoal~1,
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   555
replacing the assumption $P\conj Q$ by~$P$.  Normally we should apply the
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   556
rule~(${\conj}E)$, given in~\S\ref{destruct}.  That is an elimination rule
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   557
and requires \texttt{eresolve_tac}; it would replace $P\conj Q$ by the two
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   558
assumptions~$P$ and~$Q$.  Because the present example does not need~$Q$, we
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   559
may try out \texttt{dresolve_tac}.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   560
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   561
by (dresolve_tac [conjunct1] 1);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   562
{\out Level 3}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   563
{\out P & Q | R --> P | R}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   564
{\out  1. P ==> P | R}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   565
{\out  2. R ==> P | R}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   566
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   567
The next two steps apply~(${\disj}I1$) and~(${\disj}I2$) in an obvious manner.
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   568
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   569
by (resolve_tac [disjI1] 1);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   570
{\out Level 4}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   571
{\out P & Q | R --> P | R}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   572
{\out  1. P ==> P}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   573
{\out  2. R ==> P | R}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   574
\ttbreak
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   575
by (resolve_tac [disjI2] 2);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   576
{\out Level 5}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   577
{\out P & Q | R --> P | R}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   578
{\out  1. P ==> P}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   579
{\out  2. R ==> R}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   580
\end{ttbox}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   581
Two calls of \texttt{assume_tac} can finish the proof.  The
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   582
tactical~\ttindex{REPEAT} here expresses a tactic that calls \texttt{assume_tac~1}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   583
as many times as possible.  We can restrict attention to subgoal~1 because
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   584
the other subgoals move up after subgoal~1 disappears.
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   585
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   586
by (REPEAT (assume_tac 1));
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   587
{\out Level 6}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   588
{\out P & Q | R --> P | R}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   589
{\out No subgoals!}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   590
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   591
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   592
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   593
\section{Quantifier reasoning}
331
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   594
\index{quantifiers}\index{parameters}\index{unknowns}\index{unknowns!function}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   595
This section illustrates how Isabelle enforces quantifier provisos.
331
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   596
Suppose that $x$, $y$ and~$z$ are parameters of a subgoal.  Quantifier
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   597
rules create terms such as~$\Var{f}(x,z)$, where~$\Var{f}$ is a function
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   598
unknown.  Instantiating $\Var{f}$ to $\lambda x\,z.t$ has the effect of
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   599
replacing~$\Var{f}(x,z)$ by~$t$, where the term~$t$ may contain free
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   600
occurrences of~$x$ and~$z$.  On the other hand, no instantiation
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   601
of~$\Var{f}$ can replace~$\Var{f}(x,z)$ by a term containing free
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   602
occurrences of~$y$, since parameters are bound variables.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   603
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   604
\subsection{Two quantifier proofs: a success and a failure}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   605
\index{examples!with quantifiers}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   606
Let us contrast a proof of the theorem $\forall x.\exists y.x=y$ with an
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   607
attempted proof of the non-theorem $\exists y.\forall x.x=y$.  The former
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   608
proof succeeds, and the latter fails, because of the scope of quantified
1878
ac8e534b4834 Updated BibTeX identifiers
paulson
parents: 331
diff changeset
   609
variables~\cite{paulson-found}.  Unification helps even in these trivial
3485
f27a30a18a17 Now there are TWO spaces after each full stop, so that the Emacs sentence
paulson
parents: 3199
diff changeset
   610
proofs.  In $\forall x.\exists y.x=y$ the $y$ that `exists' is simply $x$,
f27a30a18a17 Now there are TWO spaces after each full stop, so that the Emacs sentence
paulson
parents: 3199
diff changeset
   611
but we need never say so.  This choice is forced by the reflexive law for
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   612
equality, and happens automatically.
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   613
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   614
\paragraph{The successful proof.}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   615
The proof of $\forall x.\exists y.x=y$ demonstrates the introduction rules
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   616
$(\forall I)$ and~$(\exists I)$.  We state the goal and apply $(\forall I)$:
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   617
\begin{ttbox}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   618
Goal "ALL x. EX y. x=y";
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   619
{\out Level 0}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   620
{\out ALL x. EX y. x = y}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   621
{\out  1. ALL x. EX y. x = y}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   622
\ttbreak
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   623
by (resolve_tac [allI] 1);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   624
{\out Level 1}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   625
{\out ALL x. EX y. x = y}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   626
{\out  1. !!x. EX y. x = y}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   627
\end{ttbox}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   628
The variable~\texttt{x} is no longer universally quantified, but is a
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   629
parameter in the subgoal; thus, it is universally quantified at the
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   630
meta-level.  The subgoal must be proved for all possible values of~\texttt{x}.
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   631
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   632
To remove the existential quantifier, we apply the rule $(\exists I)$:
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   633
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   634
by (resolve_tac [exI] 1);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   635
{\out Level 2}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   636
{\out ALL x. EX y. x = y}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   637
{\out  1. !!x. x = ?y1(x)}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   638
\end{ttbox}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   639
The bound variable \texttt{y} has become {\tt?y1(x)}.  This term consists of
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   640
the function unknown~{\tt?y1} applied to the parameter~\texttt{x}.
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   641
Instances of {\tt?y1(x)} may or may not contain~\texttt{x}.  We resolve the
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   642
subgoal with the reflexivity axiom.
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   643
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   644
by (resolve_tac [refl] 1);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   645
{\out Level 3}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   646
{\out ALL x. EX y. x = y}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   647
{\out No subgoals!}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   648
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   649
Let us consider what has happened in detail.  The reflexivity axiom is
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   650
lifted over~$x$ to become $\Forall x.\Var{f}(x)=\Var{f}(x)$, which is
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   651
unified with $\Forall x.x=\Var{y@1}(x)$.  The function unknowns $\Var{f}$
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   652
and~$\Var{y@1}$ are both instantiated to the identity function, and
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   653
$x=\Var{y@1}(x)$ collapses to~$x=x$ by $\beta$-reduction.
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   654
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   655
\paragraph{The unsuccessful proof.}
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   656
We state the goal $\exists y.\forall x.x=y$, which is not a theorem, and
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   657
try~$(\exists I)$:
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   658
\begin{ttbox}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   659
Goal "EX y. ALL x. x=y";
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   660
{\out Level 0}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   661
{\out EX y. ALL x. x = y}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   662
{\out  1. EX y. ALL x. x = y}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   663
\ttbreak
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   664
by (resolve_tac [exI] 1);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   665
{\out Level 1}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   666
{\out EX y. ALL x. x = y}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   667
{\out  1. ALL x. x = ?y}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   668
\end{ttbox}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   669
The unknown \texttt{?y} may be replaced by any term, but this can never
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   670
introduce another bound occurrence of~\texttt{x}.  We now apply~$(\forall I)$:
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   671
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   672
by (resolve_tac [allI] 1);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   673
{\out Level 2}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   674
{\out EX y. ALL x. x = y}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   675
{\out  1. !!x. x = ?y}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   676
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   677
Compare our position with the previous Level~2.  Instead of {\tt?y1(x)} we
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   678
have~{\tt?y}, whose instances may not contain the bound variable~\texttt{x}.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   679
The reflexivity axiom does not unify with subgoal~1.
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   680
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   681
by (resolve_tac [refl] 1);
3103
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
   682
{\out by: tactic failed}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   683
\end{ttbox}
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   684
There can be no proof of $\exists y.\forall x.x=y$ by the soundness of
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   685
first-order logic.  I have elsewhere proved the faithfulness of Isabelle's
1878
ac8e534b4834 Updated BibTeX identifiers
paulson
parents: 331
diff changeset
   686
encoding of first-order logic~\cite{paulson-found}; there could, of course, be
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   687
faults in the implementation.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   688
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   689
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   690
\subsection{Nested quantifiers}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   691
\index{examples!with quantifiers}
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   692
Multiple quantifiers create complex terms.  Proving 
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   693
\[ (\forall x\,y.P(x,y)) \imp (\forall z\,w.P(w,z)) \] 
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   694
will demonstrate how parameters and unknowns develop.  If they appear in
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   695
the wrong order, the proof will fail.
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   696
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   697
This section concludes with a demonstration of \texttt{REPEAT}
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   698
and~\texttt{ORELSE}.  
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   699
\begin{ttbox}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   700
Goal "(ALL x y.P(x,y))  -->  (ALL z w.P(w,z))";
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   701
{\out Level 0}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   702
{\out (ALL x y. P(x,y)) --> (ALL z w. P(w,z))}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   703
{\out  1. (ALL x y. P(x,y)) --> (ALL z w. P(w,z))}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   704
\ttbreak
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   705
by (resolve_tac [impI] 1);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   706
{\out Level 1}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   707
{\out (ALL x y. P(x,y)) --> (ALL z w. P(w,z))}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   708
{\out  1. ALL x y. P(x,y) ==> ALL z w. P(w,z)}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   709
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   710
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   711
\paragraph{The wrong approach.}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   712
Using \texttt{dresolve_tac}, we apply the rule $(\forall E)$, bound to the
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   713
\ML\ identifier \tdx{spec}.  Then we apply $(\forall I)$.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   714
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   715
by (dresolve_tac [spec] 1);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   716
{\out Level 2}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   717
{\out (ALL x y. P(x,y)) --> (ALL z w. P(w,z))}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   718
{\out  1. ALL y. P(?x1,y) ==> ALL z w. P(w,z)}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   719
\ttbreak
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   720
by (resolve_tac [allI] 1);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   721
{\out Level 3}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   722
{\out (ALL x y. P(x,y)) --> (ALL z w. P(w,z))}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   723
{\out  1. !!z. ALL y. P(?x1,y) ==> ALL w. P(w,z)}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   724
\end{ttbox}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   725
The unknown \texttt{?x1} and the parameter \texttt{z} have appeared.  We again
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   726
apply $(\forall E)$ and~$(\forall I)$.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   727
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   728
by (dresolve_tac [spec] 1);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   729
{\out Level 4}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   730
{\out (ALL x y. P(x,y)) --> (ALL z w. P(w,z))}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   731
{\out  1. !!z. P(?x1,?y3(z)) ==> ALL w. P(w,z)}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   732
\ttbreak
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   733
by (resolve_tac [allI] 1);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   734
{\out Level 5}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   735
{\out (ALL x y. P(x,y)) --> (ALL z w. P(w,z))}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   736
{\out  1. !!z w. P(?x1,?y3(z)) ==> P(w,z)}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   737
\end{ttbox}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   738
The unknown \texttt{?y3} and the parameter \texttt{w} have appeared.  Each
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   739
unknown is applied to the parameters existing at the time of its creation;
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   740
instances of~\texttt{?x1} cannot contain~\texttt{z} or~\texttt{w}, while instances
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   741
of {\tt?y3(z)} can only contain~\texttt{z}.  Due to the restriction on~\texttt{?x1},
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   742
proof by assumption will fail.
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   743
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   744
by (assume_tac 1);
3103
98af809fee46 misc updates, tuning, cleanup;
wenzelm
parents: 1878
diff changeset
   745
{\out by: tactic failed}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   746
{\out uncaught exception ERROR}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   747
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   748
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   749
\paragraph{The right approach.}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   750
To do this proof, the rules must be applied in the correct order.
331
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   751
Parameters should be created before unknowns.  The
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   752
\ttindex{choplev} command returns to an earlier stage of the proof;
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   753
let us return to the result of applying~$({\imp}I)$:
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   754
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   755
choplev 1;
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   756
{\out Level 1}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   757
{\out (ALL x y. P(x,y)) --> (ALL z w. P(w,z))}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   758
{\out  1. ALL x y. P(x,y) ==> ALL z w. P(w,z)}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   759
\end{ttbox}
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   760
Previously we made the mistake of applying $(\forall E)$ before $(\forall I)$.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   761
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   762
by (resolve_tac [allI] 1);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   763
{\out Level 2}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   764
{\out (ALL x y. P(x,y)) --> (ALL z w. P(w,z))}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   765
{\out  1. !!z. ALL x y. P(x,y) ==> ALL w. P(w,z)}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   766
\ttbreak
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   767
by (resolve_tac [allI] 1);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   768
{\out Level 3}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   769
{\out (ALL x y. P(x,y)) --> (ALL z w. P(w,z))}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   770
{\out  1. !!z w. ALL x y. P(x,y) ==> P(w,z)}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   771
\end{ttbox}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   772
The parameters \texttt{z} and~\texttt{w} have appeared.  We now create the
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   773
unknowns:
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   774
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   775
by (dresolve_tac [spec] 1);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   776
{\out Level 4}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   777
{\out (ALL x y. P(x,y)) --> (ALL z w. P(w,z))}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   778
{\out  1. !!z w. ALL y. P(?x3(z,w),y) ==> P(w,z)}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   779
\ttbreak
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   780
by (dresolve_tac [spec] 1);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   781
{\out Level 5}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   782
{\out (ALL x y. P(x,y)) --> (ALL z w. P(w,z))}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   783
{\out  1. !!z w. P(?x3(z,w),?y4(z,w)) ==> P(w,z)}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   784
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   785
Both {\tt?x3(z,w)} and~{\tt?y4(z,w)} could become any terms containing {\tt
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   786
z} and~\texttt{w}:
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   787
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   788
by (assume_tac 1);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   789
{\out Level 6}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   790
{\out (ALL x y. P(x,y)) --> (ALL z w. P(w,z))}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   791
{\out No subgoals!}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   792
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   793
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   794
\paragraph{A one-step proof using tacticals.}
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   795
\index{tacticals} \index{examples!of tacticals} 
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   796
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   797
Repeated application of rules can be effective, but the rules should be
331
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   798
attempted in the correct order.  Let us return to the original goal using
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   799
\ttindex{choplev}:
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   800
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   801
choplev 0;
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   802
{\out Level 0}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   803
{\out (ALL x y. P(x,y)) --> (ALL z w. P(w,z))}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   804
{\out  1. (ALL x y. P(x,y)) --> (ALL z w. P(w,z))}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   805
\end{ttbox}
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   806
As we have just seen, \tdx{allI} should be attempted
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   807
before~\tdx{spec}, while \ttindex{assume_tac} generally can be
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   808
attempted first.  Such priorities can easily be expressed
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   809
using~\ttindex{ORELSE}, and repeated using~\ttindex{REPEAT}.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   810
\begin{ttbox}
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   811
by (REPEAT (assume_tac 1 ORELSE resolve_tac [impI,allI] 1
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   812
     ORELSE dresolve_tac [spec] 1));
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   813
{\out Level 1}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   814
{\out (ALL x y. P(x,y)) --> (ALL z w. P(w,z))}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   815
{\out No subgoals!}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   816
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   817
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   818
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   819
\subsection{A realistic quantifier proof}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   820
\index{examples!with quantifiers}
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   821
To see the practical use of parameters and unknowns, let us prove half of
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   822
the equivalence 
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   823
\[ (\forall x. P(x) \imp Q) \,\bimp\, ((\exists x. P(x)) \imp Q). \]
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   824
We state the left-to-right half to Isabelle in the normal way.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   825
Since $\imp$ is nested to the right, $({\imp}I)$ can be applied twice; we
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   826
use \texttt{REPEAT}:
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   827
\begin{ttbox}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   828
Goal "(ALL x.P(x) --> Q) --> (EX x.P(x)) --> Q";
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   829
{\out Level 0}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   830
{\out (ALL x. P(x) --> Q) --> (EX x. P(x)) --> Q}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   831
{\out  1. (ALL x. P(x) --> Q) --> (EX x. P(x)) --> Q}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   832
\ttbreak
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   833
by (REPEAT (resolve_tac [impI] 1));
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   834
{\out Level 1}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   835
{\out (ALL x. P(x) --> Q) --> (EX x. P(x)) --> Q}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   836
{\out  1. [| ALL x. P(x) --> Q; EX x. P(x) |] ==> Q}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   837
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   838
We can eliminate the universal or the existential quantifier.  The
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   839
existential quantifier should be eliminated first, since this creates a
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   840
parameter.  The rule~$(\exists E)$ is bound to the
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   841
identifier~\tdx{exE}.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   842
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   843
by (eresolve_tac [exE] 1);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   844
{\out Level 2}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   845
{\out (ALL x. P(x) --> Q) --> (EX x. P(x)) --> Q}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   846
{\out  1. !!x. [| ALL x. P(x) --> Q; P(x) |] ==> Q}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   847
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   848
The only possibility now is $(\forall E)$, a destruction rule.  We use 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   849
\ttindex{dresolve_tac}, which discards the quantified assumption; it is
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   850
only needed once.
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   851
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   852
by (dresolve_tac [spec] 1);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   853
{\out Level 3}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   854
{\out (ALL x. P(x) --> Q) --> (EX x. P(x)) --> Q}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   855
{\out  1. !!x. [| P(x); P(?x3(x)) --> Q |] ==> Q}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   856
\end{ttbox}
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   857
Because we applied $(\exists E)$ before $(\forall E)$, the unknown
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   858
term~{\tt?x3(x)} may depend upon the parameter~\texttt{x}.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   859
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   860
Although $({\imp}E)$ is a destruction rule, it works with 
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   861
\ttindex{eresolve_tac} to perform backward chaining.  This technique is
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   862
frequently useful.  
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   863
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   864
by (eresolve_tac [mp] 1);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   865
{\out Level 4}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   866
{\out (ALL x. P(x) --> Q) --> (EX x. P(x)) --> Q}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   867
{\out  1. !!x. P(x) ==> P(?x3(x))}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   868
\end{ttbox}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   869
The tactic has reduced~\texttt{Q} to~\texttt{P(?x3(x))}, deleting the
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   870
implication.  The final step is trivial, thanks to the occurrence of~\texttt{x}.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   871
\begin{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   872
by (assume_tac 1);
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   873
{\out Level 5}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   874
{\out (ALL x. P(x) --> Q) --> (EX x. P(x)) --> Q}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   875
{\out No subgoals!}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   876
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   877
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   878
311
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   879
\subsection{The classical reasoner}
3fb8cdb32e10 penultimate Springer draft
lcp
parents: 296
diff changeset
   880
\index{classical reasoner}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   881
Although Isabelle cannot compete with fully automatic theorem provers, it
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   882
provides enough automation to tackle substantial examples.  The classical
331
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   883
reasoner can be set up for any classical natural deduction logic;
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   884
see \iflabelundefined{chap:classical}{the {\em Reference Manual\/}}%
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   885
        {Chap.\ts\ref{chap:classical}}. 
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   886
331
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   887
Rules are packaged into {\bf classical sets}.  The classical reasoner
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   888
provides several tactics, which apply rules using naive algorithms.
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   889
Unification handles quantifiers as shown above.  The most useful tactic
3127
4cc2fe62f7c3 New acknowledgements; no Fast_tac
paulson
parents: 3103
diff changeset
   890
is~\ttindex{Blast_tac}.  
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   891
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   892
Let us solve problems~40 and~60 of Pelletier~\cite{pelletier86}.  (The
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   893
backslashes~\hbox{\verb|\|\ldots\verb|\|} are an \ML{} string escape
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   894
sequence, to break the long string over two lines.)
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   895
\begin{ttbox}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   896
Goal "(EX y. ALL x. J(y,x) <-> ~J(x,x))  \ttback
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   897
\ttback       -->  ~ (ALL x. EX y. ALL z. J(z,y) <-> ~ J(z,x))";
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   898
{\out Level 0}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   899
{\out (EX y. ALL x. J(y,x) <-> ~J(x,x)) -->}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   900
{\out ~(ALL x. EX y. ALL z. J(z,y) <-> ~J(z,x))}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   901
{\out  1. (EX y. ALL x. J(y,x) <-> ~J(x,x)) -->}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   902
{\out     ~(ALL x. EX y. ALL z. J(z,y) <-> ~J(z,x))}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   903
\end{ttbox}
3127
4cc2fe62f7c3 New acknowledgements; no Fast_tac
paulson
parents: 3103
diff changeset
   904
\ttindex{Blast_tac} proves subgoal~1 at a stroke.
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   905
\begin{ttbox}
3127
4cc2fe62f7c3 New acknowledgements; no Fast_tac
paulson
parents: 3103
diff changeset
   906
by (Blast_tac 1);
4cc2fe62f7c3 New acknowledgements; no Fast_tac
paulson
parents: 3103
diff changeset
   907
{\out Depth = 0}
4cc2fe62f7c3 New acknowledgements; no Fast_tac
paulson
parents: 3103
diff changeset
   908
{\out Depth = 1}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   909
{\out Level 1}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   910
{\out (EX y. ALL x. J(y,x) <-> ~J(x,x)) -->}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   911
{\out ~(ALL x. EX y. ALL z. J(z,y) <-> ~J(z,x))}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   912
{\out No subgoals!}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   913
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   914
Sceptics may examine the proof by calling the package's single-step
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   915
tactics, such as~\texttt{step_tac}.  This would take up much space, however,
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   916
so let us proceed to the next example:
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   917
\begin{ttbox}
5205
602354039306 Changed "goal" to "Goal"
paulson
parents: 4802
diff changeset
   918
Goal "ALL x. P(x,f(x)) <-> \ttback
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   919
\ttback       (EX y. (ALL z. P(z,y) --> P(z,f(x))) & P(x,y))";
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   920
{\out Level 0}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   921
{\out ALL x. P(x,f(x)) <-> (EX y. (ALL z. P(z,y) --> P(z,f(x))) & P(x,y))}
296
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   922
{\out  1. ALL x. P(x,f(x)) <->}
e1f6cd9f682e revisions to first Springer draft
lcp
parents: 105
diff changeset
   923
{\out     (EX y. (ALL z. P(z,y) --> P(z,f(x))) & P(x,y))}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   924
\end{ttbox}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   925
Again, subgoal~1 succumbs immediately.
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   926
\begin{ttbox}
3127
4cc2fe62f7c3 New acknowledgements; no Fast_tac
paulson
parents: 3103
diff changeset
   927
by (Blast_tac 1);
4cc2fe62f7c3 New acknowledgements; no Fast_tac
paulson
parents: 3103
diff changeset
   928
{\out Depth = 0}
4cc2fe62f7c3 New acknowledgements; no Fast_tac
paulson
parents: 3103
diff changeset
   929
{\out Depth = 1}
105
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   930
{\out Level 1}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   931
{\out ALL x. P(x,f(x)) <-> (EX y. (ALL z. P(z,y) --> P(z,f(x))) & P(x,y))}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   932
{\out No subgoals!}
216d6ed87399 Initial revision
lcp
parents:
diff changeset
   933
\end{ttbox}
331
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   934
The classical reasoner is not restricted to the usual logical connectives.
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   935
The natural deduction rules for unions and intersections resemble those for
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   936
disjunction and conjunction.  The rules for infinite unions and
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   937
intersections resemble those for quantifiers.  Given such rules, the classical
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   938
reasoner is effective for reasoning in set theory.
13660d5f6a77 final Springer copy
lcp
parents: 311
diff changeset
   939