doc-src/Ref/goals.tex
author lcp
Wed, 10 Nov 1993 05:00:57 +0100
changeset 104 d8205bb279a7
child 286 e7efbf03562b
permissions -rw-r--r--
Initial revision
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     1
%% $Id$
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     2
\chapter{Proof Management: The Subgoal Module}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     3
\index{proofs|(}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     4
\index{subgoal module|(}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     5
\index{reading!goals|see{proofs, starting}}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     6
The subgoal module stores the current proof state and many previous states;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     7
commands can produce new states or return to previous ones.  The {\em state
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     8
list\/} at level $n$ is a list of pairs
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     9
\[ [(\psi@n,\Psi@n),\; (\psi@{n-1},\Psi@{n-1}),\; \ldots,\; (\psi@0,[])] \]
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    10
where $\psi@n$ is the current proof state, $\psi@{n-1}$ is the previous
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    11
one, \ldots, and $\psi@0$ is the initial proof state.  The $\Psi@i$ are
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    12
sequences (lazy lists) of proof states, storing branch points where a
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    13
tactic returned a list longer than one.  The state lists permit various
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    14
forms of backtracking.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    15
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    16
Chopping elements from the state list reverts to previous proof states.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    17
Besides this, the \ttindex{undo} command keeps a list of state lists.  The
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    18
module actually maintains a stack of state lists, to support several
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    19
proofs at the same time.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    20
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    21
The subgoal module always contains some proof state.  At the start of the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    22
Isabelle session, this state consists of a dummy formula.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    23
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    24
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    25
\section{Basic commands}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    26
Most proofs begin with {\tt goal} or {\tt goalw} and require no other
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    27
commands than {\tt by}, {\tt chop} and {\tt undo}.  They typically end with
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    28
a call to {\tt result}.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    29
\subsection{Starting a backward proof}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    30
\index{proofs!starting|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    31
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    32
goal        : theory -> string -> thm list 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    33
goalw       : theory -> thm list -> string -> thm list 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    34
goalw_cterm : thm list -> Sign.cterm -> thm list 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    35
premises    : unit -> thm list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    36
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    37
The {\tt goal} commands start a new proof by setting the goal.  They
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    38
replace the current state list by a new one consisting of the initial proof
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    39
state.  They also empty the \ttindex{undo} list; this command cannot be
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    40
undone!
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    41
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    42
They all return a list of meta-hypotheses taken from the main goal.  If
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    43
this list is non-empty, bind its value to an \ML{} identifier by typing
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    44
something like
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    45
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    46
val prems = it;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    47
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    48
These assumptions serve as the premises when you are deriving a rule.  They
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    49
are also stored internally and can be retrieved later by the function {\tt
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    50
  premises}.  When the proof is finished, \ttindex{result} compares the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    51
stored assumptions with the actual assumptions in the proof state.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    52
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    53
Some of the commands unfold definitions using meta-rewrite rules.  This
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    54
expansion affects both the first subgoal and the premises, which would
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    55
otherwise require use of \ttindex{rewrite_goals_tac} and
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    56
\ttindex{rewrite_rule}.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    57
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    58
If the main goal has the form {\tt"!!{\it vars}.\ \ldots"}, with an outermost
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    59
quantifier, then the list of premises will be empty.  Subgoal~1 will
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    60
contain the meta-quantified {\it vars\/} as parameters and the goal's premises
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    61
as assumptions.  This is useful when the next step of the proof would
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    62
otherwise be to call \ttindex{cut_facts_tac} with the list of premises
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    63
(\S\ref{cut_facts_tac}).
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    64
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    65
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    66
\item[\ttindexbold{goal} {\it theory} {\it formula}; ] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    67
begins a new proof, where {\it theory} is usually an \ML\ identifier
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    68
and the {\it formula\/} is written as an \ML\ string.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    69
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    70
\item[\ttindexbold{goalw} {\it theory} {\it defs} {\it formula}; ] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    71
is like {\tt goal} but also applies the list of {\it defs\/} as
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    72
meta-rewrite rules to the first subgoal and the premises.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    73
\index{rewriting!meta-level}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    74
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    75
\item[\ttindexbold{goalw_cterm} {\it theory} {\it defs} {\it ct}; ] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    76
is a version of {\tt goalw} for special applications.  The main goal is
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    77
supplied as a cterm, not as a string.  Typically, the cterm is created from
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    78
a term~$t$ by \hbox{\tt Sign.cterm_of (sign_of thy) $t$}.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    79
\index{*Sign.cterm_of}\index{*sign_of}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    80
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    81
\item[\ttindexbold{premises}()] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    82
returns the list of meta-hypotheses associated with the current proof, in
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    83
case you forget to bind them to an \ML{} identifier.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    84
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    85
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    86
\subsection{Applying a tactic}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    87
\index{tactics!commands for applying|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    88
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    89
by   : tactic -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    90
byev : tactic list -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    91
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    92
These commands extend the state list.  They apply a tactic to the current
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    93
proof state.  If the tactic succeeds, it returns a non-empty sequence of
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    94
next states.  The head of the sequence becomes the next state, while the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    95
tail is retained for backtracking (see~{\tt back}).
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    96
\begin{description} \item[\ttindexbold{by} {\it tactic}; ] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    97
applies the {\it tactic\/} to the proof state.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    98
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    99
\item[\ttindexbold{byev} {\it tactics}; ] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   100
applies the list of {\it tactics}, one at a time.  It is useful for testing
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   101
calls to {\tt prove_goal}, and abbreviates \hbox{\tt by (EVERY {\it
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   102
tactics})}.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   103
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   105
\noindent{\bf Error indications:}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   106
\begin{itemize}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   107
\item 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   108
{\tt "by:\ tactic failed"} means that the tactic returned an empty
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   109
sequence when applied to the current proof state. 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   110
\item 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   111
{\tt "Warning:\ same as previous level"} means that the new proof state
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   112
is identical to the previous state.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   113
\item
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   114
{\tt "Warning:\ signature of proof state has changed"} means that a rule
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   115
was applied from outside the theory of the initial proof state.  This
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   116
guards against mistakes such as expressing the goal in intuitionistic logic
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   117
and proving it using classical logic.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   118
\end{itemize}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   119
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   120
\subsection{Extracting the proved theorem}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   121
\index{ending a proof|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   122
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   123
result  : unit -> thm
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   124
uresult : unit -> thm
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   125
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   126
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   127
\item[\ttindexbold{result}()] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   128
returns the final theorem, after converting the free variables to
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   129
schematics.  It discharges the assumptions supplied to the matching 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   130
\ttindex{goal} command.  
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   131
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   132
It raises an exception unless the proof state passes certain checks.  There
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   133
must be no assumptions other than those supplied to \ttindex{goal}.  There
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   134
must be no subgoals.  The theorem proved must be a (first-order) instance
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   135
of the original goal, as stated in the \ttindex{goal} command.  This allows
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   136
{\bf answer extraction} --- instantiation of variables --- but no other
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   137
changes to the main goal.  The theorem proved must have the same signature
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   138
as the initial proof state.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   139
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   140
\item[\ttindexbold{uresult}()] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   141
is similar but omits the checks given above.  It is needed when the initial
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   142
goal contains function unknowns, when definitions are unfolded in the main
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   143
goal, or when \ttindex{assume_ax} has been used.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   144
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   145
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   146
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   147
\subsection{Undoing and backtracking}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   148
\index{undoing a proof command|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   149
\index{backtracking command|see{\tt back}}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   150
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   151
chop    : unit -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   152
choplev : int -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   153
back    : unit -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   154
undo    : unit -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   155
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   156
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   157
\item[\ttindexbold{chop}();] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   158
deletes the top level of the state list, cancelling the last \ttindex{by}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   159
command.  It provides a limited undo facility, and the {\tt undo} command
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   160
can cancel it.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   161
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   162
\item[\ttindexbold{choplev} {\it n};] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   163
truncates the state list to level~{\it n}. 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   164
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   165
\item[\ttindexbold{back}();]
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   166
searches the state list for a non-empty branch point, starting from the top
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   167
level.  The first one found becomes the current proof state --- the most
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   168
recent alternative branch is taken.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   169
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   170
\item[\ttindexbold{undo}();] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   171
cancels the most recent change to the proof state by the commands \ttindex{by},
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   172
{\tt chop}, {\tt choplev}, and~{\tt back}.  It {\bf cannot}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   173
cancel {\tt goal} or {\tt undo} itself.  It can be repeated to
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   174
cancel a series of commands.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   175
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   176
\noindent{\bf Error indications for {\tt back}:}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   177
\begin{itemize}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   178
\item
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   179
{\tt"Warning:\ same as previous choice at this level"} means that {\tt
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   180
back} found a non-empty branch point, but that it contained the same proof
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   181
state as the current one.  
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   182
\item
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   183
{\tt "Warning:\ signature of proof state has changed"} means the signature
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   184
of the alternative proof state differs from that of the current state.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   185
\item 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   186
{\tt "back:\ no alternatives"} means {\tt back} could find no alternative
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   187
proof state.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   188
\end{itemize}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   189
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   190
\subsection{Printing the proof state}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   191
\index{printing!proof state|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   192
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   193
pr    : unit -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   194
prlev : int -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   195
goals_limit: int ref \hfill{\bf initially 10}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   196
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   197
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   198
\item[\ttindexbold{pr}();] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   199
prints the current proof state.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   200
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   201
\item[\ttindexbold{prlev} {\it n};] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   202
prints the proof state at level {\it n}.  This allows you to review the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   203
previous steps of the proof.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   204
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   205
\item[\ttindexbold{goals_limit} \tt:= {\it k};] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   206
specifies~$k$ as the maximum number of subgoals to print.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   207
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   208
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   209
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   210
\subsection{Timing}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   211
\index{printing!timing statistics|bold}\index{proofs!timing|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   212
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   213
proof_timing: bool ref \hfill{\bf initially false}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   214
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   215
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   216
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   217
\item[\ttindexbold{proof_timing} \tt:= true;] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   218
makes the \ttindex{by} and \ttindex{prove_goal} commands display how much
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   219
processor time was spent.  This information is compiler-dependent.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   220
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   221
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   222
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   223
\section{Shortcuts for applying tactics}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   224
\index{shortcuts!for ``{\tt by}'' commands|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   225
These commands call \ttindex{by} with common tactics.  Their chief purpose
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   226
is to minimise typing, although the scanning shortcuts are useful in their
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   227
own right.  Chapter~\ref{tactics} explains the tactics themselves.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   228
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   229
\subsection{Refining a given subgoal}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   230
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   231
ba: int -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   232
br: thm -> int -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   233
be: thm -> int -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   234
bd: thm -> int -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   235
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   236
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   237
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   238
\item[\ttindexbold{ba} {\it i};] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   239
performs \hbox{\tt by (assume_tac {\it i});}\index{*assume_tac}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   240
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   241
\item[\ttindexbold{br} {\it thm} {\it i};] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   242
performs \hbox{\tt by (resolve_tac [{\it thm}] {\it i});}\index{*resolve_tac}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   243
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   244
\item[\ttindexbold{be} {\it thm} {\it i};] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   245
performs \hbox{\tt by (eresolve_tac [{\it thm}] {\it i});}\index{*eresolve_tac}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   246
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   247
\item[\ttindexbold{bd} {\it thm} {\it i};] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   248
performs \hbox{\tt by (dresolve_tac [{\it thm}] {\it i});}\index{*dresolve_tac}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   249
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   250
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   251
\subsubsection{Resolution with a list of theorems}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   252
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   253
brs: thm list -> int -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   254
bes: thm list -> int -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   255
bds: thm list -> int -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   256
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   257
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   258
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   259
\item[\ttindexbold{brs} {\it thms} {\it i};] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   260
performs \hbox{\tt by (resolve_tac {\it thms} {\it i});}\index{*resolve_tac}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   261
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   262
\item[\ttindexbold{bes} {\it thms} {\it i};] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   263
performs \hbox{\tt by (eresolve_tac {\it thms} {\it i});}\index{*eresolve_tac}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   264
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   265
\item[\ttindexbold{bds} {\it thms} {\it i};] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   266
performs \hbox{\tt by (dresolve_tac {\it thms} {\it i});}\index{*dresolve_tac}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   267
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   268
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   269
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   270
\subsection{Scanning shortcuts}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   271
\index{shortcuts!scanning for subgoals|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   272
These shortcuts scan for a suitable subgoal (starting from subgoal~1).
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   273
They refine the first subgoal for which the tactic succeeds.  Thus, they
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   274
require less typing than {\tt br}, etc.  They display the selected
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   275
subgoal's number; please watch this, for it may not be what you expect!
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   276
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   277
\subsubsection{Proof by assumption and resolution}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   278
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   279
fa: unit -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   280
fr: thm -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   281
fe: thm -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   282
fd: thm -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   283
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   284
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   285
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   286
\item[\ttindexbold{fa}();] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   287
solves some subgoal by assumption.\index{*assume_tac}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   288
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   289
\item[\ttindexbold{fr} {\it thm};] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   290
refines some subgoal using \hbox{\tt resolve_tac [{\it thm}]}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   291
\index{*resolve_tac}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   292
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   293
\item[\ttindexbold{fe} {\it thm};] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   294
refines some subgoal using \hbox{\tt eresolve_tac [{\it thm}]}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   295
\index{*eresolve_tac}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   296
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   297
\item[\ttindexbold{fd} {\it thm};] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   298
refines some subgoal using \hbox{\tt dresolve_tac [{\it thm}]}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   299
\index{*dresolve_tac}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   300
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   301
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   302
\subsubsection{Resolution with a list of theorems}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   303
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   304
frs: thm list -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   305
fes: thm list -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   306
fds: thm list -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   307
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   308
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   309
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   310
\item[\ttindexbold{frs} {\it thms};] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   311
refines some subgoal using \hbox{\tt resolve_tac {\it thms}}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   312
\index{*resolve_tac}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   313
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   314
\item[\ttindexbold{fes} {\it thms};] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   315
refines some subgoal using \hbox{\tt eresolve_tac {\it thms}} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   316
\index{*eresolve_tac}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   317
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   318
\item[\ttindexbold{fds} {\it thms};] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   319
refines some subgoal using \hbox{\tt dresolve_tac {\it thms}} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   320
\index{*dresolve_tac}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   321
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   322
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   323
\subsection{Other shortcuts}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   324
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   325
bw  : thm -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   326
bws : thm list -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   327
ren : string -> int -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   328
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   329
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   330
\item[\ttindexbold{bw} {\it def};] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   331
performs \hbox{\tt by (rewrite_goals_tac [{\it def}]);}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   332
It unfolds definitions in the subgoals (but not the main goal), by
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   333
meta-rewriting with the given definition.\index{*rewrite_goals_tac}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   334
\index{rewriting!meta-level}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   335
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   336
\item[\ttindexbold{bws}] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   337
is like {\tt bw} but takes a list of definitions.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   338
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   339
\item[\ttindexbold{ren} {\it names} {\it i};] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   340
performs \hbox{\tt by (rename_tac {\it names} {\it i});} it renames
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   341
parameters in subgoal~$i$.  (Ignore the message {\tt Warning:\ same as
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   342
previous level}.)
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   343
\index{*rename_tac}\index{parameters!renaming}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   344
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   345
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   346
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   347
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   348
\section{Advanced features}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   349
\subsection{Executing batch proofs}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   350
\index{proofs!batch|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   351
\index{batch execution|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   352
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   353
prove_goal  :  theory->          string->(thm list->tactic list)->thm
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   354
prove_goalw :  theory->thm list->string->(thm list->tactic list)->thm
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   355
prove_goalw_cterm: thm list->Sign.cterm->(thm list->tactic list)->thm
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   356
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   357
A collection of derivations may be stored for batch execution using these
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   358
functions.  They create an initial proof state, then apply a tactic to it,
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   359
yielding a sequence of final proof states.  The head of the sequence is
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   360
returned, provided it is an instance of the theorem originally proposed.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   361
The forms {\tt prove_goal}, {\tt prove_goalw} and {\tt prove_goalw_cterm}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   362
are analogous to \ttindex{goal}, \ttindex{goalw} and \ttindex{goalw_cterm}.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   363
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   364
The tactic is specified by a function from theorem lists to tactic lists.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   365
The function is applied to the list of meta-hypotheses taken from the main
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   366
goal.  The resulting tactics are applied in sequence (using {\tt EVERY}).
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   367
For example, a proof consisting of the commands
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   368
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   369
val prems = goal {\it theory} {\it formula};
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   370
by \(tac@1\);  \ldots  by \(tac@n\);
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   371
val my_thm = result();
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   372
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   373
can be transformed to an expression as follows:
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   374
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   375
val my_thm = prove_goal {\it theory} {\it formula}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   376
 (fn prems=> [ \(tac@1\), \ldots, \(tac@n\) ]);
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   377
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   378
The methods perform identical processing of the initial {\it formula} and
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   379
the final proof state, but {\tt prove_goal} executes the tactic as a
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   380
atomic operation, bypassing the subgoal module.  The commands can also be
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   381
encapsulated in an expression using~{\tt let}:
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   382
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   383
val my_thm = 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   384
    let val prems = goal {\it theory} {\it formula}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   385
    in  by \(tac@1\);  \ldots  by \(tac@n\);  result() end;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   386
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   387
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   388
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   389
\item[\ttindexbold{prove_goal} {\it theory} {\it formula} {\it tacsf}; ] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   390
executes a proof of the {\it formula\/} in the given {\it theory}, using
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   391
the given tactic function.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   392
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   393
\item[\ttindexbold{prove_goalw} {\it theory} {\it defs} {\it formula} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   394
      {\it tacsf}; ]
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   395
is like {\tt prove_goal} but also applies the list of {\it defs\/} as
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   396
meta-rewrite rules to the first subgoal and the premises.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   397
\index{rewriting!meta-level}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   398
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   399
\item[\ttindexbold{prove_goalw_cterm} {\it theory} {\it defs} {\it ct}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   400
      {\it tacsf}; ] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   401
is a version of {\tt prove_goalw} for special applications.  The main
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   402
goal is supplied as a cterm, not as a string.  Typically, the cterm is
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   403
created from a term~$t$ by \hbox{\tt Sign.cterm_of (sign_of thy) $t$}.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   404
\index{*Sign.cterm_of}\index{*sign_of}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   405
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   406
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   407
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   408
\subsection{Managing multiple proofs}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   409
\index{proofs!managing multiple|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   410
You may save the current state of the subgoal module and resume work on it
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   411
later.  This serves two purposes.  
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   412
\begin{enumerate}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   413
\item At some point, you may be uncertain of the next step, and
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   414
wish to experiment.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   415
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   416
\item During a proof, you may see that a lemma should be proved first.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   417
\end{enumerate}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   418
Each saved proof state consists of a list of levels; \ttindex{chop} behaves
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   419
independently for each of the saved proofs.  In addition, each saved state
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   420
carries a separate \ttindex{undo} list.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   421
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   422
\subsubsection{The stack of proof states}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   423
\index{proofs!stacking|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   424
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   425
push_proof   : unit -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   426
pop_proof    : unit -> thm list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   427
rotate_proof : unit -> thm list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   428
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   429
The subgoal module maintains a stack of proof states.  Most subgoal
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   430
commands affect only the top of the stack.  The \ttindex{goal} command {\bf
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   431
replaces} the top of the stack; the only command that pushes a proof on the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   432
stack is {\tt push_proof}.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   433
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   434
To save some point of the proof, call {\tt push_proof}.  You may now
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   435
state a lemma using \ttindex{goal}, or simply continue to apply tactics.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   436
Later, you can return to the saved point by calling {\tt pop_proof} or 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   437
{\tt rotate_proof}. 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   438
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   439
To view the entire stack, call {\tt rotate_proof} repeatedly; as it rotates
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   440
the stack, it prints the new top element.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   441
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   442
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   443
\item[\ttindexbold{push_proof}();]  
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   444
duplicates the top element of the stack, pushing a copy of the current
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   445
proof state on to the stack.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   446
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   447
\item[\ttindexbold{pop_proof}();]  
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   448
discards the top element of the stack.  It returns the list of
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   449
meta-hypotheses associated with the new proof;  you should bind these to an
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   450
\ML\ identifier.  They can also be obtained by calling \ttindex{premises}.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   451
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   452
\item[\ttindexbold{rotate_proof}]  
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   453
rotates the stack, moving the top element to the bottom.  It returns the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   454
list of assumptions associated with the new proof.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   455
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   456
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   457
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   458
\subsubsection{Saving and restoring proof states}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   459
\index{proofs!saving and restoring|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   460
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   461
save_proof    : unit -> proof
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   462
restore_proof : proof -> thm list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   463
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   464
States of the subgoal module may be saved as \ML\ values of
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   465
type~\ttindex{proof}, and later restored.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   466
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   467
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   468
\item[\ttindexbold{save_proof}();]  
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   469
returns the current state, which is on top of the stack.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   470
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   471
\item[\ttindexbold{restore_proof} {\it prf}]  
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   472
replaces the top of the stack by~{\it prf}.  It returns the list of
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   473
assumptions associated with the new proof.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   474
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   475
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   476
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   477
\subsection{Debugging and inspecting}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   478
\index{proofs!debugging|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   479
\index{debugging}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   480
These specialized operations support the debugging of tactics.  They refer
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   481
to the current proof state of the subgoal module, and fail if there is no
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   482
proof underway.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   483
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   484
\subsubsection{Reading and printing terms}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   485
\index{reading!terms|bold}\index{printing!terms}\index{printing!types}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   486
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   487
read    : string -> term
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   488
prin    : term -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   489
printyp : typ -> unit
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   490
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   491
These read and print terms (or types) using the syntax associated with the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   492
proof state.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   493
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   494
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   495
\item[\ttindexbold{read} {\it string}]  
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   496
reads the {\it string} as a term, without type checking.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   497
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   498
\item[\ttindexbold{prin} {\it t};]  
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   499
prints the term~$t$ at the terminal.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   500
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   501
\item[\ttindexbold{printyp} {\it T};]  
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   502
prints the type~$T$ at the terminal.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   503
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   504
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   505
\subsubsection{Inspecting the proof state}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   506
\index{proofs!inspecting the state|bold}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   507
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   508
topthm  : unit -> thm
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   509
getgoal : int -> term
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   510
gethyps : int -> thm list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   511
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   512
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   513
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   514
\item[\ttindexbold{topthm}()]  
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   515
returns the proof state as an Isabelle theorem.  This is what \ttindex{by}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   516
would supply to a tactic at this point.  It omits the post-processing of
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   517
\ttindex{result} and \ttindex{uresult}.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   518
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   519
\item[\ttindexbold{getgoal} {\it i}]  
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   520
returns subgoal~$i$ of the proof state, as a term.  You may print
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   521
this using {\tt prin}, though you may have to examine the internal
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   522
data structure in order to locate the problem!
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   523
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   524
\item[\ttindexbold{gethyps} {\it i}]  
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   525
returns the hypotheses of subgoal~$i$ as meta-level assumptions.  In these
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   526
theorems, the subgoal's parameters become free variables.  This command is
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   527
supplied for debugging uses of \ttindex{METAHYPS}.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   528
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   529
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   530
\subsubsection{Filtering lists of rules}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   531
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   532
filter_goal: (term*term->bool) -> thm list -> int -> thm list
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   533
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   534
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   535
\begin{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   536
\item[\ttindexbold{filter_goal} {\it could} {\it ths} {\it i}] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   537
applies \hbox{\tt filter_thms {\it could}} to subgoal~$i$ of the proof
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   538
state and returns the list of theorems that survive the filtering. 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   539
\end{description}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   540
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   541
\index{subgoal module|)}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   542
\index{proofs|)}