doc-src/IsarRef/generic.tex
author wenzelm
Tue, 24 Aug 1999 15:38:18 +0200
changeset 7335 abba35b98892
parent 7321 b4dcc32310fb
child 7356 1714c91b8729
permissions -rw-r--r--
draft release;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7135
wenzelm
parents:
diff changeset
     1
7167
wenzelm
parents: 7141
diff changeset
     2
\chapter{Generic Tools and Packages}\label{ch:gen-tools}
wenzelm
parents: 7141
diff changeset
     3
7315
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
     4
\section{Basic proof methods}\label{sec:pure-meth}
7167
wenzelm
parents: 7141
diff changeset
     5
wenzelm
parents: 7141
diff changeset
     6
\indexisarmeth{fail}\indexisarmeth{succeed}\indexisarmeth{$-$}\indexisarmeth{assumption}
wenzelm
parents: 7141
diff changeset
     7
\indexisarmeth{finish}\indexisarmeth{fold}\indexisarmeth{unfold}
wenzelm
parents: 7141
diff changeset
     8
\indexisarmeth{rule}\indexisarmeth{erule}
wenzelm
parents: 7141
diff changeset
     9
\begin{matharray}{rcl}
wenzelm
parents: 7141
diff changeset
    10
  - & : & \isarmeth \\
wenzelm
parents: 7141
diff changeset
    11
  assumption & : & \isarmeth \\
7321
wenzelm
parents: 7319
diff changeset
    12
  finish & : & \isarmeth \\[0.5ex]
wenzelm
parents: 7319
diff changeset
    13
  rule & : & \isarmeth \\
wenzelm
parents: 7319
diff changeset
    14
  erule^* & : & \isarmeth \\[0.5ex]
7167
wenzelm
parents: 7141
diff changeset
    15
  fold & : & \isarmeth \\
7321
wenzelm
parents: 7319
diff changeset
    16
  unfold & : & \isarmeth \\[0.5ex]
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
    17
  succeed & : & \isarmeth \\
7321
wenzelm
parents: 7319
diff changeset
    18
  fail & : & \isarmeth \\
7167
wenzelm
parents: 7141
diff changeset
    19
\end{matharray}
wenzelm
parents: 7141
diff changeset
    20
wenzelm
parents: 7141
diff changeset
    21
\begin{rail}
wenzelm
parents: 7141
diff changeset
    22
  ('fold' | 'unfold' | 'rule' | 'erule') thmrefs
wenzelm
parents: 7141
diff changeset
    23
  ;
wenzelm
parents: 7141
diff changeset
    24
\end{rail}
wenzelm
parents: 7141
diff changeset
    25
wenzelm
parents: 7141
diff changeset
    26
\begin{descr}
7321
wenzelm
parents: 7319
diff changeset
    27
\item [``$-$''] does nothing but insert the forward chaining facts as premises
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
    28
  into the goal.  Note that command $\PROOFNAME$ without any method actually
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
    29
  performs a single reduction step using the $rule$ method (see below); thus a
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
    30
  plain \emph{do-nothing} proof step would be $\PROOF{-}$ rather than
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
    31
  $\PROOFNAME$ alone.
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
    32
\item [$assumption$] solves some goal by assumption, after inserting the
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
    33
  goal's facts.
7321
wenzelm
parents: 7319
diff changeset
    34
\item [$finish$] solves all remaining goals by assumption; this is the default
wenzelm
parents: 7319
diff changeset
    35
  terminal proof method for $\QEDNAME$, i.e.\ it usually does not have to be
wenzelm
parents: 7319
diff changeset
    36
  spelled out explicitly.
wenzelm
parents: 7319
diff changeset
    37
\item [$rule~thms$] applies some rule given as argument in backward manner;
wenzelm
parents: 7319
diff changeset
    38
  facts are used to reduce the rule before applying it to the goal.  Thus
wenzelm
parents: 7319
diff changeset
    39
  $rule$ without facts is plain \emph{introduction}, while with facts it
wenzelm
parents: 7319
diff changeset
    40
  becomes an \emph{elimination}.
wenzelm
parents: 7319
diff changeset
    41
  
wenzelm
parents: 7319
diff changeset
    42
  Note that the classical reasoner introduces another version of $rule$ that
wenzelm
parents: 7319
diff changeset
    43
  is able to pick appropriate rules automatically, whenever explicit $thms$
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
    44
  are omitted (see \S\ref{sec:classical-basic}); that method is the default
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
    45
  one for initial proof steps, such as $\PROOFNAME$ and ``$\DDOT$'' (two
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
    46
  dots).
7321
wenzelm
parents: 7319
diff changeset
    47
\item [$erule~thms$] is similar to $rule$, but applies rules by
wenzelm
parents: 7319
diff changeset
    48
  elim-resolution.  This is an improper method, mainly for experimentation and
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
    49
  porting of old scripts.  Actual elimination proofs are usually done with
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
    50
  $rule$ (single step, involving facts) or $elim$ (multiple steps, see
7321
wenzelm
parents: 7319
diff changeset
    51
  \S\ref{sec:classical-basic}).
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
    52
\item [$unfold~thms$ and $fold~thms$] expand and fold back again the given
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
    53
  meta-level definitions throughout all goals; facts may not be involved.
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
    54
\item [$succeed$] yields a single (unchanged) result; it is the identify of
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
    55
  the ``\texttt{,}'' method combinator.
7321
wenzelm
parents: 7319
diff changeset
    56
\item [$fail$] yields an empty result sequence; it is the identify of the
wenzelm
parents: 7319
diff changeset
    57
  ``\texttt{|}'' method combinator.
wenzelm
parents: 7319
diff changeset
    58
\end{descr}
7167
wenzelm
parents: 7141
diff changeset
    59
7315
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
    60
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
    61
\section{Miscellaneous attributes}
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
    62
7167
wenzelm
parents: 7141
diff changeset
    63
\indexisaratt{tag}\indexisaratt{untag}\indexisaratt{COMP}\indexisaratt{RS}
wenzelm
parents: 7141
diff changeset
    64
\indexisaratt{OF}\indexisaratt{where}\indexisaratt{of}\indexisaratt{standard}
wenzelm
parents: 7141
diff changeset
    65
\indexisaratt{elimify}\indexisaratt{transfer}\indexisaratt{export}
wenzelm
parents: 7141
diff changeset
    66
\begin{matharray}{rcl}
wenzelm
parents: 7141
diff changeset
    67
  tag & : & \isaratt \\
7321
wenzelm
parents: 7319
diff changeset
    68
  untag & : & \isaratt \\[0.5ex]
wenzelm
parents: 7319
diff changeset
    69
  OF & : & \isaratt \\
7167
wenzelm
parents: 7141
diff changeset
    70
  RS & : & \isaratt \\
7321
wenzelm
parents: 7319
diff changeset
    71
  COMP & : & \isaratt \\[0.5ex]
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
    72
  of & : & \isaratt \\
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
    73
  where & : & \isaratt \\[0.5ex]
7167
wenzelm
parents: 7141
diff changeset
    74
  standard & : & \isaratt \\
wenzelm
parents: 7141
diff changeset
    75
  elimify & : & \isaratt \\
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
    76
  export^* & : & \isaratt \\
7167
wenzelm
parents: 7141
diff changeset
    77
  transfer & : & \isaratt \\
wenzelm
parents: 7141
diff changeset
    78
\end{matharray}
wenzelm
parents: 7141
diff changeset
    79
wenzelm
parents: 7141
diff changeset
    80
\begin{rail}
wenzelm
parents: 7141
diff changeset
    81
  ('tag' | 'untag') (nameref+)
wenzelm
parents: 7141
diff changeset
    82
  ;
wenzelm
parents: 7141
diff changeset
    83
  'OF' thmrefs
wenzelm
parents: 7141
diff changeset
    84
  ;
7321
wenzelm
parents: 7319
diff changeset
    85
  ('RS' | 'COMP') nat? thmref
7167
wenzelm
parents: 7141
diff changeset
    86
  ;
7175
wenzelm
parents: 7167
diff changeset
    87
  'of' (inst * ) ('concl' ':' (inst * ))?
7167
wenzelm
parents: 7141
diff changeset
    88
  ;
7321
wenzelm
parents: 7319
diff changeset
    89
  'where' (name '=' term * 'and')
wenzelm
parents: 7319
diff changeset
    90
  ;
7167
wenzelm
parents: 7141
diff changeset
    91
wenzelm
parents: 7141
diff changeset
    92
  inst: underscore | term
wenzelm
parents: 7141
diff changeset
    93
  ;
wenzelm
parents: 7141
diff changeset
    94
\end{rail}
wenzelm
parents: 7141
diff changeset
    95
wenzelm
parents: 7141
diff changeset
    96
\begin{descr}
7321
wenzelm
parents: 7319
diff changeset
    97
\item [$tag~tags$ and $untag~tags$] add and remove $tags$ to the theorem,
wenzelm
parents: 7319
diff changeset
    98
  respectively.  Tags may be any list of strings that serve as comment for
wenzelm
parents: 7319
diff changeset
    99
  some tools (e.g.\ $\LEMMANAME$ causes tag ``$lemma$'' to be added to the
wenzelm
parents: 7319
diff changeset
   100
  result).
wenzelm
parents: 7319
diff changeset
   101
\item [$OF~thms$, $RS~n~thm$, and $COMP~n~thm$] compose rules.  $OF$ applies
wenzelm
parents: 7319
diff changeset
   102
  $thms$ in parallel (cf.\ \texttt{MRS} in \cite[\S5]{isabelle-ref}, but note
wenzelm
parents: 7319
diff changeset
   103
  the reversed order).  $RS$ resolves with the $n$-th premise of $thm$; $COMP$
wenzelm
parents: 7319
diff changeset
   104
  is a version of $RS$ that does not include the automatic lifting process
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   105
  that is normally intended (see also \texttt{RS} and \texttt{COMP} in
7321
wenzelm
parents: 7319
diff changeset
   106
  \cite[\S5]{isabelle-ref}).
wenzelm
parents: 7319
diff changeset
   107
  
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   108
\item [$of~ts$ and $where~\vec x = \vec t$] perform positional and named
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   109
  instantiation, respectively.  The terms given in $of$ are substituted for
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   110
  any schematic variables occurring in a theorem from left to right;
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   111
  ``\texttt{_}'' (underscore) indicates to skip a position.
7321
wenzelm
parents: 7319
diff changeset
   112
 
wenzelm
parents: 7319
diff changeset
   113
\item [$standard$] puts a theorem into the standard form of object-rules, just
wenzelm
parents: 7319
diff changeset
   114
  as the ML function \texttt{standard} (see \cite[\S5]{isabelle-ref}).
wenzelm
parents: 7319
diff changeset
   115
  
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   116
\item [$elimify$] turns an destruction rule into an elimination.
7321
wenzelm
parents: 7319
diff changeset
   117
  
wenzelm
parents: 7319
diff changeset
   118
\item [$export$] lifts a local result out of the current proof context,
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   119
  generalizing all fixed variables and discharging all assumptions.  Note that
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   120
  (partial) export is usually done automatically behind the scenes.  This
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   121
  attribute is mainly for experimentation.
7321
wenzelm
parents: 7319
diff changeset
   122
  
wenzelm
parents: 7319
diff changeset
   123
\item [$transfer$] promotes a theorem to the current theory context, which has
wenzelm
parents: 7319
diff changeset
   124
  to enclose the former one.  Normally, this is done automatically when rules
wenzelm
parents: 7319
diff changeset
   125
  are joined by inference.
wenzelm
parents: 7319
diff changeset
   126
7167
wenzelm
parents: 7141
diff changeset
   127
\end{descr}
wenzelm
parents: 7141
diff changeset
   128
7315
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   129
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   130
\section{Calculational proof}\label{sec:calculation}
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   131
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   132
\indexisarcmd{also}\indexisarcmd{finally}\indexisaratt{trans}
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   133
\begin{matharray}{rcl}
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   134
  \isarcmd{also} & : & \isartrans{proof(state)}{proof(state)} \\
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   135
  \isarcmd{finally} & : & \isartrans{proof(state)}{proof(chain)} \\
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   136
  trans & : & \isaratt \\
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   137
\end{matharray}
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   138
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   139
Calculational proof is forward reasoning with implicit application of
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   140
transitivity rules (such those of $=$, $\le$, $<$).  Isabelle/Isar maintains
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   141
an auxiliary register $calculation$\indexisarreg{calculation} for accumulating
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   142
results obtained by transitivity obtained together with the current facts.
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   143
Command $\ALSO$ updates $calculation$ from the most recent result, while
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   144
$\FINALLY$ exhibits the final result by forward chaining towards the next goal
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   145
statement.  Both commands require valid current facts, i.e.\ may occur only
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   146
after commands that produce theorems such as $\ASSUMENAME$, $\NOTENAME$, or
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   147
some finished $\HAVENAME$ or $\SHOWNAME$.
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   148
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   149
Also note that the automatic term abbreviation ``$\dots$'' has its canonical
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   150
application with calculational proofs.  It automatically refers to the
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   151
argument\footnote{The argument of a curried infix expression is its right-hand
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   152
  side.} of the preceding statement.
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   153
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   154
Isabelle/Isar calculations are implicitly subject to block structure in the
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   155
sense that new threads of calculational reasoning are commenced for any new
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   156
block (as opened by a local goal, for example).  This means that, apart from
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   157
being able to nest calculations, there is no separate \emph{begin-calculation}
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   158
command required.
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   159
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   160
\begin{rail}
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   161
  ('also' | 'finally') transrules? comment?
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   162
  ;
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   163
  'trans' (() | 'add' ':' | 'del' ':') thmrefs
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   164
  ;
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   165
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   166
  transrules: '(' thmrefs ')' interest?
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   167
  ;
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   168
\end{rail}
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   169
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   170
\begin{descr}
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   171
\item [$\ALSO~(thms)$] maintains the auxiliary $calculation$ register as
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   172
  follows.  The first occurrence of $\ALSO$ in some calculational thread
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   173
  initialises $calculation$ by $facts$. Any subsequent $\ALSO$ on the same
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   174
  level of block-structure updates $calculation$ by some transitivity rule
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   175
  applied to $calculation$ and $facts$ (in that order).  Transitivity rules
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   176
  are picked from the current context plus those given as $thms$ (the latter
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   177
  have precedence).
7315
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   178
  
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   179
\item [$\FINALLY~(thms)$] maintaining $calculation$ in the same way as
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   180
  $\ALSO$, and concludes the current calculational thread.  The final result
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   181
  is exhibited as fact for forward chaining towards the next goal. Basically,
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   182
  $\FINALLY$ just abbreviates $\ALSO~\FROM{calculation}$.  A typical proof
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   183
  idiom is ``$\FINALLY~\SHOW{}{\VVar{thesis}}~\DOT$''.
7315
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   184
  
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   185
\item [$trans$] maintains the set of transitivity rules of the theory or proof
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   186
  context, by adding or deleting theorems (the default is to add).
7315
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   187
\end{descr}
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   188
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   189
See theory \texttt{HOL/Isar_examples/Group} for a simple application of
7315
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   190
calculations for basic equational reasoning.
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   191
\texttt{HOL/Isar_examples/KnasterTarski} involves a few more advanced
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   192
calculational steps in combination with natural deduction.
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   193
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   194
7135
wenzelm
parents:
diff changeset
   195
\section{Axiomatic Type Classes}\label{sec:axclass}
wenzelm
parents:
diff changeset
   196
wenzelm
parents:
diff changeset
   197
\indexisarcmd{axclass}\indexisarcmd{instance}
wenzelm
parents:
diff changeset
   198
\begin{matharray}{rcl}
wenzelm
parents:
diff changeset
   199
  \isarcmd{axclass} & : & \isartrans{theory}{theory} \\
wenzelm
parents:
diff changeset
   200
  \isarcmd{instance} & : & \isartrans{theory}{proof(prove)} \\
7319
wenzelm
parents: 7315
diff changeset
   201
  expand_classes & : & \isarmeth \\
7135
wenzelm
parents:
diff changeset
   202
\end{matharray}
wenzelm
parents:
diff changeset
   203
wenzelm
parents:
diff changeset
   204
Axiomatic type classes are provided by Isabelle/Pure as a purely
wenzelm
parents:
diff changeset
   205
\emph{definitional} interface to type classes (cf.~\S\ref{sec:classes}).  Thus
wenzelm
parents:
diff changeset
   206
any object logic may make use of this light-weight mechanism for abstract
wenzelm
parents:
diff changeset
   207
theories.  See \cite{Wenzel:1997:TPHOL} for more information.  There is also a
wenzelm
parents:
diff changeset
   208
tutorial on \emph{Using Axiomatic Type Classes in Isabelle} that is part of
wenzelm
parents:
diff changeset
   209
the standard Isabelle documentation.
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   210
%FIXME cite
7135
wenzelm
parents:
diff changeset
   211
wenzelm
parents:
diff changeset
   212
\begin{rail}
wenzelm
parents:
diff changeset
   213
  'axclass' classdecl (axmdecl prop comment? +)
wenzelm
parents:
diff changeset
   214
  ;
wenzelm
parents:
diff changeset
   215
  'instance' (nameref '<' nameref | nameref '::' simplearity) comment?
wenzelm
parents:
diff changeset
   216
  ;
wenzelm
parents:
diff changeset
   217
\end{rail}
wenzelm
parents:
diff changeset
   218
7167
wenzelm
parents: 7141
diff changeset
   219
\begin{descr}
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   220
\item [$\isarkeyword{axclass}~c < \vec c~axms$] defines an axiomatic type
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   221
  class as the intersection of existing classes, with additional axioms
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   222
  holding.  Class axioms may not contain more than one type variable.  The
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   223
  class axioms (with implicit sort constraints added) are bound to the given
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   224
  names.  Furthermore a class introduction rule is generated, which is
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   225
  employed by method $expand_classes$ in support instantiation proofs of this
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   226
  class.
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   227
  
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   228
\item [$\isarkeyword{instance}~c@1 < c@2$ and $\isarkeyword{instance}~t ::
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   229
  (\vec s)c$] setup up a goal stating the class relation or type arity.  The
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   230
  proof would usually proceed by the $expand_classes$ method, and then
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   231
  establish the characteristic theorems of the type classes involved.  After
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   232
  finishing the proof the theory will be augmented by a type signature
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   233
  declaration corresponding to the resulting theorem.
7319
wenzelm
parents: 7315
diff changeset
   234
\item [Method $expand_classes$] iteratively expands the class introduction
wenzelm
parents: 7315
diff changeset
   235
  rules
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   236
%FIXME intro classIs etc;
7167
wenzelm
parents: 7141
diff changeset
   237
\end{descr}
7135
wenzelm
parents:
diff changeset
   238
7319
wenzelm
parents: 7315
diff changeset
   239
See theory \texttt{HOL/Isar_examples/Group} for a simple example of using
wenzelm
parents: 7315
diff changeset
   240
axiomatic type classes, including instantiation proofs.
7135
wenzelm
parents:
diff changeset
   241
wenzelm
parents:
diff changeset
   242
wenzelm
parents:
diff changeset
   243
\section{The Simplifier}
wenzelm
parents:
diff changeset
   244
7321
wenzelm
parents: 7319
diff changeset
   245
\subsection{Simplification methods}\label{sec:simp}
7315
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   246
7321
wenzelm
parents: 7319
diff changeset
   247
\indexisarmeth{simp}\indexisarmeth{asm_simp}
7315
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   248
\begin{matharray}{rcl}
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   249
  simp & : & \isarmeth \\
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   250
  asm_simp & : & \isarmeth \\
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   251
\end{matharray}
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   252
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   253
\railalias{asmsimp}{asm\_simp}
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   254
\railterm{asmsimp}
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   255
7315
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   256
\begin{rail}
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   257
  ('simp' | asmsimp) (simpmod * )
7315
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   258
  ;
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   259
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   260
  simpmod: ('add' | 'del' | 'only' | 'other') ':' thmrefs
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   261
  ;
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   262
\end{rail}
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   263
7321
wenzelm
parents: 7319
diff changeset
   264
\begin{descr}
wenzelm
parents: 7319
diff changeset
   265
\item [Methods $simp$ and $asm_simp$] invoke Isabelle's simplifier, after
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   266
  modifying the context by adding or deleting given rules.  The
7321
wenzelm
parents: 7319
diff changeset
   267
  \railtoken{only} modifier first removes all other rewrite rules and
wenzelm
parents: 7319
diff changeset
   268
  congruences, and then is like \railtoken{add}.  In contrast,
wenzelm
parents: 7319
diff changeset
   269
  \railtoken{other} ignores its arguments; nevertheless there may be
wenzelm
parents: 7319
diff changeset
   270
  side-effects on the context via attributes.  This provides a back door for
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   271
  arbitrary context manipulation.
7321
wenzelm
parents: 7319
diff changeset
   272
  
wenzelm
parents: 7319
diff changeset
   273
  Both of these methods are based on \texttt{asm_full_simp_tac}, see
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   274
  \cite[\S10]{isabelle-ref}; $simp$ removes any exisiting premises of the
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   275
  goal, before inserting the goal facts; $asm_simp$ leaves the premises.
7321
wenzelm
parents: 7319
diff changeset
   276
\end{descr}
wenzelm
parents: 7319
diff changeset
   277
wenzelm
parents: 7319
diff changeset
   278
\subsection{Modifying the context}
wenzelm
parents: 7319
diff changeset
   279
wenzelm
parents: 7319
diff changeset
   280
\indexisaratt{simp}
wenzelm
parents: 7319
diff changeset
   281
\begin{matharray}{rcl}
wenzelm
parents: 7319
diff changeset
   282
  simp & : & \isaratt \\
wenzelm
parents: 7319
diff changeset
   283
\end{matharray}
wenzelm
parents: 7319
diff changeset
   284
wenzelm
parents: 7319
diff changeset
   285
\begin{rail}
wenzelm
parents: 7319
diff changeset
   286
  'simp' (() | 'add' | 'del')
wenzelm
parents: 7319
diff changeset
   287
  ;
wenzelm
parents: 7319
diff changeset
   288
\end{rail}
wenzelm
parents: 7319
diff changeset
   289
wenzelm
parents: 7319
diff changeset
   290
\begin{descr}
wenzelm
parents: 7319
diff changeset
   291
\item [Attribute $simp$] adds or deletes rules from the theory or proof
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   292
  context (the default is to add).
7321
wenzelm
parents: 7319
diff changeset
   293
\end{descr}
7319
wenzelm
parents: 7315
diff changeset
   294
7315
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   295
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   296
\subsection{Forward simplification}
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   297
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   298
\indexisaratt{simplify}\indexisaratt{asm_simplify}\indexisaratt{full_simplify}\indexisaratt{asm_full_simplify}
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   299
\begin{matharray}{rcl}
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   300
  simplify & : & \isaratt \\
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   301
  asm_simplify & : & \isaratt \\
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   302
  full_simplify & : & \isaratt \\
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   303
  asm_full_simplify & : & \isaratt \\
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   304
\end{matharray}
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   305
7321
wenzelm
parents: 7319
diff changeset
   306
These attributes provide forward rules for simplification, which should be
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   307
used only very rarely.  See the ML functions of the same name in
7321
wenzelm
parents: 7319
diff changeset
   308
\cite[\S10]{isabelle-ref} for more information.
7315
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   309
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   310
7135
wenzelm
parents:
diff changeset
   311
\section{The Classical Reasoner}
wenzelm
parents:
diff changeset
   312
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   313
\subsection{Basic methods}\label{sec:classical-basic}
7321
wenzelm
parents: 7319
diff changeset
   314
wenzelm
parents: 7319
diff changeset
   315
\indexisarmeth{rule}\indexisarmeth{default}\indexisarmeth{contradiction}
wenzelm
parents: 7319
diff changeset
   316
\begin{matharray}{rcl}
wenzelm
parents: 7319
diff changeset
   317
  rule & : & \isarmeth \\
wenzelm
parents: 7319
diff changeset
   318
  intro & : & \isarmeth \\
wenzelm
parents: 7319
diff changeset
   319
  elim & : & \isarmeth \\
wenzelm
parents: 7319
diff changeset
   320
  contradiction & : & \isarmeth \\
wenzelm
parents: 7319
diff changeset
   321
\end{matharray}
wenzelm
parents: 7319
diff changeset
   322
wenzelm
parents: 7319
diff changeset
   323
\begin{rail}
wenzelm
parents: 7319
diff changeset
   324
  ('rule' | 'intro' | 'elim') thmrefs
wenzelm
parents: 7319
diff changeset
   325
  ;
wenzelm
parents: 7319
diff changeset
   326
\end{rail}
wenzelm
parents: 7319
diff changeset
   327
wenzelm
parents: 7319
diff changeset
   328
\begin{descr}
wenzelm
parents: 7319
diff changeset
   329
\item [Method $rule$] as offered by the classical reasoner is a refinement
wenzelm
parents: 7319
diff changeset
   330
  over the primitive one (see \S\ref{sec:pure-meth}).  In the case that no
wenzelm
parents: 7319
diff changeset
   331
  rules are provided as arguments, it automatically determines elimination and
wenzelm
parents: 7319
diff changeset
   332
  introduction rules from the context (see also \S\ref{sec:classical-mod}).
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   333
  In that form it is the default method for basic proof steps, such as
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   334
  $\PROOFNAME$ and ``$\DDOT$'' (two dots).
7321
wenzelm
parents: 7319
diff changeset
   335
  
wenzelm
parents: 7319
diff changeset
   336
\item [Methods $intro$ and $elim$] repeatedly refine some goal by intro- or
wenzelm
parents: 7319
diff changeset
   337
  elim-resolution, after having inserted the facts.  Omitting the arguments
wenzelm
parents: 7319
diff changeset
   338
  refers to any suitable rules from the context, otherwise only the explicitly
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   339
  given ones may be applied.  The latter form admits better control of what
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   340
  actually happens, thus it is very appropriate as an initial method for
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   341
  $\PROOFNAME$ that splits up certain connectives of the goal, before entering
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   342
  the sub-proof.
7321
wenzelm
parents: 7319
diff changeset
   343
wenzelm
parents: 7319
diff changeset
   344
\item [Method $contradiction$] solves some goal by contradiction: both $A$ and
wenzelm
parents: 7319
diff changeset
   345
  $\neg A$ have to be present in the assumptions.
wenzelm
parents: 7319
diff changeset
   346
\end{descr}
wenzelm
parents: 7319
diff changeset
   347
wenzelm
parents: 7319
diff changeset
   348
wenzelm
parents: 7319
diff changeset
   349
\subsection{Automatic methods}\label{sec:classical-auto}
7315
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   350
7321
wenzelm
parents: 7319
diff changeset
   351
\indexisarmeth{blast}
wenzelm
parents: 7319
diff changeset
   352
\indexisarmeth{fast}\indexisarmeth{best}\indexisarmeth{slow}\indexisarmeth{slow_best}
wenzelm
parents: 7319
diff changeset
   353
\begin{matharray}{rcl}
wenzelm
parents: 7319
diff changeset
   354
 blast & : & \isarmeth \\
wenzelm
parents: 7319
diff changeset
   355
 fast & : & \isarmeth \\
wenzelm
parents: 7319
diff changeset
   356
 best & : & \isarmeth \\
wenzelm
parents: 7319
diff changeset
   357
 slow & : & \isarmeth \\
wenzelm
parents: 7319
diff changeset
   358
 slow_best & : & \isarmeth \\
wenzelm
parents: 7319
diff changeset
   359
\end{matharray}
wenzelm
parents: 7319
diff changeset
   360
wenzelm
parents: 7319
diff changeset
   361
\railalias{slowbest}{slow\_best}
wenzelm
parents: 7319
diff changeset
   362
\railterm{slowbest}
wenzelm
parents: 7319
diff changeset
   363
wenzelm
parents: 7319
diff changeset
   364
\begin{rail}
wenzelm
parents: 7319
diff changeset
   365
  'blast' nat? (clamod * )
wenzelm
parents: 7319
diff changeset
   366
  ;
wenzelm
parents: 7319
diff changeset
   367
  ('fast' | 'best' | 'slow' | slowbest) (clamod * )
wenzelm
parents: 7319
diff changeset
   368
  ;
wenzelm
parents: 7319
diff changeset
   369
wenzelm
parents: 7319
diff changeset
   370
  clamod: (('intro' | 'elim' | 'dest') (() | '!' | '!!') | 'del') ':' thmrefs
wenzelm
parents: 7319
diff changeset
   371
  ;
wenzelm
parents: 7319
diff changeset
   372
\end{rail}
wenzelm
parents: 7319
diff changeset
   373
wenzelm
parents: 7319
diff changeset
   374
\begin{descr}
wenzelm
parents: 7319
diff changeset
   375
\item [$blast$] refers to the classical tableau prover (see \texttt{blast_tac}
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   376
  in \cite[\S11]{isabelle-ref}).  The optional argument specifies a
7321
wenzelm
parents: 7319
diff changeset
   377
  user-supplied search bound (default 20).
wenzelm
parents: 7319
diff changeset
   378
\item [$fast$, $best$, $slow$, $slow_best$] refer to the generic classical
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   379
  reasoner (see \cite[\S11]{isabelle-ref}, tactic \texttt{fast_tac} etc).
7321
wenzelm
parents: 7319
diff changeset
   380
\end{descr}
wenzelm
parents: 7319
diff changeset
   381
wenzelm
parents: 7319
diff changeset
   382
Any of above methods support additional modifiers of the context of classical
wenzelm
parents: 7319
diff changeset
   383
rules.  There semantics is analogous to the attributes given in
wenzelm
parents: 7319
diff changeset
   384
\S\ref{sec:classical-mod}.
wenzelm
parents: 7319
diff changeset
   385
7315
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   386
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   387
\subsection{Combined automatic methods}
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   388
7321
wenzelm
parents: 7319
diff changeset
   389
\indexisarmeth{auto}\indexisarmeth{force}
wenzelm
parents: 7319
diff changeset
   390
\begin{matharray}{rcl}
wenzelm
parents: 7319
diff changeset
   391
  force & : & \isarmeth \\
wenzelm
parents: 7319
diff changeset
   392
  auto & : & \isarmeth \\
wenzelm
parents: 7319
diff changeset
   393
\end{matharray}
wenzelm
parents: 7319
diff changeset
   394
wenzelm
parents: 7319
diff changeset
   395
\begin{rail}
wenzelm
parents: 7319
diff changeset
   396
  ('force' | 'auto') (clasimpmod * )
wenzelm
parents: 7319
diff changeset
   397
  ;
7315
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   398
7321
wenzelm
parents: 7319
diff changeset
   399
  clasimpmod: ('simp' ('add' | 'del' | 'only') | other |
wenzelm
parents: 7319
diff changeset
   400
    (('intro' | 'elim' | 'dest') (() | '!' | '!!') | 'del')) ':' thmrefs
wenzelm
parents: 7319
diff changeset
   401
\end{rail}
7315
76a39a3784b5 checkpoint;
wenzelm
parents: 7175
diff changeset
   402
7321
wenzelm
parents: 7319
diff changeset
   403
\begin{descr}
wenzelm
parents: 7319
diff changeset
   404
\item [$force$ and $auto$] provide access to Isabelle's combined
wenzelm
parents: 7319
diff changeset
   405
  simplification and classical reasoning tactics.  See \texttt{force_tac} and
wenzelm
parents: 7319
diff changeset
   406
  \texttt{auto_tac} in \cite[\S11]{isabelle-ref} for more information.  The
wenzelm
parents: 7319
diff changeset
   407
  modifier arguments correspond to those given in \S\ref{sec:simp} and
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   408
  \S\ref{sec:classical-auto}.  Note that the ones related to the Simplifier
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   409
  are prefixed by \railtoken{simp} here.
7321
wenzelm
parents: 7319
diff changeset
   410
\end{descr}
wenzelm
parents: 7319
diff changeset
   411
wenzelm
parents: 7319
diff changeset
   412
\subsection{Modifying the context}\label{sec:classical-mod}
7135
wenzelm
parents:
diff changeset
   413
7321
wenzelm
parents: 7319
diff changeset
   414
\indexisaratt{intro}\indexisaratt{elim}\indexisaratt{dest}\indexisaratt{delrule}
wenzelm
parents: 7319
diff changeset
   415
\begin{matharray}{rcl}
wenzelm
parents: 7319
diff changeset
   416
  intro & : & \isaratt \\
wenzelm
parents: 7319
diff changeset
   417
  elim & : & \isaratt \\
wenzelm
parents: 7319
diff changeset
   418
  dest & : & \isaratt \\
wenzelm
parents: 7319
diff changeset
   419
  delrule & : & \isaratt \\
wenzelm
parents: 7319
diff changeset
   420
\end{matharray}
7135
wenzelm
parents:
diff changeset
   421
7321
wenzelm
parents: 7319
diff changeset
   422
\begin{rail}
wenzelm
parents: 7319
diff changeset
   423
  ('intro' | 'elim' | 'dest') (() | '!' | '!!')
wenzelm
parents: 7319
diff changeset
   424
  ;
wenzelm
parents: 7319
diff changeset
   425
\end{rail}
7135
wenzelm
parents:
diff changeset
   426
7321
wenzelm
parents: 7319
diff changeset
   427
\begin{descr}
7335
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   428
\item [$intro$, $elim$, $dest$] add introduction, elimination, destruct rules,
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   429
  respectively.  By default, rules are considered as \emph{safe}, while a
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   430
  single ``!'' classifies as \emph{unsafe}, and ``!!'' as \emph{extra} (i.e.\ 
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   431
  not applied in the search-oriented automatic methods).
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   432
  
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   433
\item [$delrule$] deletes introduction or elimination rules from the context.
abba35b98892 draft release;
wenzelm
parents: 7321
diff changeset
   434
  Note that destruction rules would have to be turned into elimination rules
7321
wenzelm
parents: 7319
diff changeset
   435
  first, e.g.\ by using the $elimify$ attribute.
wenzelm
parents: 7319
diff changeset
   436
\end{descr}
7135
wenzelm
parents:
diff changeset
   437
wenzelm
parents:
diff changeset
   438
wenzelm
parents:
diff changeset
   439
%%% Local Variables: 
wenzelm
parents:
diff changeset
   440
%%% mode: latex
wenzelm
parents:
diff changeset
   441
%%% TeX-master: "isar-ref"
wenzelm
parents:
diff changeset
   442
%%% End: