doc-src/IsarImplementation/Thy/document/tactic.tex
author haftmann
Sat, 07 Feb 2009 09:57:03 +0100
changeset 29828 2bc09b164f2b
parent 28786 de95d007eaed
permissions -rw-r--r--
added bulkload
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
     1
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
     2
\begin{isabellebody}%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
     3
\def\isabellecontext{tactic}%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
     4
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
     5
\isadelimtheory
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
     6
\isanewline
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
     7
\isanewline
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
     8
\isanewline
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
     9
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    10
\endisadelimtheory
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    11
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    12
\isatagtheory
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    13
\isacommand{theory}\isamarkupfalse%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    14
\ tactic\ \isakeyword{imports}\ base\ \isakeyword{begin}%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    15
\endisatagtheory
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    16
{\isafoldtheory}%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    17
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    18
\isadelimtheory
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    19
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    20
\endisadelimtheory
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    21
%
20452
wenzelm
parents: 20451
diff changeset
    22
\isamarkupchapter{Tactical reasoning%
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    23
}
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    24
\isamarkuptrue%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    25
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    26
\begin{isamarkuptext}%
20474
wenzelm
parents: 20472
diff changeset
    27
Tactical reasoning works by refining the initial claim in a
wenzelm
parents: 20472
diff changeset
    28
  backwards fashion, until a solved form is reached.  A \isa{goal}
wenzelm
parents: 20472
diff changeset
    29
  consists of several subgoals that need to be solved in order to
wenzelm
parents: 20472
diff changeset
    30
  achieve the main statement; zero subgoals means that the proof may
wenzelm
parents: 20472
diff changeset
    31
  be finished.  A \isa{tactic} is a refinement operation that maps
wenzelm
parents: 20472
diff changeset
    32
  a goal to a lazy sequence of potential successors.  A \isa{tactical} is a combinator for composing tactics.%
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    33
\end{isamarkuptext}%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    34
\isamarkuptrue%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    35
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    36
\isamarkupsection{Goals \label{sec:tactical-goals}%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    37
}
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    38
\isamarkuptrue%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    39
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    40
\begin{isamarkuptext}%
20451
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20316
diff changeset
    41
Isabelle/Pure represents a goal\glossary{Tactical goal}{A theorem of
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20316
diff changeset
    42
  \seeglossary{Horn Clause} form stating that a number of subgoals
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20316
diff changeset
    43
  imply the main conclusion, which is marked as a protected
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20316
diff changeset
    44
  proposition.} as a theorem stating that the subgoals imply the main
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20316
diff changeset
    45
  goal: \isa{A\isactrlsub {\isadigit{1}}\ {\isasymLongrightarrow}\ {\isasymdots}\ {\isasymLongrightarrow}\ A\isactrlsub n\ {\isasymLongrightarrow}\ C}.  The outermost goal
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20316
diff changeset
    46
  structure is that of a Horn Clause\glossary{Horn Clause}{An iterated
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20316
diff changeset
    47
  implication \isa{A\isactrlsub {\isadigit{1}}\ {\isasymLongrightarrow}\ {\isasymdots}\ {\isasymLongrightarrow}\ A\isactrlsub n\ {\isasymLongrightarrow}\ C}, without any
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20316
diff changeset
    48
  outermost quantifiers.  Strictly speaking, propositions \isa{A\isactrlsub i} need to be atomic in Horn Clauses, but Isabelle admits
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20316
diff changeset
    49
  arbitrary substructure here (nested \isa{{\isasymLongrightarrow}} and \isa{{\isasymAnd}}
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20316
diff changeset
    50
  connectives).}: i.e.\ an iterated implication without any
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20316
diff changeset
    51
  quantifiers\footnote{Recall that outermost \isa{{\isasymAnd}x{\isachardot}\ {\isasymphi}{\isacharbrackleft}x{\isacharbrackright}} is
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20316
diff changeset
    52
  always represented via schematic variables in the body: \isa{{\isasymphi}{\isacharbrackleft}{\isacharquery}x{\isacharbrackright}}.  These variables may get instantiated during the course of
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20316
diff changeset
    53
  reasoning.}.  For \isa{n\ {\isacharequal}\ {\isadigit{0}}} a goal is called ``solved''.
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    54
28786
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
    55
  The structure of each subgoal \isa{A\isactrlsub i} is that of a general
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
    56
  Hereditary Harrop Formula \isa{{\isasymAnd}x\isactrlsub {\isadigit{1}}\ {\isasymdots}\ {\isasymAnd}x\isactrlsub k{\isachardot}\ H\isactrlsub {\isadigit{1}}\ {\isasymLongrightarrow}\ {\isasymdots}\ {\isasymLongrightarrow}\ H\isactrlsub m\ {\isasymLongrightarrow}\ B} in
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
    57
  normal form.  Here \isa{x\isactrlsub {\isadigit{1}}{\isacharcomma}\ {\isasymdots}{\isacharcomma}\ x\isactrlsub k} are goal parameters, i.e.\
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
    58
  arbitrary-but-fixed entities of certain types, and \isa{H\isactrlsub {\isadigit{1}}{\isacharcomma}\ {\isasymdots}{\isacharcomma}\ H\isactrlsub m} are goal hypotheses, i.e.\ facts that may be assumed locally.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
    59
  Together, this forms the goal context of the conclusion \isa{B} to
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
    60
  be established.  The goal hypotheses may be again arbitrary
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
    61
  Hereditary Harrop Formulas, although the level of nesting rarely
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
    62
  exceeds 1--2 in practice.
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    63
20451
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20316
diff changeset
    64
  The main conclusion \isa{C} is internally marked as a protected
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20316
diff changeset
    65
  proposition\glossary{Protected proposition}{An arbitrarily
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20316
diff changeset
    66
  structured proposition \isa{C} which is forced to appear as
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20316
diff changeset
    67
  atomic by wrapping it into a propositional identity operator;
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20316
diff changeset
    68
  notation \isa{{\isacharhash}C}.  Protecting a proposition prevents basic
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20316
diff changeset
    69
  inferences from entering into that structure for the time being.},
20474
wenzelm
parents: 20472
diff changeset
    70
  which is represented explicitly by the notation \isa{{\isacharhash}C}.  This
wenzelm
parents: 20472
diff changeset
    71
  ensures that the decomposition into subgoals and main conclusion is
wenzelm
parents: 20472
diff changeset
    72
  well-defined for arbitrarily structured claims.
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    73
20451
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20316
diff changeset
    74
  \medskip Basic goal management is performed via the following
27ea2ba48fa3 misc cleanup;
wenzelm
parents: 20316
diff changeset
    75
  Isabelle/Pure rules:
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    76
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    77
  \[
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    78
  \infer[\isa{{\isacharparenleft}init{\isacharparenright}}]{\isa{C\ {\isasymLongrightarrow}\ {\isacharhash}C}}{} \qquad
20547
wenzelm
parents: 20474
diff changeset
    79
  \infer[\isa{{\isacharparenleft}finish{\isacharparenright}}]{\isa{C}}{\isa{{\isacharhash}C}}
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    80
  \]
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    81
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    82
  \medskip The following low-level variants admit general reasoning
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    83
  with protected propositions:
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    84
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    85
  \[
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    86
  \infer[\isa{{\isacharparenleft}protect{\isacharparenright}}]{\isa{{\isacharhash}C}}{\isa{C}} \qquad
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    87
  \infer[\isa{{\isacharparenleft}conclude{\isacharparenright}}]{\isa{A\isactrlsub {\isadigit{1}}\ {\isasymLongrightarrow}\ {\isasymdots}\ {\isasymLongrightarrow}\ A\isactrlsub n\ {\isasymLongrightarrow}\ C}}{\isa{A\isactrlsub {\isadigit{1}}\ {\isasymLongrightarrow}\ {\isasymdots}\ {\isasymLongrightarrow}\ A\isactrlsub n\ {\isasymLongrightarrow}\ {\isacharhash}C}}
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    88
  \]%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    89
\end{isamarkuptext}%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    90
\isamarkuptrue%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    91
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    92
\isadelimmlref
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    93
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    94
\endisadelimmlref
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    95
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    96
\isatagmlref
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    97
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    98
\begin{isamarkuptext}%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
    99
\begin{mldecls}
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   100
  \indexml{Goal.init}\verb|Goal.init: cterm -> thm| \\
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   101
  \indexml{Goal.finish}\verb|Goal.finish: thm -> thm| \\
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   102
  \indexml{Goal.protect}\verb|Goal.protect: thm -> thm| \\
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   103
  \indexml{Goal.conclude}\verb|Goal.conclude: thm -> thm| \\
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   104
  \end{mldecls}
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   105
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   106
  \begin{description}
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   107
20474
wenzelm
parents: 20472
diff changeset
   108
  \item \verb|Goal.init|~\isa{C} initializes a tactical goal from
wenzelm
parents: 20472
diff changeset
   109
  the well-formed proposition \isa{C}.
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   110
20474
wenzelm
parents: 20472
diff changeset
   111
  \item \verb|Goal.finish|~\isa{thm} checks whether theorem
wenzelm
parents: 20472
diff changeset
   112
  \isa{thm} is a solved goal (no subgoals), and concludes the
wenzelm
parents: 20472
diff changeset
   113
  result by removing the goal protection.
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   114
20474
wenzelm
parents: 20472
diff changeset
   115
  \item \verb|Goal.protect|~\isa{thm} protects the full statement
wenzelm
parents: 20472
diff changeset
   116
  of theorem \isa{thm}.
wenzelm
parents: 20472
diff changeset
   117
wenzelm
parents: 20472
diff changeset
   118
  \item \verb|Goal.conclude|~\isa{thm} removes the goal
wenzelm
parents: 20472
diff changeset
   119
  protection, even if there are pending subgoals.
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   120
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   121
  \end{description}%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   122
\end{isamarkuptext}%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   123
\isamarkuptrue%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   124
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   125
\endisatagmlref
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   126
{\isafoldmlref}%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   127
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   128
\isadelimmlref
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   129
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   130
\endisadelimmlref
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   131
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   132
\isamarkupsection{Tactics%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   133
}
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   134
\isamarkuptrue%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   135
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   136
\begin{isamarkuptext}%
28786
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   137
A \isa{tactic} is a function \isa{goal\ {\isasymrightarrow}\ goal\isactrlsup {\isacharasterisk}\isactrlsup {\isacharasterisk}} that
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   138
  maps a given goal state (represented as a theorem, cf.\
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   139
  \secref{sec:tactical-goals}) to a lazy sequence of potential
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   140
  successor states.  The underlying sequence implementation is lazy
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   141
  both in head and tail, and is purely functional in \emph{not}
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   142
  supporting memoing.\footnote{The lack of memoing and the strict
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   143
  nature of SML requires some care when working with low-level
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   144
  sequence operations, to avoid duplicate or premature evaluation of
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   145
  results.}
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   146
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   147
  An \emph{empty result sequence} means that the tactic has failed: in
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   148
  a compound tactic expressions other tactics might be tried instead,
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   149
  or the whole refinement step might fail outright, producing a
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   150
  toplevel error message.  When implementing tactics from scratch, one
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   151
  should take care to observe the basic protocol of mapping regular
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   152
  error conditions to an empty result; only serious faults should
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   153
  emerge as exceptions.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   154
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   155
  By enumerating \emph{multiple results}, a tactic can easily express
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   156
  the potential outcome of an internal search process.  There are also
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   157
  combinators for building proof tools that involve search
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   158
  systematically, see also \secref{sec:tacticals}.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   159
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   160
  \medskip As explained in \secref{sec:tactical-goals}, a goal state
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   161
  essentially consists of a list of subgoals that imply the main goal
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   162
  (conclusion).  Tactics may operate on all subgoals or on a
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   163
  particularly specified subgoal, but must not change the main
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   164
  conclusion (apart from instantiating schematic goal variables).
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   165
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   166
  Tactics with explicit \emph{subgoal addressing} are of the form
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   167
  \isa{int\ {\isasymrightarrow}\ tactic} and may be applied to a particular subgoal
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   168
  (counting from 1).  If the subgoal number is out of range, the
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   169
  tactic should fail with an empty result sequence, but must not raise
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   170
  an exception!
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   171
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   172
  Operating on a particular subgoal means to replace it by an interval
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   173
  of zero or more subgoals in the same place; other subgoals must not
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   174
  be affected, apart from instantiating schematic variables ranging
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   175
  over the whole goal state.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   176
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   177
  A common pattern of composing tactics with subgoal addressing is to
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   178
  try the first one, and then the second one only if the subgoal has
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   179
  not been solved yet.  Special care is required here to avoid bumping
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   180
  into unrelated subgoals that happen to come after the original
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   181
  subgoal.  Assuming that there is only a single initial subgoal is a
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   182
  very common error when implementing tactics!
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   183
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   184
  Tactics with internal subgoal addressing should expose the subgoal
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   185
  index as \isa{int} argument in full generality; a hardwired
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   186
  subgoal 1 inappropriate.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   187
  
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   188
  \medskip The main well-formedness conditions for proper tactics are
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   189
  summarized as follows.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   190
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   191
  \begin{itemize}
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   192
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   193
  \item General tactic failure is indicated by an empty result, only
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   194
  serious faults may produce an exception.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   195
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   196
  \item The main conclusion must not be changed, apart from
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   197
  instantiating schematic variables.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   198
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   199
  \item A tactic operates either uniformly on all subgoals, or
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   200
  specifically on a selected subgoal (without bumping into unrelated
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   201
  subgoals).
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   202
28786
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   203
  \item Range errors in subgoal addressing produce an empty result.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   204
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   205
  \end{itemize}
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   206
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   207
  Some of these conditions are checked by higher-level goal
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   208
  infrastructure (\secref{sec:results}); others are not checked
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   209
  explicitly, and violating them merely results in ill-behaved tactics
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   210
  experienced by the user (e.g.\ tactics that insist in being
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   211
  applicable only to singleton goals, or disallow composition with
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   212
  basic tacticals).%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   213
\end{isamarkuptext}%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   214
\isamarkuptrue%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   215
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   216
\isadelimmlref
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   217
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   218
\endisadelimmlref
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   219
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   220
\isatagmlref
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   221
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   222
\begin{isamarkuptext}%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   223
\begin{mldecls}
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   224
  \indexmltype{tactic}\verb|type tactic = thm -> thm Seq.seq| \\
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   225
  \indexml{no\_tac}\verb|no_tac: tactic| \\
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   226
  \indexml{all\_tac}\verb|all_tac: tactic| \\
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   227
  \indexml{print\_tac}\verb|print_tac: string -> tactic| \\[1ex]
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   228
  \indexml{PRIMITIVE}\verb|PRIMITIVE: (thm -> thm) -> tactic| \\[1ex]
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   229
  \indexml{SUBGOAL}\verb|SUBGOAL: (term * int -> tactic) -> int -> tactic| \\
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   230
  \indexml{CSUBGOAL}\verb|CSUBGOAL: (cterm * int -> tactic) -> int -> tactic| \\
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   231
  \end{mldecls}
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   232
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   233
  \begin{description}
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   234
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   235
  \item \verb|tactic| represents tactics.  The well-formedness
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   236
  conditions described above need to be observed.  See also \hyperlink{file.~~/src/Pure/General/seq.ML}{\mbox{\isa{\isatt{{\isachartilde}{\isachartilde}{\isacharslash}src{\isacharslash}Pure{\isacharslash}General{\isacharslash}seq{\isachardot}ML}}}} for the underlying implementation of
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   237
  lazy sequences.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   238
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   239
  \item \verb|int -> tactic| represents tactics with explicit
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   240
  subgoal addressing, with well-formedness conditions as described
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   241
  above.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   242
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   243
  \item \verb|no_tac| is a tactic that always fails, returning the
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   244
  empty sequence.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   245
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   246
  \item \verb|all_tac| is a tactic that always succeeds, returning a
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   247
  singleton sequence with unchanged goal state.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   248
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   249
  \item \verb|print_tac|~\isa{message} is like \verb|all_tac|, but
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   250
  prints a message together with the goal state on the tracing
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   251
  channel.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   252
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   253
  \item \verb|PRIMITIVE|~\isa{rule} turns a primitive inference rule
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   254
  into a tactic with unique result.  Exception \verb|THM| is considered
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   255
  a regular tactic failure and produces an empty result; other
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   256
  exceptions are passed through.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   257
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   258
  \item \verb|SUBGOAL|~\isa{{\isacharparenleft}fn\ {\isacharparenleft}subgoal{\isacharcomma}\ i{\isacharparenright}\ {\isacharequal}{\isachargreater}\ tactic{\isacharparenright}} is the
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   259
  most basic form to produce a tactic with subgoal addressing.  The
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   260
  given abstraction over the subgoal term and subgoal number allows to
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   261
  peek at the relevant information of the full goal state.  The
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   262
  subgoal range is checked as required above.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   263
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   264
  \item \verb|CSUBGOAL| is similar to \verb|SUBGOAL|, but passes the
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   265
  subgoal as \verb|cterm| instead of raw \verb|term|.  This
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   266
  avoids expensive re-certification in situations where the subgoal is
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   267
  used directly for primitive inferences.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   268
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   269
  \end{description}%
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   270
\end{isamarkuptext}%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   271
\isamarkuptrue%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   272
%
28786
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   273
\endisatagmlref
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   274
{\isafoldmlref}%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   275
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   276
\isadelimmlref
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   277
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   278
\endisadelimmlref
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   279
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   280
\isamarkupsubsection{Resolution and assumption tactics \label{sec:resolve-assume-tac}%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   281
}
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   282
\isamarkuptrue%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   283
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   284
\begin{isamarkuptext}%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   285
\emph{Resolution} is the most basic mechanism for refining a
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   286
  subgoal using a theorem as object-level rule.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   287
  \emph{Elim-resolution} is particularly suited for elimination rules:
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   288
  it resolves with a rule, proves its first premise by assumption, and
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   289
  finally deletes that assumption from any new subgoals.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   290
  \emph{Destruct-resolution} is like elim-resolution, but the given
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   291
  destruction rules are first turned into canonical elimination
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   292
  format.  \emph{Forward-resolution} is like destruct-resolution, but
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   293
  without deleting the selected assumption.  The \isa{r{\isacharslash}e{\isacharslash}d{\isacharslash}f}
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   294
  naming convention is maintained for several different kinds of
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   295
  resolution rules and tactics.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   296
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   297
  Assumption tactics close a subgoal by unifying some of its premises
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   298
  against its conclusion.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   299
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   300
  \medskip All the tactics in this section operate on a subgoal
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   301
  designated by a positive integer.  Other subgoals might be affected
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   302
  indirectly, due to instantiation of schematic variables.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   303
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   304
  There are various sources of non-determinism, the tactic result
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   305
  sequence enumerates all possibilities of the following choices (if
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   306
  applicable):
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   307
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   308
  \begin{enumerate}
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   309
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   310
  \item selecting one of the rules given as argument to the tactic;
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   311
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   312
  \item selecting a subgoal premise to eliminate, unifying it against
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   313
  the first premise of the rule;
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   314
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   315
  \item unifying the conclusion of the subgoal to the conclusion of
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   316
  the rule.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   317
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   318
  \end{enumerate}
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   319
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   320
  Recall that higher-order unification may produce multiple results
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   321
  that are enumerated here.%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   322
\end{isamarkuptext}%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   323
\isamarkuptrue%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   324
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   325
\isadelimmlref
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   326
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   327
\endisadelimmlref
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   328
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   329
\isatagmlref
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   330
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   331
\begin{isamarkuptext}%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   332
\begin{mldecls}
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   333
  \indexml{resolve\_tac}\verb|resolve_tac: thm list -> int -> tactic| \\
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   334
  \indexml{eresolve\_tac}\verb|eresolve_tac: thm list -> int -> tactic| \\
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   335
  \indexml{dresolve\_tac}\verb|dresolve_tac: thm list -> int -> tactic| \\
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   336
  \indexml{forward\_tac}\verb|forward_tac: thm list -> int -> tactic| \\[1ex]
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   337
  \indexml{assume\_tac}\verb|assume_tac: int -> tactic| \\
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   338
  \indexml{eq\_assume\_tac}\verb|eq_assume_tac: int -> tactic| \\[1ex]
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   339
  \indexml{match\_tac}\verb|match_tac: thm list -> int -> tactic| \\
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   340
  \indexml{ematch\_tac}\verb|ematch_tac: thm list -> int -> tactic| \\
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   341
  \indexml{dmatch\_tac}\verb|dmatch_tac: thm list -> int -> tactic| \\
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   342
  \end{mldecls}
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   343
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   344
  \begin{description}
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   345
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   346
  \item \verb|resolve_tac|~\isa{thms\ i} refines the goal state
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   347
  using the given theorems, which should normally be introduction
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   348
  rules.  The tactic resolves a rule's conclusion with subgoal \isa{i}, replacing it by the corresponding versions of the rule's
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   349
  premises.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   350
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   351
  \item \verb|eresolve_tac|~\isa{thms\ i} performs elim-resolution
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   352
  with the given theorems, which should normally be elimination rules.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   353
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   354
  \item \verb|dresolve_tac|~\isa{thms\ i} performs
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   355
  destruct-resolution with the given theorems, which should normally
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   356
  be destruction rules.  This replaces an assumption by the result of
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   357
  applying one of the rules.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   358
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   359
  \item \verb|forward_tac| is like \verb|dresolve_tac| except that the
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   360
  selected assumption is not deleted.  It applies a rule to an
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   361
  assumption, adding the result as a new assumption.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   362
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   363
  \item \verb|assume_tac|~\isa{i} attempts to solve subgoal \isa{i}
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   364
  by assumption (modulo higher-order unification).
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   365
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   366
  \item \verb|eq_assume_tac| is similar to \verb|assume_tac|, but checks
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   367
  only for immediate \isa{{\isasymalpha}}-convertibility instead of using
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   368
  unification.  It succeeds (with a unique next state) if one of the
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   369
  assumptions is equal to the subgoal's conclusion.  Since it does not
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   370
  instantiate variables, it cannot make other subgoals unprovable.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   371
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   372
  \item \verb|match_tac|, \verb|ematch_tac|, and \verb|dmatch_tac| are
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   373
  similar to \verb|resolve_tac|, \verb|eresolve_tac|, and \verb|dresolve_tac|, respectively, but do not instantiate schematic
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   374
  variables in the goal state.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   375
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   376
  Flexible subgoals are not updated at will, but are left alone.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   377
  Strictly speaking, matching means to treat the unknowns in the goal
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   378
  state as constants; these tactics merely discard unifiers that would
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   379
  update the goal state.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   380
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   381
  \end{description}%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   382
\end{isamarkuptext}%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   383
\isamarkuptrue%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   384
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   385
\endisatagmlref
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   386
{\isafoldmlref}%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   387
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   388
\isadelimmlref
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   389
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   390
\endisadelimmlref
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   391
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   392
\isamarkupsubsection{Explicit instantiation within a subgoal context%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   393
}
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   394
\isamarkuptrue%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   395
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   396
\begin{isamarkuptext}%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   397
The main resolution tactics (\secref{sec:resolve-assume-tac})
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   398
  use higher-order unification, which works well in many practical
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   399
  situations despite its daunting theoretical properties.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   400
  Nonetheless, there are important problem classes where unguided
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   401
  higher-order unification is not so useful.  This typically involves
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   402
  rules like universal elimination, existential introduction, or
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   403
  equational substitution.  Here the unification problem involves
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   404
  fully flexible \isa{{\isacharquery}P\ {\isacharquery}x} schemes, which are hard to manage
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   405
  without further hints.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   406
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   407
  By providing a (small) rigid term for \isa{{\isacharquery}x} explicitly, the
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   408
  remaining unification problem is to assign a (large) term to \isa{{\isacharquery}P}, according to the shape of the given subgoal.  This is
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   409
  sufficiently well-behaved in most practical situations.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   410
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   411
  \medskip Isabelle provides separate versions of the standard \isa{r{\isacharslash}e{\isacharslash}d{\isacharslash}f} resolution tactics that allow to provide explicit
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   412
  instantiations of unknowns of the given rule, wrt.\ terms that refer
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   413
  to the implicit context of the selected subgoal.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   414
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   415
  An instantiation consists of a list of pairs of the form \isa{{\isacharparenleft}{\isacharquery}x{\isacharcomma}\ t{\isacharparenright}}, where \isa{{\isacharquery}x} is a schematic variable occurring in
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   416
  the given rule, and \isa{t} is a term from the current proof
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   417
  context, augmented by the local goal parameters of the selected
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   418
  subgoal; cf.\ the \isa{focus} operation described in
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   419
  \secref{sec:variables}.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   420
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   421
  Entering the syntactic context of a subgoal is a brittle operation,
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   422
  because its exact form is somewhat accidental, and the choice of
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   423
  bound variable names depends on the presence of other local and
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   424
  global names.  Explicit renaming of subgoal parameters prior to
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   425
  explicit instantiation might help to achieve a bit more robustness.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   426
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   427
  Type instantiations may be given as well, via pairs like \isa{{\isacharparenleft}{\isacharquery}{\isacharprime}a{\isacharcomma}\ {\isasymtau}{\isacharparenright}}.  Type instantiations are distinguished from term
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   428
  instantiations by the syntactic form of the schematic variable.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   429
  Types are instantiated before terms are.  Since term instantiation
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   430
  already performs type-inference as expected, explicit type
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   431
  instantiations are seldom necessary.%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   432
\end{isamarkuptext}%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   433
\isamarkuptrue%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   434
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   435
\isadelimmlref
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   436
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   437
\endisadelimmlref
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   438
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   439
\isatagmlref
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   440
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   441
\begin{isamarkuptext}%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   442
\begin{mldecls}
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   443
  \indexml{res\_inst\_tac}\verb|res_inst_tac: Proof.context -> (indexname * string) list -> thm -> int -> tactic| \\
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   444
  \indexml{eres\_inst\_tac}\verb|eres_inst_tac: Proof.context -> (indexname * string) list -> thm -> int -> tactic| \\
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   445
  \indexml{dres\_inst\_tac}\verb|dres_inst_tac: Proof.context -> (indexname * string) list -> thm -> int -> tactic| \\
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   446
  \indexml{forw\_inst\_tac}\verb|forw_inst_tac: Proof.context -> (indexname * string) list -> thm -> int -> tactic| \\[1ex]
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   447
  \indexml{rename\_tac}\verb|rename_tac: string list -> int -> tactic| \\
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   448
  \end{mldecls}
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   449
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   450
  \begin{description}
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   451
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   452
  \item \verb|res_inst_tac|~\isa{ctxt\ insts\ thm\ i} instantiates the
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   453
  rule \isa{thm} with the instantiations \isa{insts}, as described
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   454
  above, and then performs resolution on subgoal \isa{i}.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   455
  
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   456
  \item \verb|eres_inst_tac| is like \verb|res_inst_tac|, but performs
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   457
  elim-resolution.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   458
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   459
  \item \verb|dres_inst_tac| is like \verb|res_inst_tac|, but performs
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   460
  destruct-resolution.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   461
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   462
  \item \verb|forw_inst_tac| is like \verb|dres_inst_tac| except that
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   463
  the selected assumption is not deleted.
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   464
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   465
  \item \verb|rename_tac|~\isa{names\ i} renames the innermost
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   466
  parameters of subgoal \isa{i} according to the provided \isa{names} (which need to be distinct indentifiers).
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   467
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   468
  \end{description}%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   469
\end{isamarkuptext}%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   470
\isamarkuptrue%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   471
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   472
\endisatagmlref
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   473
{\isafoldmlref}%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   474
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   475
\isadelimmlref
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   476
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   477
\endisadelimmlref
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   478
%
de95d007eaed updated generated files;
wenzelm
parents: 20547
diff changeset
   479
\isamarkupsection{Tacticals \label{sec:tacticals}%
18537
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   480
}
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   481
\isamarkuptrue%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   482
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   483
\begin{isamarkuptext}%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   484
FIXME
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   485
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   486
\glossary{Tactical}{A functional combinator for building up complex
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   487
tactics from simpler ones.  Typical tactical perform sequential
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   488
composition, disjunction (choice), iteration, or goal addressing.
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   489
Various search strategies may be expressed via tacticals.}%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   490
\end{isamarkuptext}%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   491
\isamarkuptrue%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   492
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   493
\isadelimtheory
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   494
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   495
\endisadelimtheory
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   496
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   497
\isatagtheory
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   498
\isacommand{end}\isamarkupfalse%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   499
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   500
\endisatagtheory
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   501
{\isafoldtheory}%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   502
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   503
\isadelimtheory
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   504
%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   505
\endisadelimtheory
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   506
\isanewline
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   507
\isanewline
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   508
\end{isabellebody}%
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   509
%%% Local Variables:
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   510
%%% mode: latex
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   511
%%% TeX-master: "root"
2681f9e34390 "The Isabelle/Isar Implementation" manual;
wenzelm
parents:
diff changeset
   512
%%% End: