doc-src/Ref/tctical.tex
author wenzelm
Wed, 25 Jan 2012 18:18:59 +0100
changeset 46258 89ee3bc580a8
parent 46257 3ba3681d8930
child 46259 6fab37137dcb
permissions -rw-r--r--
updated THEN, ORELSE, APPEND, and derivatives; discontinued obscure INTLEAVE;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
30184
37969710e61f removed parts of the manual that are clearly obsolete, or covered by
wenzelm
parents: 13104
diff changeset
     1
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     2
\chapter{Tacticals}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     3
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     4
\section{The basic tacticals}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     5
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     6
\subsection{Repetition tacticals}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
     7
\index{tacticals!repetition}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
     8
\begin{ttbox} 
8149
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
     9
TRY             : tactic -> tactic
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
    10
REPEAT_DETERM   : tactic -> tactic
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
    11
REPEAT_DETERM_N : int -> tactic -> tactic
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
    12
REPEAT          : tactic -> tactic
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
    13
REPEAT1         : tactic -> tactic
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
    14
DETERM_UNTIL    : (thm -> bool) -> tactic -> tactic
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
    15
trace_REPEAT    : bool ref \hfill{\bf initially false}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    16
\end{ttbox}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    17
\begin{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    18
\item[\ttindexbold{TRY} {\it tac}] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    19
applies {\it tac\/} to the proof state and returns the resulting sequence,
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    20
if non-empty; otherwise it returns the original state.  Thus, it applies
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    21
{\it tac\/} at most once.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    22
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    23
\item[\ttindexbold{REPEAT_DETERM} {\it tac}] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    24
applies {\it tac\/} to the proof state and, recursively, to the head of the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    25
resulting sequence.  It returns the first state to make {\it tac\/} fail.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    26
It is deterministic, discarding alternative outcomes.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    27
8149
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
    28
\item[\ttindexbold{REPEAT_DETERM_N} {\it n} {\it tac}] 
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
    29
is like \hbox{\tt REPEAT_DETERM {\it tac}} but the number of repititions
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
    30
is bound by {\it n} (unless negative).
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
    31
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    32
\item[\ttindexbold{REPEAT} {\it tac}] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    33
applies {\it tac\/} to the proof state and, recursively, to each element of
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    34
the resulting sequence.  The resulting sequence consists of those states
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    35
that make {\it tac\/} fail.  Thus, it applies {\it tac\/} as many times as
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    36
possible (including zero times), and allows backtracking over each
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    37
invocation of {\it tac}.  It is more general than {\tt REPEAT_DETERM}, but
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    38
requires more space.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    39
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    40
\item[\ttindexbold{REPEAT1} {\it tac}] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    41
is like \hbox{\tt REPEAT {\it tac}} but it always applies {\it tac\/} at
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    42
least once, failing if this is impossible.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    43
8149
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
    44
\item[\ttindexbold{DETERM_UNTIL} {\it p} {\it tac}] 
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
    45
applies {\it tac\/} to the proof state and, recursively, to the head of the
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
    46
resulting sequence, until the predicate {\it p} (applied on the proof state)
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
    47
yields {\it true}. It fails if {\it tac\/} fails on any of the intermediate 
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
    48
states. It is deterministic, discarding alternative outcomes.
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
    49
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3108
diff changeset
    50
\item[set \ttindexbold{trace_REPEAT};] 
286
e7efbf03562b first draft of Springer book
lcp
parents: 104
diff changeset
    51
enables an interactive tracing mode for the tacticals {\tt REPEAT_DETERM}
e7efbf03562b first draft of Springer book
lcp
parents: 104
diff changeset
    52
and {\tt REPEAT}.  To view the tracing options, type {\tt h} at the prompt.
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    53
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    54
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    55
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    56
\subsection{Identities for tacticals}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    57
\index{tacticals!identities for}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    58
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    59
all_tac : tactic
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    60
no_tac  : tactic
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    61
\end{ttbox}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    62
\begin{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    63
\item[\ttindexbold{all_tac}] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    64
maps any proof state to the one-element sequence containing that state.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    65
Thus, it succeeds for all states.  It is the identity element of the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    66
tactical \ttindex{THEN}\@.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    67
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    68
\item[\ttindexbold{no_tac}] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    69
maps any proof state to the empty sequence.  Thus it succeeds for no state.
46258
89ee3bc580a8 updated THEN, ORELSE, APPEND, and derivatives;
wenzelm
parents: 46257
diff changeset
    70
It is the identity element of \ttindex{ORELSE}, and
89ee3bc580a8 updated THEN, ORELSE, APPEND, and derivatives;
wenzelm
parents: 46257
diff changeset
    71
\ttindex{APPEND}\@.  Also, it is a zero element for \ttindex{THEN},
89ee3bc580a8 updated THEN, ORELSE, APPEND, and derivatives;
wenzelm
parents: 46257
diff changeset
    72
which means that
89ee3bc580a8 updated THEN, ORELSE, APPEND, and derivatives;
wenzelm
parents: 46257
diff changeset
    73
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    74
\hbox{\tt$tac$ THEN no_tac} is equivalent to {\tt no_tac}.
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
    75
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    76
These primitive tactics are useful when writing tacticals.  For example,
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    77
\ttindexbold{TRY} and \ttindexbold{REPEAT} (ignoring tracing) can be coded
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    78
as follows: 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    79
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    80
fun TRY tac = tac ORELSE all_tac;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    81
3108
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1118
diff changeset
    82
fun REPEAT tac =
335efc3f5632 misc updates, tuning, cleanup;
wenzelm
parents: 1118
diff changeset
    83
     (fn state => ((tac THEN REPEAT tac) ORELSE all_tac) state);
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    84
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    85
If $tac$ can return multiple outcomes then so can \hbox{\tt REPEAT $tac$}.
46258
89ee3bc580a8 updated THEN, ORELSE, APPEND, and derivatives;
wenzelm
parents: 46257
diff changeset
    86
Since {\tt REPEAT} uses \ttindex{ORELSE} and not {\tt APPEND}, it
89ee3bc580a8 updated THEN, ORELSE, APPEND, and derivatives;
wenzelm
parents: 46257
diff changeset
    87
applies $tac$ as many times as possible in each outcome.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    88
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    89
\begin{warn}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    90
Note {\tt REPEAT}'s explicit abstraction over the proof state.  Recursive
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    91
tacticals must be coded in this awkward fashion to avoid infinite
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    92
recursion.  With the following definition, \hbox{\tt REPEAT $tac$} would
332
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
    93
loop due to \ML's eager evaluation strategy:
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    94
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    95
fun REPEAT tac = (tac THEN REPEAT tac) ORELSE all_tac;
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    96
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    97
\par\noindent
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    98
The built-in {\tt REPEAT} avoids~{\tt THEN}, handling sequences explicitly
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
    99
and using tail recursion.  This sacrifices clarity, but saves much space by
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   100
discarding intermediate proof states.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   101
\end{warn}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   102
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   103
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   104
\section{Control and search tacticals}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   105
\index{search!tacticals|(}
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   106
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   107
A predicate on theorems, namely a function of type \hbox{\tt thm->bool},
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   108
can test whether a proof state enjoys some desirable property --- such as
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   109
having no subgoals.  Tactics that search for satisfactory states are easy
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   110
to express.  The main search procedures, depth-first, breadth-first and
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   111
best-first, are provided as tacticals.  They generate the search tree by
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   112
repeatedly applying a given tactic.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   113
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   114
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   115
\subsection{Filtering a tactic's results}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   116
\index{tacticals!for filtering}
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   117
\index{tactics!filtering results of}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   118
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   119
FILTER  : (thm -> bool) -> tactic -> tactic
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   120
CHANGED : tactic -> tactic
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   121
\end{ttbox}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   122
\begin{ttdescription}
1118
93ba05d8ccdc Indexing of FILTER and COND
lcp
parents: 332
diff changeset
   123
\item[\ttindexbold{FILTER} {\it p} $tac$] 
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   124
applies $tac$ to the proof state and returns a sequence consisting of those
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   125
result states that satisfy~$p$.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   126
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   127
\item[\ttindexbold{CHANGED} {\it tac}] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   128
applies {\it tac\/} to the proof state and returns precisely those states
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   129
that differ from the original state.  Thus, \hbox{\tt CHANGED {\it tac}}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   130
always has some effect on the state.
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   131
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   132
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   133
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   134
\subsection{Depth-first search}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   135
\index{tacticals!searching}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   136
\index{tracing!of searching tacticals}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   137
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   138
DEPTH_FIRST   : (thm->bool) -> tactic -> tactic
332
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
   139
DEPTH_SOLVE   :                tactic -> tactic
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
   140
DEPTH_SOLVE_1 :                tactic -> tactic
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   141
trace_DEPTH_FIRST: bool ref \hfill{\bf initially false}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   142
\end{ttbox}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   143
\begin{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   144
\item[\ttindexbold{DEPTH_FIRST} {\it satp} {\it tac}] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   145
returns the proof state if {\it satp} returns true.  Otherwise it applies
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   146
{\it tac}, then recursively searches from each element of the resulting
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   147
sequence.  The code uses a stack for efficiency, in effect applying
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   148
\hbox{\tt {\it tac} THEN DEPTH_FIRST {\it satp} {\it tac}} to the state.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   149
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   150
\item[\ttindexbold{DEPTH_SOLVE} {\it tac}] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   151
uses {\tt DEPTH_FIRST} to search for states having no subgoals.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   152
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   153
\item[\ttindexbold{DEPTH_SOLVE_1} {\it tac}] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   154
uses {\tt DEPTH_FIRST} to search for states having fewer subgoals than the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   155
given state.  Thus, it insists upon solving at least one subgoal.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   156
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3108
diff changeset
   157
\item[set \ttindexbold{trace_DEPTH_FIRST};] 
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   158
enables interactive tracing for {\tt DEPTH_FIRST}.  To view the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   159
tracing options, type {\tt h} at the prompt.
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   160
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   161
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   162
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   163
\subsection{Other search strategies}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   164
\index{tacticals!searching}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   165
\index{tracing!of searching tacticals}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   166
\begin{ttbox} 
332
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
   167
BREADTH_FIRST   :            (thm->bool) -> tactic -> tactic
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   168
BEST_FIRST      : (thm->bool)*(thm->int) -> tactic -> tactic
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   169
THEN_BEST_FIRST : tactic * ((thm->bool) * (thm->int) * tactic)
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   170
                  -> tactic                    \hfill{\bf infix 1}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   171
trace_BEST_FIRST: bool ref \hfill{\bf initially false}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   172
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   173
These search strategies will find a solution if one exists.  However, they
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   174
do not enumerate all solutions; they terminate after the first satisfactory
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   175
result from {\it tac}.
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   176
\begin{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   177
\item[\ttindexbold{BREADTH_FIRST} {\it satp} {\it tac}] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   178
uses breadth-first search to find states for which {\it satp\/} is true.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   179
For most applications, it is too slow.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   180
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   181
\item[\ttindexbold{BEST_FIRST} $(satp,distf)$ {\it tac}] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   182
does a heuristic search, using {\it distf\/} to estimate the distance from
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   183
a satisfactory state.  It maintains a list of states ordered by distance.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   184
It applies $tac$ to the head of this list; if the result contains any
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   185
satisfactory states, then it returns them.  Otherwise, {\tt BEST_FIRST}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   186
adds the new states to the list, and continues.  
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   187
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   188
The distance function is typically \ttindex{size_of_thm}, which computes
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   189
the size of the state.  The smaller the state, the fewer and simpler
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   190
subgoals it has.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   191
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   192
\item[$tac@0$ \ttindexbold{THEN_BEST_FIRST} $(satp,distf,tac)$] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   193
is like {\tt BEST_FIRST}, except that the priority queue initially
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   194
contains the result of applying $tac@0$ to the proof state.  This tactical
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   195
permits separate tactics for starting the search and continuing the search.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   196
4317
7264fa2ff2ec several minor updates;
wenzelm
parents: 3108
diff changeset
   197
\item[set \ttindexbold{trace_BEST_FIRST};] 
286
e7efbf03562b first draft of Springer book
lcp
parents: 104
diff changeset
   198
enables an interactive tracing mode for the tactical {\tt BEST_FIRST}.  To
e7efbf03562b first draft of Springer book
lcp
parents: 104
diff changeset
   199
view the tracing options, type {\tt h} at the prompt.
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   200
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   201
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   202
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   203
\subsection{Auxiliary tacticals for searching}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   204
\index{tacticals!conditional}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   205
\index{tacticals!deterministic}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   206
\begin{ttbox} 
8149
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
   207
COND                : (thm->bool) -> tactic -> tactic -> tactic
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
   208
IF_UNSOLVED         : tactic -> tactic
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
   209
SOLVE               : tactic -> tactic
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
   210
DETERM              : tactic -> tactic
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
   211
DETERM_UNTIL_SOLVED : tactic -> tactic
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   212
\end{ttbox}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   213
\begin{ttdescription}
1118
93ba05d8ccdc Indexing of FILTER and COND
lcp
parents: 332
diff changeset
   214
\item[\ttindexbold{COND} {\it p} $tac@1$ $tac@2$] 
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   215
applies $tac@1$ to the proof state if it satisfies~$p$, and applies $tac@2$
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   216
otherwise.  It is a conditional tactical in that only one of $tac@1$ and
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   217
$tac@2$ is applied to a proof state.  However, both $tac@1$ and $tac@2$ are
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   218
evaluated because \ML{} uses eager evaluation.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   219
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   220
\item[\ttindexbold{IF_UNSOLVED} {\it tac}] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   221
applies {\it tac\/} to the proof state if it has any subgoals, and simply
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   222
returns the proof state otherwise.  Many common tactics, such as {\tt
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   223
resolve_tac}, fail if applied to a proof state that has no subgoals.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   224
5754
98744e38ded1 added SOLVE tactical
oheimb
parents: 5371
diff changeset
   225
\item[\ttindexbold{SOLVE} {\it tac}] 
98744e38ded1 added SOLVE tactical
oheimb
parents: 5371
diff changeset
   226
applies {\it tac\/} to the proof state and then fails iff there are subgoals
98744e38ded1 added SOLVE tactical
oheimb
parents: 5371
diff changeset
   227
left.
98744e38ded1 added SOLVE tactical
oheimb
parents: 5371
diff changeset
   228
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   229
\item[\ttindexbold{DETERM} {\it tac}] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   230
applies {\it tac\/} to the proof state and returns the head of the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   231
resulting sequence.  {\tt DETERM} limits the search space by making its
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   232
argument deterministic.
8149
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
   233
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
   234
\item[\ttindexbold{DETERM_UNTIL_SOLVED} {\it tac}] 
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
   235
forces repeated deterministic application of {\it tac\/} to the proof state 
941afb897532 added tacticals DETERM_UNTIL and DETERM_UNTIL_SOLVED
oheimb
parents: 6569
diff changeset
   236
until the goal is solved completely.
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   237
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   238
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   239
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   240
\subsection{Predicates and functions useful for searching}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   241
\index{theorems!size of}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   242
\index{theorems!equality of}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   243
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   244
has_fewer_prems : int -> thm -> bool
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   245
eq_thm          : thm * thm -> bool
13104
df7aac8543c9 clarified eq_thm;
wenzelm
parents: 8149
diff changeset
   246
eq_thm_prop     : thm * thm -> bool
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   247
size_of_thm     : thm -> int
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   248
\end{ttbox}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   249
\begin{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   250
\item[\ttindexbold{has_fewer_prems} $n$ $thm$] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   251
reports whether $thm$ has fewer than~$n$ premises.  By currying,
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   252
\hbox{\tt has_fewer_prems $n$} is a predicate on theorems; it may 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   253
be given to the searching tacticals.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   254
6569
wenzelm
parents: 5754
diff changeset
   255
\item[\ttindexbold{eq_thm} ($thm@1$, $thm@2$)] reports whether $thm@1$ and
13104
df7aac8543c9 clarified eq_thm;
wenzelm
parents: 8149
diff changeset
   256
  $thm@2$ are equal.  Both theorems must have compatible signatures.  Both
df7aac8543c9 clarified eq_thm;
wenzelm
parents: 8149
diff changeset
   257
  theorems must have the same conclusions, the same hypotheses (in the same
df7aac8543c9 clarified eq_thm;
wenzelm
parents: 8149
diff changeset
   258
  order), and the same set of sort hypotheses.  Names of bound variables are
df7aac8543c9 clarified eq_thm;
wenzelm
parents: 8149
diff changeset
   259
  ignored.
df7aac8543c9 clarified eq_thm;
wenzelm
parents: 8149
diff changeset
   260
  
df7aac8543c9 clarified eq_thm;
wenzelm
parents: 8149
diff changeset
   261
\item[\ttindexbold{eq_thm_prop} ($thm@1$, $thm@2$)] reports whether the
df7aac8543c9 clarified eq_thm;
wenzelm
parents: 8149
diff changeset
   262
  propositions of $thm@1$ and $thm@2$ are equal.  Names of bound variables are
df7aac8543c9 clarified eq_thm;
wenzelm
parents: 8149
diff changeset
   263
  ignored.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   264
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   265
\item[\ttindexbold{size_of_thm} $thm$] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   266
computes the size of $thm$, namely the number of variables, constants and
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   267
abstractions in its conclusion.  It may serve as a distance function for 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   268
\ttindex{BEST_FIRST}. 
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   269
\end{ttdescription}
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   270
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   271
\index{search!tacticals|)}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   272
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   273
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   274
\section{Tacticals for subgoal numbering}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   275
When conducting a backward proof, we normally consider one goal at a time.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   276
A tactic can affect the entire proof state, but many tactics --- such as
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   277
{\tt resolve_tac} and {\tt assume_tac} --- work on a single subgoal.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   278
Subgoals are designated by a positive integer, so Isabelle provides
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   279
tacticals for combining values of type {\tt int->tactic}.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   280
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   281
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   282
\subsection{Restricting a tactic to one subgoal}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   283
\index{tactics!restricting to a subgoal}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   284
\index{tacticals!for restriction to a subgoal}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   285
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   286
SELECT_GOAL : tactic -> int -> tactic
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   287
\end{ttbox}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   288
\begin{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   289
\item[\ttindexbold{SELECT_GOAL} {\it tac} $i$] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   290
restricts the effect of {\it tac\/} to subgoal~$i$ of the proof state.  It
46257
3ba3681d8930 removed obscure/outdated material;
wenzelm
parents: 30184
diff changeset
   291
fails if there is no subgoal~$i$, or if {\it tac\/} changes the main goal.
3ba3681d8930 removed obscure/outdated material;
wenzelm
parents: 30184
diff changeset
   292
It applies {\it tac\/} to a dummy proof state and uses the result to
3ba3681d8930 removed obscure/outdated material;
wenzelm
parents: 30184
diff changeset
   293
refine the original proof state at subgoal~$i$.  If {\it tac\/}
3ba3681d8930 removed obscure/outdated material;
wenzelm
parents: 30184
diff changeset
   294
returns multiple results then so does \hbox{\tt SELECT_GOAL {\it tac}
3ba3681d8930 removed obscure/outdated material;
wenzelm
parents: 30184
diff changeset
   295
  $i$}.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   296
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   297
{\tt SELECT_GOAL} works by creating a state of the form $\phi\Imp\phi$,
332
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
   298
with the one subgoal~$\phi$.  If subgoal~$i$ has the form $\psi\Imp\theta$
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
   299
then $(\psi\Imp\theta)\Imp(\psi\Imp\theta)$ is in fact
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
   300
$\List{\psi\Imp\theta;\; \psi}\Imp\theta$, a proof state with two subgoals.
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
   301
Such a proof state might cause tactics to go astray.  Therefore {\tt
01b87a921967 final Springer copy
lcp
parents: 323
diff changeset
   302
  SELECT_GOAL} inserts a quantifier to create the state
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   303
\[ (\Forall x.\psi\Imp\theta)\Imp(\Forall x.\psi\Imp\theta). \]
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   304
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   305
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   306
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   307
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   308
\subsection{Scanning for a subgoal by number}
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   309
\index{tacticals!scanning for subgoals}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   310
\begin{ttbox} 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   311
ALLGOALS         : (int -> tactic) -> tactic
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   312
TRYALL           : (int -> tactic) -> tactic
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   313
SOMEGOAL         : (int -> tactic) -> tactic
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   314
FIRSTGOAL        : (int -> tactic) -> tactic
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   315
REPEAT_SOME      : (int -> tactic) -> tactic
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   316
REPEAT_FIRST     : (int -> tactic) -> tactic
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   317
trace_goalno_tac : (int -> tactic) -> int -> tactic
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   318
\end{ttbox}
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   319
These apply a tactic function of type {\tt int -> tactic} to all the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   320
subgoal numbers of a proof state, and join the resulting tactics using
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   321
\ttindex{THEN} or \ttindex{ORELSE}\@.  Thus, they apply the tactic to all the
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   322
subgoals, or to one subgoal.  
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   323
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   324
Suppose that the original proof state has $n$ subgoals.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   325
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   326
\begin{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   327
\item[\ttindexbold{ALLGOALS} {\it tacf}] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   328
is equivalent to
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   329
\hbox{\tt$tacf(n)$ THEN \ldots{} THEN $tacf(1)$}.  
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   330
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   331
It applies {\it tacf} to all the subgoals, counting downwards (to
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   332
avoid problems when subgoals are added or deleted).
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   333
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   334
\item[\ttindexbold{TRYALL} {\it tacf}] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   335
is equivalent to
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   336
\hbox{\tt TRY$(tacf(n))$ THEN \ldots{} THEN TRY$(tacf(1))$}.  
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   337
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   338
It attempts to apply {\it tacf} to all the subgoals.  For instance,
286
e7efbf03562b first draft of Springer book
lcp
parents: 104
diff changeset
   339
the tactic \hbox{\tt TRYALL assume_tac} attempts to solve all the subgoals by
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   340
assumption.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   341
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   342
\item[\ttindexbold{SOMEGOAL} {\it tacf}] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   343
is equivalent to
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   344
\hbox{\tt$tacf(n)$ ORELSE \ldots{} ORELSE $tacf(1)$}.  
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   345
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   346
It applies {\it tacf} to one subgoal, counting downwards.  For instance,
286
e7efbf03562b first draft of Springer book
lcp
parents: 104
diff changeset
   347
the tactic \hbox{\tt SOMEGOAL assume_tac} solves one subgoal by assumption,
e7efbf03562b first draft of Springer book
lcp
parents: 104
diff changeset
   348
failing if this is impossible.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   349
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   350
\item[\ttindexbold{FIRSTGOAL} {\it tacf}] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   351
is equivalent to
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   352
\hbox{\tt$tacf(1)$ ORELSE \ldots{} ORELSE $tacf(n)$}.  
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   353
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   354
It applies {\it tacf} to one subgoal, counting upwards.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   355
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   356
\item[\ttindexbold{REPEAT_SOME} {\it tacf}] 
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   357
applies {\it tacf} once or more to a subgoal, counting downwards.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   358
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   359
\item[\ttindexbold{REPEAT_FIRST} {\it tacf}] 
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   360
applies {\it tacf} once or more to a subgoal, counting upwards.
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   361
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   362
\item[\ttindexbold{trace_goalno_tac} {\it tac} {\it i}] 
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   363
applies \hbox{\it tac i\/} to the proof state.  If the resulting sequence
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   364
is non-empty, then it is returned, with the side-effect of printing {\tt
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   365
Subgoal~$i$ selected}.  Otherwise, {\tt trace_goalno_tac} returns the empty
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   366
sequence and prints nothing.
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   367
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   368
It indicates that `the tactic worked for subgoal~$i$' and is mainly used
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   369
with {\tt SOMEGOAL} and {\tt FIRSTGOAL}.
323
361a71713176 penultimate Springer draft
lcp
parents: 286
diff changeset
   370
\end{ttdescription}
104
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   371
d8205bb279a7 Initial revision
lcp
parents:
diff changeset
   372
\index{tacticals|)}
5371
e27558a68b8d emacs local vars;
wenzelm
parents: 4317
diff changeset
   373
e27558a68b8d emacs local vars;
wenzelm
parents: 4317
diff changeset
   374
e27558a68b8d emacs local vars;
wenzelm
parents: 4317
diff changeset
   375
%%% Local Variables: 
e27558a68b8d emacs local vars;
wenzelm
parents: 4317
diff changeset
   376
%%% mode: latex
e27558a68b8d emacs local vars;
wenzelm
parents: 4317
diff changeset
   377
%%% TeX-master: "ref"
e27558a68b8d emacs local vars;
wenzelm
parents: 4317
diff changeset
   378
%%% End: