doc-src/Sledgehammer/sledgehammer.tex
author blanchet
Fri, 20 Jul 2012 22:19:46 +0200
changeset 49403 fd7958ebee96
parent 49402 302cf211fb3f
child 49405 4147f2bc4442
permissions -rw-r--r--
more MaSh docs
blanchet@36918
     1
\documentclass[a4paper,12pt]{article}
blanchet@36918
     2
\usepackage[T1]{fontenc}
blanchet@36918
     3
\usepackage{amsmath}
blanchet@36918
     4
\usepackage{amssymb}
blanchet@36918
     5
\usepackage[english,french]{babel}
blanchet@36918
     6
\usepackage{color}
blanchet@36918
     7
\usepackage{footmisc}
blanchet@36918
     8
\usepackage{graphicx}
blanchet@36918
     9
%\usepackage{mathpazo}
blanchet@36918
    10
\usepackage{multicol}
blanchet@36918
    11
\usepackage{stmaryrd}
blanchet@36918
    12
%\usepackage[scaled=.85]{beramono}
wenzelm@43382
    13
\usepackage{../../lib/texinputs/isabelle,../iman,../pdfsetup}
blanchet@36918
    14
blanchet@47113
    15
\newcommand\download{\url{http://www21.in.tum.de/~blanchet/\#software}}
blanchet@47113
    16
blanchet@44057
    17
\def\qty#1{\ensuremath{\left<\mathit{#1\/}\right>}}
blanchet@44057
    18
\def\qtybf#1{$\mathbf{\left<\textbf{\textit{#1\/}}\right>}$}
blanchet@44057
    19
blanchet@46387
    20
\newcommand\const[1]{\textsf{#1}}
blanchet@46387
    21
blanchet@36918
    22
%\oddsidemargin=4.6mm
blanchet@36918
    23
%\evensidemargin=4.6mm
blanchet@36918
    24
%\textwidth=150mm
blanchet@36918
    25
%\topmargin=4.6mm
blanchet@36918
    26
%\headheight=0mm
blanchet@36918
    27
%\headsep=0mm
blanchet@36918
    28
%\textheight=234mm
blanchet@36918
    29
blanchet@36918
    30
\def\Colon{\mathord{:\mkern-1.5mu:}}
blanchet@36918
    31
%\def\lbrakk{\mathopen{\lbrack\mkern-3.25mu\lbrack}}
blanchet@36918
    32
%\def\rbrakk{\mathclose{\rbrack\mkern-3.255mu\rbrack}}
blanchet@36918
    33
\def\lparr{\mathopen{(\mkern-4mu\mid}}
blanchet@36918
    34
\def\rparr{\mathclose{\mid\mkern-4mu)}}
blanchet@36918
    35
blanchet@36918
    36
\def\unk{{?}}
blanchet@36918
    37
\def\undef{(\lambda x.\; \unk)}
blanchet@36918
    38
%\def\unr{\textit{others}}
blanchet@36918
    39
\def\unr{\ldots}
blanchet@36918
    40
\def\Abs#1{\hbox{\rm{\flqq}}{\,#1\,}\hbox{\rm{\frqq}}}
blanchet@36918
    41
\def\Q{{\smash{\lower.2ex\hbox{$\scriptstyle?$}}}}
blanchet@36918
    42
blanchet@36918
    43
\urlstyle{tt}
blanchet@36918
    44
blanchet@36918
    45
\begin{document}
blanchet@36918
    46
blanchet@46387
    47
%%% TYPESETTING
blanchet@46387
    48
%\renewcommand\labelitemi{$\bullet$}
blanchet@46387
    49
\renewcommand\labelitemi{\raise.065ex\hbox{\small\textbullet}}
blanchet@46387
    50
blanchet@36918
    51
\selectlanguage{english}
blanchet@36918
    52
blanchet@36918
    53
\title{\includegraphics[scale=0.5]{isabelle_sledgehammer} \\[4ex]
blanchet@36918
    54
Hammering Away \\[\smallskipamount]
blanchet@36918
    55
\Large A User's Guide to Sledgehammer for Isabelle/HOL}
blanchet@36918
    56
\author{\hbox{} \\
blanchet@36918
    57
Jasmin Christian Blanchette \\
blanchet@43843
    58
{\normalsize Institut f\"ur Informatik, Technische Universit\"at M\"unchen} \\[4\smallskipamount]
blanchet@43843
    59
{\normalsize with contributions from} \\[4\smallskipamount]
blanchet@43843
    60
Lawrence C. Paulson \\
blanchet@43843
    61
{\normalsize Computer Laboratory, University of Cambridge} \\
blanchet@36918
    62
\hbox{}}
blanchet@36918
    63
blanchet@36918
    64
\maketitle
blanchet@36918
    65
blanchet@36918
    66
\tableofcontents
blanchet@36918
    67
blanchet@36918
    68
\setlength{\parskip}{.7em plus .2em minus .1em}
blanchet@36918
    69
\setlength{\parindent}{0pt}
blanchet@36918
    70
\setlength{\abovedisplayskip}{\parskip}
blanchet@36918
    71
\setlength{\abovedisplayshortskip}{.9\parskip}
blanchet@36918
    72
\setlength{\belowdisplayskip}{\parskip}
blanchet@36918
    73
\setlength{\belowdisplayshortskip}{.9\parskip}
blanchet@36918
    74
blanchet@36918
    75
% General-purpose enum environment with correct spacing
blanchet@36918
    76
\newenvironment{enum}%
blanchet@36918
    77
    {\begin{list}{}{%
blanchet@36918
    78
        \setlength{\topsep}{.1\parskip}%
blanchet@36918
    79
        \setlength{\partopsep}{.1\parskip}%
blanchet@36918
    80
        \setlength{\itemsep}{\parskip}%
blanchet@36918
    81
        \advance\itemsep by-\parsep}}
blanchet@36918
    82
    {\end{list}}
blanchet@36918
    83
blanchet@36918
    84
\def\pre{\begingroup\vskip0pt plus1ex\advance\leftskip by\leftmargin
blanchet@36918
    85
\advance\rightskip by\leftmargin}
blanchet@36918
    86
\def\post{\vskip0pt plus1ex\endgroup}
blanchet@36918
    87
blanchet@36918
    88
\def\prew{\pre\advance\rightskip by-\leftmargin}
blanchet@36918
    89
\def\postw{\post}
blanchet@36918
    90
blanchet@36918
    91
\section{Introduction}
blanchet@36918
    92
\label{introduction}
blanchet@36918
    93
blanchet@43805
    94
Sledgehammer is a tool that applies automatic theorem provers (ATPs)
blanchet@48432
    95
and satisfiability-modulo-theories (SMT) solvers on the current goal.%
blanchet@48432
    96
\footnote{The distinction between ATPs and SMT solvers is convenient but mostly
blanchet@48432
    97
historical. The two communities are converging, with more and more ATPs
blanchet@48537
    98
supporting typical SMT features such as arithmetic and sorts, and a few SMT
blanchet@48432
    99
solvers parsing ATP syntaxes. There is also a strong technological connection
blanchet@48432
   100
between instantiation-based ATPs (such as iProver and iProver-Eq) and SMT
blanchet@48432
   101
solvers.}
blanchet@48432
   102
%
blanchet@48432
   103
The supported ATPs are E \cite{schulz-2002}, E-SInE \cite{sine}, E-ToFoF
blanchet@48432
   104
\cite{tofof}, iProver \cite{korovin-2009}, iProver-Eq
blanchet@48432
   105
\cite{korovin-sticksel-2010}, LEO-II \cite{leo2}, Satallax \cite{satallax},
blanchet@48432
   106
SNARK \cite{snark}, SPASS \cite{weidenbach-et-al-2009}, Vampire
blanchet@48432
   107
\cite{riazanov-voronkov-2002}, and Waldmeister \cite{waldmeister}. The ATPs are
blanchet@48432
   108
run either locally or remotely via the System\-On\-TPTP web service
blanchet@48432
   109
\cite{sutcliffe-2000}. In addition to the ATPs, the SMT solvers Z3 \cite{z3} is
blanchet@48432
   110
used by default, and you can tell Sledgehammer to try Alt-Ergo \cite{alt-ergo},
blanchet@48432
   111
CVC3 \cite{cvc3}, and Yices \cite{yices} as well; these are run either locally
blanchet@48432
   112
or (for CVC3 and Z3) on a server at the TU M\"unchen.
blanchet@36918
   113
blanchet@40254
   114
The problem passed to the automatic provers consists of your current goal
blanchet@40254
   115
together with a heuristic selection of hundreds of facts (theorems) from the
blanchet@40254
   116
current theory context, filtered by relevance. Because jobs are run in the
blanchet@40254
   117
background, you can continue to work on your proof by other means. Provers can
blanchet@40254
   118
be run in parallel. Any reply (which may arrive half a minute later) will appear
blanchet@40254
   119
in the Proof General response buffer.
blanchet@37517
   120
blanchet@40254
   121
The result of a successful proof search is some source text that usually (but
blanchet@40254
   122
not always) reconstructs the proof within Isabelle. For ATPs, the reconstructed
blanchet@46251
   123
proof relies on the general-purpose \textit{metis} proof method, which
blanchet@46251
   124
integrates the Metis ATP in Isabelle/HOL with explicit inferences going through
blanchet@46251
   125
the kernel. Thus its results are correct by construction.
blanchet@36918
   126
blanchet@39566
   127
In this manual, we will explicitly invoke the \textbf{sledgehammer} command.
blanchet@45607
   128
Sledgehammer also provides an automatic mode that can be enabled via the ``Auto
blanchet@45607
   129
Sledgehammer'' option in Proof General's ``Isabelle'' menu. In this mode,
blanchet@45607
   130
Sledgehammer is run on every newly entered theorem. The time limit for Auto
blanchet@45607
   131
Sledgehammer and other automatic tools can be set using the ``Auto Tools Time
blanchet@45607
   132
Limit'' option.
blanchet@39566
   133
blanchet@36918
   134
\newbox\boxA
blanchet@47126
   135
\setbox\boxA=\hbox{\texttt{NOSPAM}}
blanchet@36918
   136
blanchet@47126
   137
\newcommand\authoremail{\texttt{blan{\color{white}NOSPAM}\kern-\wd\boxA{}chette@\allowbreak
blanchet@43628
   138
in.\allowbreak tum.\allowbreak de}}
blanchet@43628
   139
blanchet@40937
   140
To run Sledgehammer, you must make sure that the theory \textit{Sledgehammer} is
blanchet@40937
   141
imported---this is rarely a problem in practice since it is part of
blanchet@40937
   142
\textit{Main}. Examples of Sledgehammer use can be found in Isabelle's
blanchet@36918
   143
\texttt{src/HOL/Metis\_Examples} directory.
blanchet@36918
   144
Comments and bug reports concerning Sledgehammer or this manual should be
blanchet@43752
   145
directed to the author at \authoremail.
blanchet@36918
   146
blanchet@36918
   147
\vskip2.5\smallskipamount
blanchet@36918
   148
blanchet@36918
   149
%\textbf{Acknowledgment.} The author would like to thank Mark Summerfield for
blanchet@36918
   150
%suggesting several textual improvements.
blanchet@36918
   151
blanchet@36918
   152
\section{Installation}
blanchet@36918
   153
\label{installation}
blanchet@36918
   154
blanchet@49402
   155
Sledgehammer is part of Isabelle, so you do not need to install it. However, it
blanchet@47113
   156
relies on third-party automatic provers (ATPs and SMT solvers).
blanchet@43628
   157
blanchet@47113
   158
Among the ATPs, E, LEO-II, Satallax, SPASS, and Vampire can be run locally; in
blanchet@46210
   159
addition, E, E-SInE, E-ToFoF, iProver, iProver-Eq, LEO-II, Satallax, SNARK,
blanchet@48432
   160
Vampire, and Waldmeister are available remotely via System\-On\-TPTP
blanchet@46210
   161
\cite{sutcliffe-2000}. If you want better performance, you should at least
blanchet@46210
   162
install E and SPASS locally.
blanchet@36918
   163
blanchet@47514
   164
Among the SMT solvers, Alt-Ergo, CVC3, Yices, and Z3 can be run locally, and
blanchet@47514
   165
CVC3 and Z3 can be run remotely on a TU M\"unchen server. If you want better
blanchet@47514
   166
performance and get the ability to replay proofs that rely on the \emph{smt}
blanchet@47514
   167
proof method without an Internet connection, you should at least install Z3
blanchet@47514
   168
locally.
blanchet@36918
   169
blanchet@47113
   170
There are three main ways to install automatic provers on your machine:
blanchet@47113
   171
blanchet@47113
   172
\begin{sloppy}
blanchet@36918
   173
\begin{enum}
blanchet@47113
   174
\item[\labelitemi] If you installed an official Isabelle package, it should
blanchet@47113
   175
already include properly setup executables for CVC3, E, SPASS, and Z3, ready to use.%
blanchet@47113
   176
\footnote{Vampire's and Yices's licenses prevent us from doing the same for
blanchet@47113
   177
these otherwise remarkable tools.}
blanchet@47113
   178
For Z3, you must additionally set the variable
blanchet@47113
   179
\texttt{Z3\_NON\_COMMERCIAL} to ``yes'' to confirm that you are a
blanchet@47113
   180
noncommercial user, either in the environment in which Isabelle is
blanchet@47113
   181
launched or in your
blanchet@48432
   182
\texttt{\$ISABELLE\_HOME\_USER/etc/settings} file.
blanchet@36918
   183
blanchet@47113
   184
\item[\labelitemi] Alternatively, you can download the Isabelle-aware CVC3, E,
blanchet@47113
   185
SPASS, and Z3 binary packages from \download. Extract the archives, then add a
blanchet@47113
   186
line to your \texttt{\$ISABELLE\_HOME\_USER\slash etc\slash components}%
blanchet@42618
   187
\footnote{The variable \texttt{\$ISABELLE\_HOME\_USER} is set by Isabelle at
blanchet@47113
   188
startup. Its value can be retrieved by executing \texttt{isabelle}
blanchet@42618
   189
\texttt{getenv} \texttt{ISABELLE\_HOME\_USER} on the command line.}
blanchet@47113
   190
file with the absolute path to CVC3, E, SPASS, or Z3. For example, if the
blanchet@47113
   191
\texttt{components} file does not exist yet and you extracted SPASS to
blanchet@48448
   192
\texttt{/usr/local/spass-3.8ds}, create it with the single line
blanchet@36918
   193
blanchet@36918
   194
\prew
blanchet@48448
   195
\texttt{/usr/local/spass-3.8ds}
blanchet@36918
   196
\postw
blanchet@36918
   197
blanchet@48432
   198
in it.
blanchet@38289
   199
blanchet@47113
   200
\item[\labelitemi] If you prefer to build E, LEO-II, Satallax, or SPASS
blanchet@47113
   201
manually, or found a Vampire executable somewhere (e.g.,
blanchet@47113
   202
\url{http://www.vprover.org/}), set the environment variable \texttt{E\_HOME},
blanchet@47113
   203
\texttt{LEO2\_HOME}, \texttt{SATALLAX\_HOME}, \texttt{SPASS\_HOME}, or
blanchet@38289
   204
\texttt{VAMPIRE\_HOME} to the directory that contains the \texttt{eproof},
blanchet@47113
   205
\texttt{leo}, \texttt{satallax}, \texttt{SPASS}, or \texttt{vampire} executable.
blanchet@49021
   206
Sledgehammer has been tested with E 1.0 to 1.4, LEO-II 1.3.4, Satallax 2.2, 2.3,
blanchet@49021
   207
and 2.4, SPASS 3.8ds, and Vampire 0.6, 1.0, and 1.8.%
blanchet@38309
   208
\footnote{Following the rewrite of Vampire, the counter for version numbers was
blanchet@45278
   209
reset to 0; hence the (new) Vampire versions 0.6, 1.0, and 1.8 are more recent
blanchet@47113
   210
than 9.0 or 11.5.}%
blanchet@49021
   211
Since the ATPs' output formats are neither documented nor stable, other
blanchet@48448
   212
versions might not work well with Sledgehammer. Ideally,
blanchet@48448
   213
you should also set \texttt{E\_VERSION}, \texttt{LEO2\_VERSION},
blanchet@47113
   214
\texttt{SATALLAX\_VERSION}, \texttt{SPASS\_VERSION}, or
blanchet@47113
   215
\texttt{VAMPIRE\_VERSION} to the prover's version number (e.g., ``1.4'').
blanchet@47113
   216
blanchet@47514
   217
Similarly, if you want to build Alt-Ergo or CVC3, or found a
blanchet@47113
   218
Yices or Z3 executable somewhere (e.g.,
blanchet@47113
   219
\url{http://yices.csl.sri.com/download.shtml} or
blanchet@47113
   220
\url{http://research.microsoft.com/en-us/um/redmond/projects/z3/download.html}),
blanchet@47113
   221
set the environment variable \texttt{CVC3\_\allowbreak SOLVER},
blanchet@47113
   222
\texttt{YICES\_SOLVER}, or \texttt{Z3\_SOLVER} to the complete path of
blanchet@47113
   223
the executable, \emph{including the file name}. Sledgehammer has been tested
blanchet@49021
   224
with Alt-Ergo 0.93, CVC3 2.2 and 2.4.1, Yices 1.0.28 and 1.0.33, and Z3 3.0,
blanchet@49021
   225
3.1, 3.2, and 4.0. Since the SMT solvers' output formats are somewhat unstable,
blanchet@49021
   226
other versions of the solvers might not work well with Sledgehammer. Ideally,
blanchet@47113
   227
also set \texttt{CVC3\_VERSION}, \texttt{YICES\_VERSION}, or
blanchet@49021
   228
\texttt{Z3\_VERSION} to the solver's version number (e.g., ``4.0'').
blanchet@36918
   229
\end{enum}
blanchet@47113
   230
\end{sloppy}
blanchet@36918
   231
blanchet@47113
   232
To check whether E, SPASS, Vampire, and/or Z3 are successfully installed, try
blanchet@47113
   233
out the example in \S\ref{first-steps}. If the remote versions of any of these
blanchet@47113
   234
provers is used (identified by the prefix ``\emph{remote\_\/}''), or if the
blanchet@47113
   235
local versions fail to solve the easy goal presented there, something must be
blanchet@47113
   236
wrong with the installation.
blanchet@36918
   237
blanchet@47113
   238
Remote prover invocation requires Perl with the World Wide Web Library
blanchet@47113
   239
(\texttt{libwww-perl}) installed. If you must use a proxy server to access the
blanchet@47113
   240
Internet, set the \texttt{http\_proxy} environment variable to the proxy, either
blanchet@47113
   241
in the environment in which Isabelle is launched or in your
blanchet@48432
   242
\texttt{\$ISABELLE\_HOME\_USER/etc/settings} file. Here are a few
blanchet@47113
   243
examples:
blanchet@39388
   244
blanchet@39388
   245
\prew
blanchet@39389
   246
\texttt{http\_proxy=http://proxy.example.org} \\
blanchet@39389
   247
\texttt{http\_proxy=http://proxy.example.org:8080} \\
blanchet@39389
   248
\texttt{http\_proxy=http://joeblow:pAsSwRd@proxy.example.org}
blanchet@39388
   249
\postw
blanchet@37517
   250
blanchet@36918
   251
\section{First Steps}
blanchet@36918
   252
\label{first-steps}
blanchet@36918
   253
blanchet@36918
   254
To illustrate Sledgehammer in context, let us start a theory file and
blanchet@36918
   255
attempt to prove a simple lemma:
blanchet@36918
   256
blanchet@36918
   257
\prew
blanchet@36918
   258
\textbf{theory}~\textit{Scratch} \\
blanchet@36918
   259
\textbf{imports}~\textit{Main} \\
blanchet@36918
   260
\textbf{begin} \\[2\smallskipamount]
blanchet@36918
   261
%
blanchet@43786
   262
\textbf{lemma} ``$[a] = [b] \,\Longrightarrow\, a = b$'' \\
blanchet@36918
   263
\textbf{sledgehammer}
blanchet@36918
   264
\postw
blanchet@36918
   265
blanchet@37517
   266
Instead of issuing the \textbf{sledgehammer} command, you can also find
blanchet@37517
   267
Sledgehammer in the ``Commands'' submenu of the ``Isabelle'' menu in Proof
blanchet@37517
   268
General or press the Emacs key sequence C-c C-a C-s.
blanchet@37517
   269
Either way, Sledgehammer produces the following output after a few seconds:
blanchet@36918
   270
blanchet@36918
   271
\prew
blanchet@36918
   272
\slshape
blanchet@47113
   273
Sledgehammer: ``\textit{e\/}'' on goal \\
blanchet@43786
   274
$[a] = [b] \,\Longrightarrow\, a = b$ \\
blanchet@43895
   275
Try this: \textbf{by} (\textit{metis last\_ConsL}) (64 ms). \\[3\smallskipamount]
blanchet@43786
   276
%
blanchet@47113
   277
Sledgehammer: ``\textit{z3\/}'' on goal \\
blanchet@47113
   278
$[a] = [b] \,\Longrightarrow\, a = b$ \\
blanchet@47113
   279
Try this: \textbf{by} (\textit{metis list.inject}) (20 ms). \\[3\smallskipamount]
blanchet@47113
   280
%
blanchet@47113
   281
Sledgehammer: ``\textit{vampire\/}'' on goal \\
blanchet@43786
   282
$[a] = [b] \,\Longrightarrow\, a = b$ \\
blanchet@43895
   283
Try this: \textbf{by} (\textit{metis hd.simps}) (14 ms). \\[3\smallskipamount]
blanchet@36918
   284
%
blanchet@47113
   285
Sledgehammer: ``\textit{spass\/}'' on goal \\
blanchet@43786
   286
$[a] = [b] \,\Longrightarrow\, a = b$ \\
blanchet@43895
   287
Try this: \textbf{by} (\textit{metis list.inject}) (17 ms). \\[3\smallskipamount]
blanchet@36918
   288
%
blanchet@47113
   289
Sledgehammer: ``\textit{remote\_waldmeister\/}'' on goal \\
blanchet@43851
   290
$[a] = [b] \,\Longrightarrow\, a = b$ \\
blanchet@43895
   291
Try this: \textbf{by} (\textit{metis hd.simps}) (15 ms). \\[3\smallskipamount]
blanchet@40254
   292
%
blanchet@48513
   293
Sledgehammer: ``\textit{remote\_e\_sine\/}'' on goal \\
blanchet@45929
   294
$[a] = [b] \,\Longrightarrow\, a = b$ \\
blanchet@47113
   295
Try this: \textbf{by} (\textit{metis hd.simps}) (18 ms).
blanchet@36918
   296
\postw
blanchet@36918
   297
blanchet@48513
   298
Sledgehammer ran E, E-SInE, SPASS, Vampire, Waldmeister, and Z3 in parallel.
blanchet@43786
   299
Depending on which provers are installed and how many processor cores are
blanchet@43786
   300
available, some of the provers might be missing or present with a
blanchet@43851
   301
\textit{remote\_} prefix. Waldmeister is run only for unit equational problems,
blanchet@43851
   302
where the goal's conclusion is a (universally quantified) equation.
blanchet@36918
   303
blanchet@49402
   304
For each successful prover, Sledgehammer gives a one-liner \textit{metis} or
blanchet@49402
   305
\textit{smt} method call. Rough timings are shown in parentheses, indicating how
blanchet@49402
   306
fast the call is. You can click the proof to insert it into the theory text.
blanchet@36918
   307
blanchet@43895
   308
In addition, you can ask Sledgehammer for an Isar text proof by passing the
blanchet@43752
   309
\textit{isar\_proof} option (\S\ref{output-format}):
blanchet@36918
   310
blanchet@36918
   311
\prew
blanchet@36918
   312
\textbf{sledgehammer} [\textit{isar\_proof}]
blanchet@36918
   313
\postw
blanchet@36918
   314
blanchet@36918
   315
When Isar proof construction is successful, it can yield proofs that are more
blanchet@46251
   316
readable and also faster than the \textit{metis} or \textit{smt} one-liners.
blanchet@46251
   317
This feature is experimental and is only available for ATPs.
blanchet@36918
   318
blanchet@37517
   319
\section{Hints}
blanchet@37517
   320
\label{hints}
blanchet@37517
   321
blanchet@43753
   322
This section presents a few hints that should help you get the most out of
blanchet@47514
   323
Sledgehammer. Frequently asked questions are answered in
blanchet@46251
   324
\S\ref{frequently-asked-questions}.
blanchet@43753
   325
blanchet@47113
   326
%\newcommand\point[1]{\medskip\par{\sl\bfseries#1}\par\nopagebreak}
blanchet@47113
   327
\newcommand\point[1]{\subsection{\emph{#1}}}
blanchet@43628
   328
blanchet@43628
   329
\point{Presimplify the goal}
blanchet@43628
   330
blanchet@37517
   331
For best results, first simplify your problem by calling \textit{auto} or at
blanchet@43786
   332
least \textit{safe} followed by \textit{simp\_all}. The SMT solvers provide
blanchet@43786
   333
arithmetic decision procedures, but the ATPs typically do not (or if they do,
blanchet@43786
   334
Sledgehammer does not use it yet). Apart from Waldmeister, they are not
blanchet@43786
   335
especially good at heavy rewriting, but because they regard equations as
blanchet@43786
   336
undirected, they often prove theorems that require the reverse orientation of a
blanchet@43786
   337
\textit{simp} rule. Higher-order problems can be tackled, but the success rate
blanchet@43786
   338
is better for first-order problems. Hence, you may get better results if you
blanchet@43786
   339
first simplify the problem to remove higher-order features.
blanchet@37517
   340
blanchet@47113
   341
\point{Make sure E, SPASS, Vampire, and Z3 are locally installed}
blanchet@43628
   342
blanchet@43628
   343
Locally installed provers are faster and more reliable than those running on
blanchet@43628
   344
servers. See \S\ref{installation} for details on how to install them.
blanchet@43628
   345
blanchet@43628
   346
\point{Familiarize yourself with the most important options}
blanchet@43628
   347
blanchet@43628
   348
Sledgehammer's options are fully documented in \S\ref{command-syntax}. Many of
blanchet@43628
   349
the options are very specialized, but serious users of the tool should at least
blanchet@43628
   350
familiarize themselves with the following options:
blanchet@43628
   351
blanchet@43628
   352
\begin{enum}
blanchet@46387
   353
\item[\labelitemi] \textbf{\textit{provers}} (\S\ref{mode-of-operation}) specifies
blanchet@43753
   354
the automatic provers (ATPs and SMT solvers) that should be run whenever
blanchet@43753
   355
Sledgehammer is invoked (e.g., ``\textit{provers}~= \textit{e spass
blanchet@47113
   356
remote\_vampire\/}''). For convenience, you can omit ``\textit{provers}~=''
blanchet@43855
   357
and simply write the prover names as a space-separated list (e.g., ``\textit{e
blanchet@47113
   358
spass remote\_vampire\/}'').
blanchet@43628
   359
blanchet@49309
   360
\item[\labelitemi] \textbf{\textit{max\_facts}} (\S\ref{relevance-filter})
blanchet@43753
   361
specifies the maximum number of facts that should be passed to the provers. By
blanchet@49309
   362
default, the value is prover-dependent but varies between about 50 and 1000. If
blanchet@49309
   363
the provers time out, you can try lowering this value to, say, 25 or 50 and see
blanchet@43753
   364
if that helps.
blanchet@43628
   365
blanchet@46387
   366
\item[\labelitemi] \textbf{\textit{isar\_proof}} (\S\ref{output-format}) specifies
blanchet@46251
   367
that Isar proofs should be generated, instead of one-liner \textit{metis} or
blanchet@46251
   368
\textit{smt} proofs. The length of the Isar proofs can be controlled by setting
blanchet@43753
   369
\textit{isar\_shrink\_factor} (\S\ref{output-format}).
blanchet@43879
   370
blanchet@46387
   371
\item[\labelitemi] \textbf{\textit{timeout}} (\S\ref{timeouts}) controls the
blanchet@43879
   372
provers' time limit. It is set to 30 seconds, but since Sledgehammer runs
blanchet@43879
   373
asynchronously you should not hesitate to raise this limit to 60 or 120 seconds
blanchet@43879
   374
if you are the kind of user who can think clearly while ATPs are active.
blanchet@43628
   375
\end{enum}
blanchet@43628
   376
blanchet@43753
   377
Options can be set globally using \textbf{sledgehammer\_params}
blanchet@43851
   378
(\S\ref{command-syntax}). The command also prints the list of all available
blanchet@43851
   379
options with their current value. Fact selection can be influenced by specifying
blanchet@43851
   380
``$(\textit{add}{:}~\textit{my\_facts})$'' after the \textbf{sledgehammer} call
blanchet@43851
   381
to ensure that certain facts are included, or simply ``$(\textit{my\_facts})$''
blanchet@43851
   382
to force Sledgehammer to run only with $\textit{my\_facts}$.
blanchet@43628
   383
blanchet@43628
   384
\section{Frequently Asked Questions}
blanchet@43628
   385
\label{frequently-asked-questions}
blanchet@43628
   386
blanchet@43786
   387
This sections answers frequently (and infrequently) asked questions about
blanchet@49402
   388
Sledgehammer. It is a good idea to skim over it now even if you do not have any
blanchet@43786
   389
questions at this stage. And if you have any further questions not listed here,
blanchet@43786
   390
send them to the author at \authoremail.
blanchet@43786
   391
blanchet@43849
   392
\point{Which facts are passed to the automatic provers?}
blanchet@43752
   393
blanchet@49402
   394
Sledgehammer heuristically selects a few hundred relevant lemmas from the
blanchet@49402
   395
currently loaded libraries. The component that performs this selection is
blanchet@49402
   396
called \emph{relevance filter}.
blanchet@49402
   397
blanchet@49402
   398
\begin{enum}
blanchet@49402
   399
\item[\labelitemi]
blanchet@49403
   400
The traditional relevance filter, called \emph{MePo}
blanchet@49403
   401
(\underline{Me}ng--\underline{Pau}lson), assigns a score to every available fact
blanchet@49403
   402
(lemma, theorem, definition, or axiom) based upon how many constants that fact
blanchet@49403
   403
shares with the conjecture. This process iterates to include facts relevant to
blanchet@49403
   404
those just accepted. The constants are weighted to give unusual ones greater
blanchet@49403
   405
significance. MePo copes best when the conjecture contains some unusual
blanchet@49403
   406
constants; if all the constants are common, it is unable to discriminate among
blanchet@49403
   407
the hundreds of facts that are picked up. The filter is also memoryless: It has
blanchet@49403
   408
no information about how many times a particular fact has been used in a proof,
blanchet@49403
   409
and it cannot learn.
blanchet@49402
   410
blanchet@49402
   411
\item[\labelitemi]
blanchet@49402
   412
An experimental, memoryful alternative to MePo is \emph{MaSh}
blanchet@49402
   413
(\underline{Ma}chine Learner for \underline{S}ledge\underline{h}ammer). It
blanchet@49402
   414
relies on an external tool called \texttt{mash} that applies machine learning to
blanchet@49402
   415
the problem of finding relevant facts.
blanchet@49402
   416
blanchet@49402
   417
\item[\labelitemi] The \emph{Mesh} filter combines MePo and MaSh.
blanchet@49402
   418
\end{enum}
blanchet@49402
   419
blanchet@49402
   420
The default is either MePo or Mesh, depending on whether \texttt{mash} is
blanchet@49402
   421
installed and what class of provers the target prover belongs to
blanchet@49402
   422
(\S\ref{relevance-filter}).
blanchet@43752
   423
blanchet@43752
   424
The number of facts included in a problem varies from prover to prover, since
blanchet@43849
   425
some provers get overwhelmed more easily than others. You can show the number of
blanchet@43752
   426
facts given using the \textit{verbose} option (\S\ref{output-format}) and the
blanchet@43752
   427
actual facts using \textit{debug} (\S\ref{output-format}).
blanchet@43752
   428
blanchet@43752
   429
Sledgehammer is good at finding short proofs combining a handful of existing
blanchet@43752
   430
lemmas. If you are looking for longer proofs, you must typically restrict the
blanchet@49309
   431
number of facts, by setting the \textit{max\_facts} option
blanchet@44436
   432
(\S\ref{relevance-filter}) to, say, 25 or 50.
blanchet@43752
   433
blanchet@43837
   434
You can also influence which facts are actually selected in a number of ways. If
blanchet@43837
   435
you simply want to ensure that a fact is included, you can specify it using the
blanchet@43837
   436
``$(\textit{add}{:}~\textit{my\_facts})$'' syntax. For example:
blanchet@43837
   437
%
blanchet@43837
   438
\prew
blanchet@43837
   439
\textbf{sledgehammer} (\textit{add}: \textit{hd.simps} \textit{tl.simps})
blanchet@43837
   440
\postw
blanchet@43837
   441
%
blanchet@43837
   442
The specified facts then replace the least relevant facts that would otherwise be
blanchet@43837
   443
included; the other selected facts remain the same.
blanchet@43837
   444
If you want to direct the selection in a particular direction, you can specify
blanchet@43837
   445
the facts via \textbf{using}:
blanchet@43837
   446
%
blanchet@43837
   447
\prew
blanchet@43837
   448
\textbf{using} \textit{hd.simps} \textit{tl.simps} \\
blanchet@43837
   449
\textbf{sledgehammer}
blanchet@43837
   450
\postw
blanchet@43837
   451
%
blanchet@43837
   452
The facts are then more likely to be selected than otherwise, and if they are
blanchet@43837
   453
selected at iteration $j$ they also influence which facts are selected at
blanchet@43837
   454
iterations $j + 1$, $j + 2$, etc. To give them even more weight, try
blanchet@43837
   455
%
blanchet@43837
   456
\prew
blanchet@43837
   457
\textbf{using} \textit{hd.simps} \textit{tl.simps} \\
blanchet@43837
   458
\textbf{apply}~\textbf{--} \\
blanchet@43837
   459
\textbf{sledgehammer}
blanchet@43837
   460
\postw
blanchet@43837
   461
blanchet@47128
   462
\point{Why does Metis fail to reconstruct the proof?}
blanchet@47128
   463
blanchet@47128
   464
There are many reasons. If Metis runs seemingly forever, that is a sign that the
blanchet@47128
   465
proof is too difficult for it. Metis's search is complete, so it should
blanchet@47128
   466
eventually find it, but that's little consolation. There are several possible
blanchet@47128
   467
solutions:
blanchet@47128
   468
blanchet@47128
   469
\begin{enum}
blanchet@47128
   470
\item[\labelitemi] Try the \textit{isar\_proof} option (\S\ref{output-format}) to
blanchet@47128
   471
obtain a step-by-step Isar proof where each step is justified by \textit{metis}.
blanchet@47128
   472
Since the steps are fairly small, \textit{metis} is more likely to be able to
blanchet@47128
   473
replay them.
blanchet@47128
   474
blanchet@47128
   475
\item[\labelitemi] Try the \textit{smt} proof method instead of \textit{metis}. It
blanchet@47128
   476
is usually stronger, but you need to either have Z3 available to replay the
blanchet@47128
   477
proofs, trust the SMT solver, or use certificates. See the documentation in the
blanchet@47128
   478
\emph{SMT} theory (\texttt{\$ISABELLE\_HOME/src/HOL/SMT.thy}) for details.
blanchet@47128
   479
blanchet@47128
   480
\item[\labelitemi] Try the \textit{blast} or \textit{auto} proof methods, passing
blanchet@47128
   481
the necessary facts via \textbf{unfolding}, \textbf{using}, \textit{intro}{:},
blanchet@47128
   482
\textit{elim}{:}, \textit{dest}{:}, or \textit{simp}{:}, as appropriate.
blanchet@47128
   483
\end{enum}
blanchet@47128
   484
blanchet@47128
   485
In some rare cases, \textit{metis} fails fairly quickly, and you get the error
blanchet@47128
   486
message
blanchet@47128
   487
blanchet@47128
   488
\prew
blanchet@47128
   489
\slshape
blanchet@47128
   490
One-line proof reconstruction failed.
blanchet@47128
   491
\postw
blanchet@47128
   492
blanchet@47128
   493
This message indicates that Sledgehammer determined that the goal is provable,
blanchet@47128
   494
but the proof is, for technical reasons, beyond \textit{metis}'s power. You can
blanchet@47128
   495
then try again with the \textit{strict} option (\S\ref{problem-encoding}).
blanchet@47128
   496
blanchet@47511
   497
If the goal is actually unprovable and you did not specify an unsound encoding
blanchet@47128
   498
using \textit{type\_enc} (\S\ref{problem-encoding}), this is a bug, and you are
blanchet@47128
   499
strongly encouraged to report this to the author at \authoremail.
blanchet@47128
   500
blanchet@47113
   501
\point{Why are the generated Isar proofs so ugly/broken?}
blanchet@43752
   502
blanchet@47128
   503
The current implementation of the Isar proof feature,
blanchet@47128
   504
enabled by the \textit{isar\_proof} option (\S\ref{output-format}),
blanchet@47128
   505
is highly experimental. Work on a new implementation has begun. There is a large body of
blanchet@43752
   506
research into transforming resolution proofs into natural deduction proofs (such
blanchet@43752
   507
as Isar proofs), which we hope to leverage. In the meantime, a workaround is to
blanchet@43752
   508
set the \textit{isar\_shrink\_factor} option (\S\ref{output-format}) to a larger
blanchet@43752
   509
value or to try several provers and keep the nicest-looking proof.
blanchet@43752
   510
blanchet@47128
   511
\point{How can I tell whether a suggested proof is sound?}
blanchet@47128
   512
blanchet@47128
   513
Earlier versions of Sledgehammer often suggested unsound proofs---either proofs
blanchet@47128
   514
of nontheorems or simply proofs that rely on type-unsound inferences. This
blanchet@47511
   515
is a thing of the past, unless you explicitly specify an unsound encoding
blanchet@47128
   516
using \textit{type\_enc} (\S\ref{problem-encoding}).
blanchet@47128
   517
%
blanchet@47128
   518
Officially, the only form of ``unsoundness'' that lurks in the sound
blanchet@47128
   519
encodings is related to missing characteristic theorems of datatypes. For
blanchet@47128
   520
example,
blanchet@47128
   521
blanchet@47128
   522
\prew
blanchet@47128
   523
\textbf{lemma}~``$\exists \mathit{xs}.\; \mathit{xs} \neq []$'' \\
blanchet@47128
   524
\textbf{sledgehammer} ()
blanchet@47128
   525
\postw
blanchet@47128
   526
blanchet@47128
   527
suggests an argumentless \textit{metis} call that fails. However, the conjecture
blanchet@47128
   528
does actually hold, and the \textit{metis} call can be repaired by adding
blanchet@47128
   529
\textit{list.distinct}.
blanchet@47128
   530
%
blanchet@47128
   531
We hope to address this problem in a future version of Isabelle. In the
blanchet@47128
   532
meantime, you can avoid it by passing the \textit{strict} option
blanchet@47128
   533
(\S\ref{problem-encoding}).
blanchet@47128
   534
blanchet@47126
   535
\point{What are the \textit{full\_types}, \textit{no\_types}, and
blanchet@47126
   536
\textit{mono\_tags} arguments to Metis?}
blanchet@43752
   537
blanchet@47126
   538
The \textit{metis}~(\textit{full\_types}) proof method
blanchet@47126
   539
and its cousin \textit{metis}~(\textit{mono\_tags}) are fully-typed
blanchet@44069
   540
version of Metis. It is somewhat slower than \textit{metis}, but the proof
blanchet@44069
   541
search is fully typed, and it also includes more powerful rules such as the
blanchet@46387
   542
axiom ``$x = \const{True} \mathrel{\lor} x = \const{False}$'' for reasoning in
blanchet@44069
   543
higher-order places (e.g., in set comprehensions). The method kicks in
blanchet@44069
   544
automatically as a fallback when \textit{metis} fails, and it is sometimes
blanchet@44069
   545
generated by Sledgehammer instead of \textit{metis} if the proof obviously
blanchet@44069
   546
requires type information or if \textit{metis} failed when Sledgehammer
blanchet@44069
   547
preplayed the proof. (By default, Sledgehammer tries to run \textit{metis} with
blanchet@47126
   548
various options for up to 3 seconds each time to ensure that the generated
blanchet@47126
   549
one-line proofs actually work and to display timing information. This can be
blanchet@47907
   550
configured using the \textit{preplay\_timeout} and \textit{dont\_preplay}
blanchet@47907
   551
options (\S\ref{timeouts}).)
blanchet@47126
   552
%
blanchet@44070
   553
At the other end of the soundness spectrum, \textit{metis} (\textit{no\_types})
blanchet@44070
   554
uses no type information at all during the proof search, which is more efficient
blanchet@44070
   555
but often fails. Calls to \textit{metis} (\textit{no\_types}) are occasionally
blanchet@44070
   556
generated by Sledgehammer.
blanchet@47126
   557
%
blanchet@47126
   558
See the \textit{type\_enc} option (\S\ref{problem-encoding}) for details.
blanchet@44070
   559
blanchet@47126
   560
Incidentally, if you ever see warnings such as
blanchet@43752
   561
blanchet@43752
   562
\prew
blanchet@43848
   563
\slshape
blanchet@44069
   564
Metis: Falling back on ``\textit{metis} (\textit{full\_types})''.
blanchet@43752
   565
\postw
blanchet@43752
   566
blanchet@46251
   567
for a successful \textit{metis} proof, you can advantageously pass the
blanchet@44069
   568
\textit{full\_types} option to \textit{metis} directly.
blanchet@44069
   569
blanchet@47194
   570
\point{And what are the \textit{lifting} and \textit{hide\_lams} arguments
blanchet@47126
   571
to Metis?}
blanchet@47126
   572
blanchet@47126
   573
Orthogonally to the encoding of types, it is important to choose an appropriate
blanchet@47126
   574
translation of $\lambda$-abstractions. Metis supports three translation schemes,
blanchet@47126
   575
in decreasing order of power: Curry combinators (the default),
blanchet@47126
   576
$\lambda$-lifting, and a ``hiding'' scheme that disables all reasoning under
blanchet@47126
   577
$\lambda$-abstractions. The more powerful schemes also give the automatic
blanchet@47126
   578
provers more rope to hang themselves. See the \textit{lam\_trans} option (\S\ref{problem-encoding}) for details.
blanchet@47126
   579
blanchet@43895
   580
\point{Are generated proofs minimal?}
blanchet@43877
   581
blanchet@43895
   582
Automatic provers frequently use many more facts than are necessary.
blanchet@43895
   583
Sledgehammer inclues a minimization tool that takes a set of facts returned by a
blanchet@46251
   584
given prover and repeatedly calls the same prover, \textit{metis}, or
blanchet@46251
   585
\textit{smt} with subsets of those axioms in order to find a minimal set.
blanchet@46251
   586
Reducing the number of axioms typically improves Metis's speed and success rate,
blanchet@46251
   587
while also removing superfluous clutter from the proof scripts.
blanchet@43877
   588
blanchet@44070
   589
In earlier versions of Sledgehammer, generated proofs were systematically
blanchet@44070
   590
accompanied by a suggestion to invoke the minimization tool. This step is now
blanchet@44070
   591
performed implicitly if it can be done in a reasonable amount of time (something
blanchet@44070
   592
that can be guessed from the number of facts in the original proof and the time
blanchet@46579
   593
it took to find or preplay it).
blanchet@43877
   594
blanchet@46034
   595
In addition, some provers (e.g., Yices) do not provide proofs or sometimes
blanchet@46034
   596
produce incomplete proofs. The minimizer is then invoked to find out which facts
blanchet@47511
   597
are actually needed from the (large) set of facts that was initially given to
blanchet@46034
   598
the prover. Finally, if a prover returns a proof with lots of facts, the
blanchet@46034
   599
minimizer is invoked automatically since Metis would be unlikely to re-find the
blanchet@46034
   600
proof.
blanchet@46579
   601
%
blanchet@46579
   602
Automatic minimization can be forced or disabled using the \textit{minimize}
blanchet@46579
   603
option (\S\ref{mode-of-operation}).
blanchet@43877
   604
blanchet@43849
   605
\point{A strange error occurred---what should I do?}
blanchet@43628
   606
blanchet@43628
   607
Sledgehammer tries to give informative error messages. Please report any strange
blanchet@43752
   608
error to the author at \authoremail. This applies double if you get the message
blanchet@43628
   609
blanchet@43752
   610
\prew
blanchet@43628
   611
\slshape
blanchet@47113
   612
The prover found a type-unsound proof involving ``\textit{foo\/}'',
blanchet@47113
   613
``\textit{bar\/}'', and ``\textit{baz\/}'' even though a supposedly type-sound
blanchet@43846
   614
encoding was used (or, less likely, your axioms are inconsistent). You might
blanchet@43846
   615
want to report this to the Isabelle developers.
blanchet@43752
   616
\postw
blanchet@43628
   617
blanchet@43628
   618
\point{Auto can solve it---why not Sledgehammer?}
blanchet@43628
   619
blanchet@43628
   620
Problems can be easy for \textit{auto} and difficult for automatic provers, but
blanchet@49402
   621
the reverse is also true, so do not be discouraged if your first attempts fail.
blanchet@39566
   622
Because the system refers to all theorems known to Isabelle, it is particularly
blanchet@49402
   623
suitable when your goal has a short proof from lemmas that you do not know
blanchet@49402
   624
about.
blanchet@37517
   625
blanchet@43752
   626
\point{Why are there so many options?}
blanchet@43752
   627
blanchet@43752
   628
Sledgehammer's philosophy should work out of the box, without user guidance.
blanchet@43752
   629
Many of the options are meant to be used mostly by the Sledgehammer developers
blanchet@43752
   630
for experimentation purposes. Of course, feel free to experiment with them if
blanchet@43752
   631
you are so inclined.
blanchet@43752
   632
blanchet@36918
   633
\section{Command Syntax}
blanchet@36918
   634
\label{command-syntax}
blanchet@36918
   635
blanchet@47113
   636
\subsection{Sledgehammer}
blanchet@47113
   637
blanchet@36918
   638
Sledgehammer can be invoked at any point when there is an open goal by entering
blanchet@36918
   639
the \textbf{sledgehammer} command in the theory file. Its general syntax is as
blanchet@36918
   640
follows:
blanchet@36918
   641
blanchet@36918
   642
\prew
blanchet@44057
   643
\textbf{sledgehammer} \qty{subcommand}$^?$ \qty{options}$^?$ \qty{facts\_override}$^?$ \qty{num}$^?$
blanchet@36918
   644
\postw
blanchet@36918
   645
blanchet@36918
   646
For convenience, Sledgehammer is also available in the ``Commands'' submenu of
blanchet@36918
   647
the ``Isabelle'' menu in Proof General or by pressing the Emacs key sequence C-c
blanchet@36918
   648
C-a C-s. This is equivalent to entering the \textbf{sledgehammer} command with
blanchet@36918
   649
no arguments in the theory text.
blanchet@36918
   650
blanchet@44057
   651
In the general syntax, the \qty{subcommand} may be any of the following:
blanchet@36918
   652
blanchet@36918
   653
\begin{enum}
blanchet@46387
   654
\item[\labelitemi] \textbf{\textit{run} (the default):} Runs Sledgehammer on
blanchet@44057
   655
subgoal number \qty{num} (1 by default), with the given options and facts.
blanchet@36918
   656
blanchet@46387
   657
\item[\labelitemi] \textbf{\textit{min}:} Attempts to minimize the facts
blanchet@44057
   658
specified in the \qty{facts\_override} argument to obtain a simpler proof
blanchet@36918
   659
involving fewer facts. The options and goal number are as for \textit{run}.
blanchet@36918
   660
blanchet@46387
   661
\item[\labelitemi] \textbf{\textit{messages}:} Redisplays recent messages issued
blanchet@40444
   662
by Sledgehammer. This allows you to examine results that might have been lost
blanchet@44057
   663
due to Sledgehammer's asynchronous nature. The \qty{num} argument specifies a
blanchet@48401
   664
limit on the number of messages to display (10 by default).
blanchet@36918
   665
blanchet@46387
   666
\item[\labelitemi] \textbf{\textit{supported\_provers}:} Prints the list of
blanchet@42588
   667
automatic provers supported by Sledgehammer. See \S\ref{installation} and
blanchet@42588
   668
\S\ref{mode-of-operation} for more information on how to install automatic
blanchet@42588
   669
provers.
blanchet@36918
   670
blanchet@46387
   671
\item[\labelitemi] \textbf{\textit{running\_provers}:} Prints information about
blanchet@40240
   672
currently running automatic provers, including elapsed runtime and remaining
blanchet@40240
   673
time until timeout.
blanchet@36918
   674
blanchet@46387
   675
\item[\labelitemi] \textbf{\textit{kill\_provers}:} Terminates all running
blanchet@40240
   676
automatic provers.
blanchet@36918
   677
blanchet@49402
   678
\item[\labelitemi] \textbf{\textit{unlearn}:} Resets the MaSh machine learner,
blanchet@49402
   679
erasing any persistent state.
blanchet@49402
   680
blanchet@49402
   681
\item[\labelitemi] \textbf{\textit{learn}:} Invokes the MaSh machine learner on
blanchet@49402
   682
the current theory to process all the available facts. This happens
blanchet@49402
   683
automatically at Sledgehammer invocations if the \textit{learn} option
blanchet@49402
   684
(\S\ref{relevance-filter}) is enabled.
blanchet@49402
   685
blanchet@49402
   686
\item[\labelitemi] \textbf{\textit{relearn}:} Same as \textit{unlearn} followed
blanchet@49402
   687
by \textit{learn}.
blanchet@49402
   688
blanchet@49402
   689
\item[\labelitemi] \textbf{\textit{running\_learners}:} Prints information about
blanchet@49402
   690
currently running machine learners, including elapsed runtime and remaining
blanchet@49402
   691
time until timeout.
blanchet@49402
   692
blanchet@49402
   693
\item[\labelitemi] \textbf{\textit{kill\_learners}:} Terminates all running
blanchet@49402
   694
machine learners.
blanchet@49402
   695
blanchet@46387
   696
\item[\labelitemi] \textbf{\textit{refresh\_tptp}:} Refreshes the list of remote
blanchet@36918
   697
ATPs available at System\-On\-TPTP \cite{sutcliffe-2000}.
blanchet@36918
   698
\end{enum}
blanchet@36918
   699
blanchet@44057
   700
Sledgehammer's behavior can be influenced by various \qty{options}, which can be
blanchet@44057
   701
specified in brackets after the \textbf{sledgehammer} command. The
blanchet@44057
   702
\qty{options} are a list of key--value pairs of the form ``[$k_1 = v_1,
blanchet@47113
   703
\ldots, k_n = v_n$]''. For Boolean options, ``= \textit{true\/}'' is optional. For
blanchet@36918
   704
example:
blanchet@36918
   705
blanchet@36918
   706
\prew
blanchet@44057
   707
\textbf{sledgehammer} [\textit{isar\_proof}, \,\textit{timeout} = 120]
blanchet@36918
   708
\postw
blanchet@36918
   709
blanchet@36918
   710
Default values can be set using \textbf{sledgehammer\_\allowbreak params}:
blanchet@36918
   711
blanchet@36918
   712
\prew
blanchet@44057
   713
\textbf{sledgehammer\_params} \qty{options}
blanchet@36918
   714
\postw
blanchet@36918
   715
blanchet@36918
   716
The supported options are described in \S\ref{option-reference}.
blanchet@36918
   717
blanchet@44057
   718
The \qty{facts\_override} argument lets you alter the set of facts that go
blanchet@44057
   719
through the relevance filter. It may be of the form ``(\qty{facts})'', where
blanchet@44057
   720
\qty{facts} is a space-separated list of Isabelle facts (theorems, local
blanchet@36918
   721
assumptions, etc.), in which case the relevance filter is bypassed and the given
blanchet@44057
   722
facts are used. It may also be of the form ``(\textit{add}:\ \qty{facts\/_{\mathrm{1}}})'',
blanchet@44057
   723
``(\textit{del}:\ \qty{facts\/_{\mathrm{2}}})'', or ``(\textit{add}:\ \qty{facts\/_{\mathrm{1}}}\
blanchet@44057
   724
\textit{del}:\ \qty{facts\/_{\mathrm{2}}})'', where the relevance filter is instructed to
blanchet@44057
   725
proceed as usual except that it should consider \qty{facts\/_{\mathrm{1}}}
blanchet@44057
   726
highly-relevant and \qty{facts\/_{\mathrm{2}}} fully irrelevant.
blanchet@36918
   727
blanchet@39566
   728
You can instruct Sledgehammer to run automatically on newly entered theorems by
blanchet@45607
   729
enabling the ``Auto Sledgehammer'' option in Proof General's ``Isabelle'' menu.
blanchet@45607
   730
For automatic runs, only the first prover set using \textit{provers}
blanchet@43601
   731
(\S\ref{mode-of-operation}) is considered, fewer facts are passed to the prover,
blanchet@47128
   732
\textit{slice} (\S\ref{mode-of-operation}) is disabled, \textit{strict}
blanchet@44436
   733
(\S\ref{problem-encoding}) is enabled, \textit{verbose} (\S\ref{output-format})
blanchet@43879
   734
and \textit{debug} (\S\ref{output-format}) are disabled, and \textit{timeout}
blanchet@43879
   735
(\S\ref{timeouts}) is superseded by the ``Auto Tools Time Limit'' in Proof
blanchet@43879
   736
General's ``Isabelle'' menu. Sledgehammer's output is also more concise.
blanchet@39566
   737
blanchet@47113
   738
\subsection{Metis}
blanchet@47113
   739
blanchet@44057
   740
The \textit{metis} proof method has the syntax
blanchet@44057
   741
blanchet@44057
   742
\prew
blanchet@46389
   743
\textbf{\textit{metis}}~(\qty{options})${}^?$~\qty{facts}${}^?$
blanchet@44057
   744
\postw
blanchet@44057
   745
blanchet@46389
   746
where \qty{facts} is a list of arbitrary facts and \qty{options} is a
blanchet@46389
   747
comma-separated list consisting of at most one $\lambda$ translation scheme
blanchet@46389
   748
specification with the same semantics as Sledgehammer's \textit{lam\_trans}
blanchet@46389
   749
option (\S\ref{problem-encoding}) and at most one type encoding specification
blanchet@46389
   750
with the same semantics as Sledgehammer's \textit{type\_enc} option
blanchet@46389
   751
(\S\ref{problem-encoding}).
blanchet@46389
   752
%
blanchet@46389
   753
The supported $\lambda$ translation schemes are \textit{hide\_lams},
blanchet@47194
   754
\textit{lifting}, and \textit{combs} (the default).
blanchet@46389
   755
%
blanchet@46389
   756
All the untyped type encodings listed in \S\ref{problem-encoding} are supported.
blanchet@46389
   757
For convenience, the following aliases are provided:
blanchet@46389
   758
\begin{enum}
blanchet@47128
   759
\item[\labelitemi] \textbf{\textit{full\_types}:} Synonym for \textit{poly\_guards\_query}.
blanchet@46389
   760
\item[\labelitemi] \textbf{\textit{partial\_types}:} Synonym for \textit{poly\_args}.
blanchet@46389
   761
\item[\labelitemi] \textbf{\textit{no\_types}:} Synonym for \textit{erased}.
blanchet@46389
   762
\end{enum}
blanchet@44057
   763
blanchet@36918
   764
\section{Option Reference}
blanchet@36918
   765
\label{option-reference}
blanchet@36918
   766
blanchet@43855
   767
\def\defl{\{}
blanchet@43855
   768
\def\defr{\}}
blanchet@43855
   769
blanchet@36918
   770
\def\flushitem#1{\item[]\noindent\kern-\leftmargin \textbf{#1}}
blanchet@47907
   771
\def\optrueonly#1{\flushitem{\textit{#1} $\bigl[$= \textit{true}$\bigr]$\enskip}\nopagebreak\\[\parskip]}
blanchet@43855
   772
\def\optrue#1#2{\flushitem{\textit{#1} $\bigl[$= \qtybf{bool}$\bigr]$\enskip \defl\textit{true}\defr\hfill (neg.: \textit{#2})}\nopagebreak\\[\parskip]}
blanchet@43855
   773
\def\opfalse#1#2{\flushitem{\textit{#1} $\bigl[$= \qtybf{bool}$\bigr]$\enskip \defl\textit{false}\defr\hfill (neg.: \textit{#2})}\nopagebreak\\[\parskip]}
blanchet@43855
   774
\def\opsmart#1#2{\flushitem{\textit{#1} $\bigl[$= \qtybf{smart\_bool}$\bigr]$\enskip \defl\textit{smart}\defr\hfill (neg.: \textit{#2})}\nopagebreak\\[\parskip]}
blanchet@47237
   775
\def\opsmartx#1#2{\flushitem{\textit{#1} $\bigl[$= \qtybf{smart\_bool}$\bigr]$\enskip \defl\textit{smart}\defr\\\hbox{}\hfill (neg.: \textit{#2})}\nopagebreak\\[\parskip]}
blanchet@36918
   776
\def\opnodefault#1#2{\flushitem{\textit{#1} = \qtybf{#2}} \nopagebreak\\[\parskip]}
blanchet@43855
   777
\def\opnodefaultbrk#1#2{\flushitem{$\bigl[$\textit{#1} =$\bigr]$ \qtybf{#2}} \nopagebreak\\[\parskip]}
blanchet@43855
   778
\def\opdefault#1#2#3{\flushitem{\textit{#1} = \qtybf{#2}\enskip \defl\textit{#3}\defr} \nopagebreak\\[\parskip]}
blanchet@36918
   779
\def\oparg#1#2#3{\flushitem{\textit{#1} \qtybf{#2} = \qtybf{#3}} \nopagebreak\\[\parskip]}
blanchet@36918
   780
\def\opargbool#1#2#3{\flushitem{\textit{#1} \qtybf{#2} $\bigl[$= \qtybf{bool}$\bigr]$\hfill (neg.: \textit{#3})}\nopagebreak\\[\parskip]}
blanchet@43855
   781
\def\opargboolorsmart#1#2#3{\flushitem{\textit{#1} \qtybf{#2} $\bigl[$= \qtybf{smart\_bool}$\bigr]$\hfill (neg.: \textit{#3})}\nopagebreak\\[\parskip]}
blanchet@36918
   782
blanchet@36918
   783
Sledgehammer's options are categorized as follows:\ mode of operation
blanchet@39228
   784
(\S\ref{mode-of-operation}), problem encoding (\S\ref{problem-encoding}),
blanchet@39228
   785
relevance filter (\S\ref{relevance-filter}), output format
blanchet@43879
   786
(\S\ref{output-format}), authentication (\S\ref{authentication}), and timeouts
blanchet@43879
   787
(\S\ref{timeouts}).
blanchet@36918
   788
blanchet@36918
   789
The descriptions below refer to the following syntactic quantities:
blanchet@36918
   790
blanchet@36918
   791
\begin{enum}
blanchet@46387
   792
\item[\labelitemi] \qtybf{string}: A string.
blanchet@46387
   793
\item[\labelitemi] \qtybf{bool\/}: \textit{true} or \textit{false}.
blanchet@46387
   794
\item[\labelitemi] \qtybf{smart\_bool\/}: \textit{true}, \textit{false}, or
blanchet@40444
   795
\textit{smart}.
blanchet@46387
   796
\item[\labelitemi] \qtybf{int\/}: An integer.
blanchet@46387
   797
%\item[\labelitemi] \qtybf{float\/}: A floating-point number (e.g., 2.5).
blanchet@46387
   798
\item[\labelitemi] \qtybf{float\_pair\/}: A pair of floating-point numbers
blanchet@40584
   799
(e.g., 0.6 0.95).
blanchet@46387
   800
\item[\labelitemi] \qtybf{smart\_int\/}: An integer or \textit{smart}.
blanchet@46387
   801
\item[\labelitemi] \qtybf{float\_or\_none\/}: A floating-point number (e.g., 60 or
blanchet@43877
   802
0.5) expressing a number of seconds, or the keyword \textit{none} ($\infty$
blanchet@43877
   803
seconds).
blanchet@36918
   804
\end{enum}
blanchet@36918
   805
blanchet@44058
   806
Default values are indicated in curly brackets (\textrm{\{\}}). Boolean options
blanchet@48978
   807
have a negative counterpart (e.g., \textit{blocking} vs.\
blanchet@48978
   808
\textit{non\_blocking}). When setting Boolean options or their negative
blanchet@48978
   809
counterparts, ``= \textit{true\/}'' may be omitted.
blanchet@36918
   810
blanchet@36918
   811
\subsection{Mode of Operation}
blanchet@36918
   812
\label{mode-of-operation}
blanchet@36918
   813
blanchet@36918
   814
\begin{enum}
blanchet@43855
   815
\opnodefaultbrk{provers}{string}
blanchet@40240
   816
Specifies the automatic provers to use as a space-separated list (e.g.,
blanchet@47127
   817
``\textit{e}~\textit{spass}~\textit{remote\_vampire\/}'').
blanchet@47127
   818
Provers can be run locally or remotely; see \S\ref{installation} for
blanchet@47127
   819
installation instructions.
blanchet@47127
   820
blanchet@47127
   821
The following local provers are supported:
blanchet@36918
   822
blanchet@36918
   823
\begin{enum}
blanchet@47514
   824
\item[\labelitemi] \textbf{\textit{alt\_ergo}:} Alt-Ergo is a polymorphic
blanchet@47514
   825
SMT solver developed by Bobot et al.\ \cite{alt-ergo}.
blanchet@47514
   826
It supports the TPTP polymorphic typed first-order format (TFF1) via Why3
blanchet@47514
   827
\cite{why3}. It is included for experimental purposes. To use Alt-Ergo, set the
blanchet@47514
   828
environment variable \texttt{WHY3\_HOME} to the directory that contains the
blanchet@47514
   829
\texttt{why3} executable. Sledgehammer has been tested with Alt-Ergo 0.93 and an
blanchet@47514
   830
unidentified development version of Why3.
blanchet@47514
   831
blanchet@46387
   832
\item[\labelitemi] \textbf{\textit{cvc3}:} CVC3 is an SMT solver developed by
blanchet@43786
   833
Clark Barrett, Cesare Tinelli, and their colleagues \cite{cvc3}. To use CVC3,
blanchet@43786
   834
set the environment variable \texttt{CVC3\_SOLVER} to the complete path of the
blanchet@47113
   835
executable, including the file name, or install the prebuilt CVC3 package from
blanchet@49021
   836
\download. Sledgehammer has been tested with version 2.2 and 2.4.1.
blanchet@43786
   837
blanchet@46387
   838
\item[\labelitemi] \textbf{\textit{e}:} E is a first-order resolution prover
blanchet@43805
   839
developed by Stephan Schulz \cite{schulz-2002}. To use E, set the environment
blanchet@43805
   840
variable \texttt{E\_HOME} to the directory that contains the \texttt{eproof}
blanchet@47926
   841
executable and \texttt{E\_VERSION} to the version number (e.g., ``1.4''), or
blanchet@47926
   842
install the prebuilt E package from \download. Sledgehammer has been tested with
blanchet@47926
   843
versions 1.0 to 1.4.
blanchet@36918
   844
blanchet@46387
   845
\item[\labelitemi] \textbf{\textit{leo2}:} LEO-II is an automatic
blanchet@44969
   846
higher-order prover developed by Christoph Benzm\"uller et al.\ \cite{leo2},
blanchet@47113
   847
with support for the TPTP typed higher-order syntax (THF0). To use LEO-II, set
blanchet@47113
   848
the environment variable \texttt{LEO2\_HOME} to the directory that contains the
blanchet@47113
   849
\texttt{leo} executable. Sledgehammer requires version 1.2.9 or above.
blanchet@44969
   850
blanchet@46387
   851
\item[\labelitemi] \textbf{\textit{metis}:} Although it is much less powerful than
blanchet@44969
   852
the external provers, Metis itself can be used for proof search.
blanchet@44969
   853
blanchet@46387
   854
\item[\labelitemi] \textbf{\textit{satallax}:} Satallax is an automatic
blanchet@44969
   855
higher-order prover developed by Chad Brown et al.\ \cite{satallax}, with
blanchet@47113
   856
support for the TPTP typed higher-order syntax (THF0). To use Satallax, set the
blanchet@47113
   857
environment variable \texttt{SATALLAX\_HOME} to the directory that contains the
blanchet@47113
   858
\texttt{satallax} executable. Sledgehammer requires version 2.2 or above.
blanchet@44969
   859
blanchet@46387
   860
\item[\labelitemi] \textbf{\textit{smt}:} The \textit{smt} proof method with the
blanchet@46426
   861
current settings (usually:\ Z3 with proof reconstruction).
blanchet@46251
   862
blanchet@46387
   863
\item[\labelitemi] \textbf{\textit{spass}:} SPASS is a first-order resolution
blanchet@43805
   864
prover developed by Christoph Weidenbach et al.\ \cite{weidenbach-et-al-2009}.
blanchet@43805
   865
To use SPASS, set the environment variable \texttt{SPASS\_HOME} to the directory
blanchet@47926
   866
that contains the \texttt{SPASS} executable and \texttt{SPASS\_VERSION} to the
blanchet@48448
   867
version number (e.g., ``3.8ds''), or install the prebuilt SPASS package from
blanchet@49021
   868
\download. Sledgehammer requires version 3.8ds or above.
blanchet@36918
   869
blanchet@46387
   870
\item[\labelitemi] \textbf{\textit{vampire}:} Vampire is a first-order resolution
blanchet@43805
   871
prover developed by Andrei Voronkov and his colleagues
blanchet@43805
   872
\cite{riazanov-voronkov-2002}. To use Vampire, set the environment variable
blanchet@43805
   873
\texttt{VAMPIRE\_HOME} to the directory that contains the \texttt{vampire}
blanchet@49021
   874
executable and \texttt{VAMPIRE\_VERSION} to the version number (e.g.,
blanchet@49021
   875
``1.8rev1435''). Sledgehammer has been tested with versions 0.6, 1.0, and 1.8.
blanchet@49021
   876
Versions strictly above 1.8 (e.g., ``1.8rev1435'') support the TPTP typed
blanchet@49021
   877
first-order format (TFF0).
blanchet@36918
   878
blanchet@46387
   879
\item[\labelitemi] \textbf{\textit{yices}:} Yices is an SMT solver developed at
blanchet@44969
   880
SRI \cite{yices}. To use Yices, set the environment variable
blanchet@44969
   881
\texttt{YICES\_SOLVER} to the complete path of the executable, including the
blanchet@46731
   882
file name. Sledgehammer has been tested with version 1.0.28.
blanchet@44969
   883
blanchet@46387
   884
\item[\labelitemi] \textbf{\textit{z3}:} Z3 is an SMT solver developed at
blanchet@42611
   885
Microsoft Research \cite{z3}. To use Z3, set the environment variable
blanchet@42611
   886
\texttt{Z3\_SOLVER} to the complete path of the executable, including the file
blanchet@45280
   887
name, and set \texttt{Z3\_NON\_COMMERCIAL} to ``yes'' to confirm that you are a
blanchet@49021
   888
noncommercial user. Sledgehammer has been tested with versions 3.0, 3.1, 3.2,
blanchet@49021
   889
and 4.0.
blanchet@42611
   890
blanchet@46387
   891
\item[\labelitemi] \textbf{\textit{z3\_tptp}:} This version of Z3 pretends to be
blanchet@46387
   892
an ATP, exploiting Z3's support for the TPTP untyped and typed first-order
blanchet@46731
   893
formats (FOF and TFF0). It is included for experimental purposes. It
blanchet@46731
   894
requires version 3.0 or above. To use it, set the environment variable
blanchet@46731
   895
\texttt{Z3\_HOME} to the directory that contains the \texttt{z3}
blanchet@46731
   896
executable.
blanchet@43786
   897
\end{enum}
blanchet@43786
   898
blanchet@47127
   899
The following remote provers are supported:
blanchet@43786
   900
blanchet@43786
   901
\begin{enum}
blanchet@46387
   902
\item[\labelitemi] \textbf{\textit{remote\_cvc3}:} The remote version of CVC3 runs
blanchet@43786
   903
on servers at the TU M\"unchen (or wherever \texttt{REMOTE\_SMT\_URL} is set to
blanchet@43786
   904
point).
blanchet@40254
   905
blanchet@46387
   906
\item[\labelitemi] \textbf{\textit{remote\_e}:} The remote version of E runs
blanchet@36918
   907
on Geoff Sutcliffe's Miami servers \cite{sutcliffe-2000}.
blanchet@36918
   908
blanchet@46387
   909
\item[\labelitemi] \textbf{\textit{remote\_e\_sine}:} E-SInE is a metaprover
blanchet@47935
   910
developed by Kry\v stof Hoder \cite{sine} based on E. It runs on Geoff
blanchet@47935
   911
Sutcliffe's Miami servers.
blanchet@44962
   912
blanchet@46387
   913
\item[\labelitemi] \textbf{\textit{remote\_e\_tofof}:} E-ToFoF is a metaprover
blanchet@44962
   914
developed by Geoff Sutcliffe \cite{tofof} based on E running on his Miami
blanchet@46387
   915
servers. This ATP supports the TPTP typed first-order format (TFF0). The
blanchet@44962
   916
remote version of E-ToFoF runs on Geoff Sutcliffe's Miami servers.
blanchet@44962
   917
blanchet@46387
   918
\item[\labelitemi] \textbf{\textit{remote\_iprover}:} iProver is a pure
blanchet@46210
   919
instantiation-based prover developed by Konstantin Korovin \cite{korovin-2009}. The
blanchet@46210
   920
remote version of iProver runs on Geoff Sutcliffe's Miami servers
blanchet@46210
   921
\cite{sutcliffe-2000}.
blanchet@46210
   922
blanchet@46387
   923
\item[\labelitemi] \textbf{\textit{remote\_iprover\_eq}:} iProver-Eq is an
blanchet@46210
   924
instantiation-based prover with native support for equality developed by
blanchet@46210
   925
Konstantin Korovin and Christoph Sticksel \cite{korovin-sticksel-2010}. The
blanchet@46210
   926
remote version of iProver-Eq runs on Geoff Sutcliffe's Miami servers
blanchet@46210
   927
\cite{sutcliffe-2000}.
blanchet@46210
   928
blanchet@46387
   929
\item[\labelitemi] \textbf{\textit{remote\_leo2}:} The remote version of LEO-II
blanchet@44969
   930
runs on Geoff Sutcliffe's Miami servers \cite{sutcliffe-2000}.
blanchet@43805
   931
blanchet@46387
   932
\item[\labelitemi] \textbf{\textit{remote\_satallax}:} The remote version of
blanchet@44969
   933
Satallax runs on Geoff Sutcliffe's Miami servers \cite{sutcliffe-2000}.
blanchet@43805
   934
blanchet@46387
   935
\item[\labelitemi] \textbf{\textit{remote\_snark}:} SNARK is a first-order
blanchet@44492
   936
resolution prover developed by Stickel et al.\ \cite{snark}. It supports the
blanchet@46387
   937
TPTP typed first-order format (TFF0). The remote version of SNARK runs on
blanchet@44492
   938
Geoff Sutcliffe's Miami servers.
blanchet@40254
   939
blanchet@46387
   940
\item[\labelitemi] \textbf{\textit{remote\_vampire}:} The remote version of
blanchet@49021
   941
Vampire runs on Geoff Sutcliffe's Miami servers.
blanchet@43786
   942
blanchet@46387
   943
\item[\labelitemi] \textbf{\textit{remote\_waldmeister}:} Waldmeister is a unit
blanchet@43786
   944
equality prover developed by Hillenbrand et al.\ \cite{waldmeister}. It can be
blanchet@44492
   945
used to prove universally quantified equations using unconditional equations,
blanchet@44492
   946
corresponding to the TPTP CNF UEQ division. The remote version of Waldmeister
blanchet@44492
   947
runs on Geoff Sutcliffe's Miami servers.
blanchet@42609
   948
blanchet@46387
   949
\item[\labelitemi] \textbf{\textit{remote\_z3}:} The remote version of Z3 runs on
blanchet@41190
   950
servers at the TU M\"unchen (or wherever \texttt{REMOTE\_SMT\_URL} is set to
blanchet@41190
   951
point).
blanchet@40254
   952
blanchet@46387
   953
\item[\labelitemi] \textbf{\textit{remote\_z3\_tptp}:} The remote version of ``Z3
blanchet@45282
   954
with TPTP syntax'' runs on Geoff Sutcliffe's Miami servers.
blanchet@36918
   955
\end{enum}
blanchet@36918
   956
blanchet@48513
   957
By default, Sledgehammer runs E, E-SInE, SPASS, Vampire, Z3 (or whatever
blanchet@44962
   958
the SMT module's \textit{smt\_solver} configuration option is set to), and (if
blanchet@44962
   959
appropriate) Waldmeister in parallel---either locally or remotely, depending on
blanchet@44962
   960
the number of processor cores available. For historical reasons, the default
blanchet@44962
   961
value of this option can be overridden using the option ``Sledgehammer:
blanchet@45607
   962
Provers'' in Proof General's ``Isabelle'' menu.
blanchet@36918
   963
blanchet@45607
   964
It is generally a good idea to run several provers in parallel. Running E,
blanchet@45607
   965
SPASS, and Vampire for 5~seconds yields a similar success rate to running the
blanchet@45607
   966
most effective of these for 120~seconds \cite{boehme-nipkow-2010}.
blanchet@40240
   967
blanchet@43894
   968
For the \textit{min} subcommand, the default prover is \textit{metis}. If
blanchet@43894
   969
several provers are set, the first one is used.
blanchet@43894
   970
blanchet@40240
   971
\opnodefault{prover}{string}
blanchet@40240
   972
Alias for \textit{provers}.
blanchet@40240
   973
blanchet@39227
   974
\opfalse{blocking}{non\_blocking}
blanchet@39227
   975
Specifies whether the \textbf{sledgehammer} command should operate
blanchet@39227
   976
synchronously. The asynchronous (non-blocking) mode lets the user start proving
blanchet@39227
   977
the putative theorem manually while Sledgehammer looks for a proof, but it can
blanchet@43836
   978
also be more confusing. Irrespective of the value of this option, Sledgehammer
blanchet@43836
   979
is always run synchronously for the new jEdit-based user interface or if
blanchet@43836
   980
\textit{debug} (\S\ref{output-format}) is enabled.
blanchet@39227
   981
blanchet@46579
   982
\optrue{slice}{dont\_slice}
blanchet@43314
   983
Specifies whether the time allocated to a prover should be sliced into several
blanchet@43314
   984
segments, each of which has its own set of possibly prover-dependent options.
blanchet@43317
   985
For SPASS and Vampire, the first slice tries the fast but incomplete
blanchet@43314
   986
set-of-support (SOS) strategy, whereas the second slice runs without it. For E,
blanchet@43317
   987
up to three slices are tried, with different weighted search strategies and
blanchet@43314
   988
number of facts. For SMT solvers, several slices are tried with the same options
blanchet@43317
   989
each time but fewer and fewer facts. According to benchmarks with a timeout of
blanchet@43317
   990
30 seconds, slicing is a valuable optimization, and you should probably leave it
blanchet@43317
   991
enabled unless you are conducting experiments. This option is implicitly
blanchet@43314
   992
disabled for (short) automatic runs.
blanchet@43314
   993
blanchet@43314
   994
\nopagebreak
blanchet@43314
   995
{\small See also \textit{verbose} (\S\ref{output-format}).}
blanchet@43314
   996
blanchet@46579
   997
\opsmart{minimize}{dont\_minimize}
blanchet@46579
   998
Specifies whether the minimization tool should be invoked automatically after
blanchet@46579
   999
proof search. By default, automatic minimization takes place only if
blanchet@46579
  1000
it can be done in a reasonable amount of time (as determined by
blanchet@46579
  1001
the number of facts in the original proof and the time it took to find or
blanchet@46579
  1002
preplay it) or the proof involves an unreasonably large number of facts.
blanchet@46579
  1003
blanchet@46579
  1004
\nopagebreak
blanchet@47907
  1005
{\small See also \textit{preplay\_timeout} (\S\ref{timeouts})
blanchet@47907
  1006
and \textit{dont\_preplay} (\S\ref{timeouts}).}
blanchet@46579
  1007
blanchet@36918
  1008
\opfalse{overlord}{no\_overlord}
blanchet@36918
  1009
Specifies whether Sledgehammer should put its temporary files in
blanchet@36918
  1010
\texttt{\$ISA\-BELLE\_\allowbreak HOME\_\allowbreak USER}, which is useful for
blanchet@36918
  1011
debugging Sledgehammer but also unsafe if several instances of the tool are run
blanchet@36918
  1012
simultaneously. The files are identified by the prefix \texttt{prob\_}; you may
blanchet@36918
  1013
safely remove them after Sledgehammer has run.
blanchet@36918
  1014
blanchet@36918
  1015
\nopagebreak
blanchet@36918
  1016
{\small See also \textit{debug} (\S\ref{output-format}).}
blanchet@36918
  1017
\end{enum}
blanchet@36918
  1018
blanchet@49402
  1019
\subsection{Relevance Filter}
blanchet@49402
  1020
\label{relevance-filter}
blanchet@49402
  1021
blanchet@49402
  1022
\begin{enum}
blanchet@49403
  1023
\opdefault{fact\_filter}{string}{smart}
blanchet@49403
  1024
Specifies the relevance filter to use. The following filters are available:
blanchet@49403
  1025
blanchet@49403
  1026
\begin{enum}
blanchet@49403
  1027
\item[\labelitemi] \textbf{\textit{mepo}:}
blanchet@49403
  1028
The traditional memoryless MePo relevance filter.
blanchet@49403
  1029
blanchet@49403
  1030
\item[\labelitemi] \textbf{\textit{mash}:}
blanchet@49403
  1031
The memoryful MaSh machine learner. MaSh relies on the external program
blanchet@49403
  1032
\texttt{mash}, which can be obtained from the author at \authoremail. To install
blanchet@49403
  1033
it, set the environment variable \texttt{MASH\_HOME} to the directory that
blanchet@49403
  1034
contains the \texttt{mash} executable.
blanchet@49403
  1035
blanchet@49403
  1036
\item[\labelitemi] \textbf{\textit{mesh}:} A combination of MePo and MaSh.
blanchet@49403
  1037
blanchet@49403
  1038
\item[\labelitemi] \textbf{\textit{smart}:} Use Mesh if \texttt{mash} is
blanchet@49403
  1039
installed and the target prover is an ATP; otherwise, use MePo.
blanchet@49403
  1040
\end{enum}
blanchet@49403
  1041
blanchet@49402
  1042
\opdefault{max\_facts}{smart\_int}{smart}
blanchet@49402
  1043
Specifies the maximum number of facts that may be returned by the relevance
blanchet@49402
  1044
filter. If the option is set to \textit{smart}, it is set to a value that was
blanchet@49402
  1045
empirically found to be appropriate for the prover. Typical values range between
blanchet@49402
  1046
50 and 1000.
blanchet@49402
  1047
blanchet@49402
  1048
\opdefault{fact\_thresholds}{float\_pair}{\upshape 0.45~0.85}
blanchet@49402
  1049
Specifies the thresholds above which facts are considered relevant by the
blanchet@49402
  1050
relevance filter. The first threshold is used for the first iteration of the
blanchet@49402
  1051
relevance filter and the second threshold is used for the last iteration (if it
blanchet@49402
  1052
is reached). The effective threshold is quadratically interpolated for the other
blanchet@49402
  1053
iterations. Each threshold ranges from 0 to 1, where 0 means that all theorems
blanchet@49402
  1054
are relevant and 1 only theorems that refer to previously seen constants.
blanchet@49402
  1055
blanchet@49403
  1056
\optrue{learn}{dont\_learn}
blanchet@49403
  1057
Specifies whether MaSh should be run automatically by Sledgehammer to learn the
blanchet@49403
  1058
available theories (and hence provide more accurate results). Learning only
blanchet@49403
  1059
takes place if \texttt{mash} is installed.
blanchet@49403
  1060
blanchet@49402
  1061
\opdefault{max\_new\_mono\_instances}{int}{smart}
blanchet@49402
  1062
Specifies the maximum number of monomorphic instances to generate beyond
blanchet@49402
  1063
\textit{max\_facts}. The higher this limit is, the more monomorphic instances
blanchet@49402
  1064
are potentially generated. Whether monomorphization takes place depends on the
blanchet@49402
  1065
type encoding used. If the option is set to \textit{smart}, it is set to a value
blanchet@49402
  1066
that was empirically found to be appropriate for the prover. For most provers,
blanchet@49402
  1067
this value is 200.
blanchet@49402
  1068
blanchet@49402
  1069
\nopagebreak
blanchet@49402
  1070
{\small See also \textit{type\_enc} (\S\ref{problem-encoding}).}
blanchet@49402
  1071
blanchet@49402
  1072
\opdefault{max\_mono\_iters}{int}{smart}
blanchet@49402
  1073
Specifies the maximum number of iterations for the monomorphization fixpoint
blanchet@49402
  1074
construction. The higher this limit is, the more monomorphic instances are
blanchet@49402
  1075
potentially generated. Whether monomorphization takes place depends on the
blanchet@49402
  1076
type encoding used. If the option is set to \textit{smart}, it is set to a value
blanchet@49402
  1077
that was empirically found to be appropriate for the prover. For most provers,
blanchet@49402
  1078
this value is 3.
blanchet@49402
  1079
blanchet@49402
  1080
\nopagebreak
blanchet@49402
  1081
{\small See also \textit{type\_enc} (\S\ref{problem-encoding}).}
blanchet@49402
  1082
\end{enum}
blanchet@49402
  1083
blanchet@36918
  1084
\subsection{Problem Encoding}
blanchet@36918
  1085
\label{problem-encoding}
blanchet@36918
  1086
blanchet@46387
  1087
\newcommand\comb[1]{\const{#1}}
blanchet@46387
  1088
blanchet@36918
  1089
\begin{enum}
blanchet@46387
  1090
\opdefault{lam\_trans}{string}{smart}
blanchet@46387
  1091
Specifies the $\lambda$ translation scheme to use in ATP problems. The supported
blanchet@46387
  1092
translation schemes are listed below:
blanchet@46387
  1093
blanchet@46387
  1094
\begin{enum}
blanchet@46387
  1095
\item[\labelitemi] \textbf{\textit{hide\_lams}:} Hide the $\lambda$-abstractions
blanchet@46387
  1096
by replacing them by unspecified fresh constants, effectively disabling all
blanchet@46387
  1097
reasoning under $\lambda$-abstractions.
blanchet@46387
  1098
blanchet@47194
  1099
\item[\labelitemi] \textbf{\textit{lifting}:} Introduce a new
blanchet@46387
  1100
supercombinator \const{c} for each cluster of $n$~$\lambda$-abstractions,
blanchet@46387
  1101
defined using an equation $\const{c}~x_1~\ldots~x_n = t$ ($\lambda$-lifting).
blanchet@46387
  1102
blanchet@47194
  1103
\item[\labelitemi] \textbf{\textit{combs}:} Rewrite lambdas to the Curry
blanchet@46387
  1104
combinators (\comb{I}, \comb{K}, \comb{S}, \comb{B}, \comb{C}). Combinators
blanchet@46387
  1105
enable the ATPs to synthesize $\lambda$-terms but tend to yield bulkier formulas
blanchet@46387
  1106
than $\lambda$-lifting: The translation is quadratic in the worst case, and the
blanchet@46387
  1107
equational definitions of the combinators are very prolific in the context of
blanchet@46387
  1108
resolution.
blanchet@46387
  1109
blanchet@47194
  1110
\item[\labelitemi] \textbf{\textit{combs\_and\_lifting}:} Introduce a new
blanchet@46387
  1111
supercombinator \const{c} for each cluster of $\lambda$-abstractions and characterize it both using a
blanchet@46387
  1112
lifted equation $\const{c}~x_1~\ldots~x_n = t$ and via Curry combinators.
blanchet@46387
  1113
blanchet@47194
  1114
\item[\labelitemi] \textbf{\textit{combs\_or\_lifting}:} For each cluster of
blanchet@47194
  1115
$\lambda$-abstractions, heuristically choose between $\lambda$-lifting and Curry
blanchet@47194
  1116
combinators.
blanchet@47194
  1117
blanchet@46387
  1118
\item[\labelitemi] \textbf{\textit{keep\_lams}:}
blanchet@46387
  1119
Keep the $\lambda$-abstractions in the generated problems. This is available
blanchet@46387
  1120
only with provers that support the THF0 syntax.
blanchet@46387
  1121
blanchet@46387
  1122
\item[\labelitemi] \textbf{\textit{smart}:} The actual translation scheme used
blanchet@46387
  1123
depends on the ATP and should be the most efficient scheme for that ATP.
blanchet@46387
  1124
\end{enum}
blanchet@46387
  1125
blanchet@47194
  1126
For SMT solvers, the $\lambda$ translation scheme is always \textit{lifting},
blanchet@47194
  1127
irrespective of the value of this option.
blanchet@46387
  1128
blanchet@47237
  1129
\opsmartx{uncurried\_aliases}{no\_uncurried\_aliases}
blanchet@47239
  1130
Specifies whether fresh function symbols should be generated as aliases for
blanchet@47239
  1131
applications of curried functions in ATP problems.
blanchet@47237
  1132
blanchet@44494
  1133
\opdefault{type\_enc}{string}{smart}
blanchet@44494
  1134
Specifies the type encoding to use in ATP problems. Some of the type encodings
blanchet@44494
  1135
are unsound, meaning that they can give rise to spurious proofs
blanchet@49108
  1136
(unreconstructible using \textit{metis}). The type encodings are
blanchet@47128
  1137
listed below, with an indication of their soundness in parentheses.
blanchet@49108
  1138
An asterisk (*) indicates that the encoding is slightly incomplete for
blanchet@47130
  1139
reconstruction with \textit{metis}, unless the \emph{strict} option (described
blanchet@47130
  1140
below) is enabled.
blanchet@43089
  1141
blanchet@43089
  1142
\begin{enum}
blanchet@49105
  1143
\item[\labelitemi] \textbf{\textit{erased} (unsound):} No type information is
blanchet@47128
  1144
supplied to the ATP, not even to resolve overloading. Types are simply erased.
blanchet@43453
  1145
blanchet@46387
  1146
\item[\labelitemi] \textbf{\textit{poly\_guards} (sound):} Types are encoded using
blanchet@47128
  1147
a predicate \const{g}$(\tau, t)$ that guards bound
blanchet@49105
  1148
variables. Constants are annotated with their types, supplied as extra
blanchet@43756
  1149
arguments, to resolve overloading.
blanchet@43555
  1150
blanchet@46387
  1151
\item[\labelitemi] \textbf{\textit{poly\_tags} (sound):} Each term and subterm is
blanchet@47128
  1152
tagged with its type using a function $\const{t\/}(\tau, t)$.
blanchet@43756
  1153
blanchet@46387
  1154
\item[\labelitemi] \textbf{\textit{poly\_args} (unsound):}
blanchet@44861
  1155
Like for \textit{poly\_guards} constants are annotated with their types to
blanchet@43843
  1156
resolve overloading, but otherwise no type information is encoded. This
blanchet@49105
  1157
is the default encoding used by the \textit{metis} command.
blanchet@43555
  1158
blanchet@46387
  1159
\item[\labelitemi]
blanchet@43587
  1160
\textbf{%
blanchet@45349
  1161
\textit{raw\_mono\_guards}, \textit{raw\_mono\_tags} (sound); \\
blanchet@45349
  1162
\textit{raw\_mono\_args} (unsound):} \\
blanchet@44861
  1163
Similar to \textit{poly\_guards}, \textit{poly\_tags}, and \textit{poly\_args},
blanchet@43587
  1164
respectively, but the problem is additionally monomorphized, meaning that type
blanchet@43587
  1165
variables are instantiated with heuristically chosen ground types.
blanchet@43587
  1166
Monomorphization can simplify reasoning but also leads to larger fact bases,
blanchet@43587
  1167
which can slow down the ATPs.
blanchet@43453
  1168
blanchet@46387
  1169
\item[\labelitemi]
blanchet@43587
  1170
\textbf{%
blanchet@45349
  1171
\textit{mono\_guards}, \textit{mono\_tags} (sound);
blanchet@45349
  1172
\textit{mono\_args} (unsound):} \\
blanchet@43587
  1173
Similar to
blanchet@45349
  1174
\textit{raw\_mono\_guards}, \textit{raw\_mono\_tags}, and
blanchet@45349
  1175
\textit{raw\_mono\_args}, respectively but types are mangled in constant names
blanchet@45349
  1176
instead of being supplied as ground term arguments. The binary predicate
blanchet@47128
  1177
$\const{g}(\tau, t)$ becomes a unary predicate
blanchet@47128
  1178
$\const{g\_}\tau(t)$, and the binary function
blanchet@47128
  1179
$\const{t}(\tau, t)$ becomes a unary function
blanchet@47128
  1180
$\const{t\_}\tau(t)$.
blanchet@43453
  1181
blanchet@47263
  1182
\item[\labelitemi] \textbf{\textit{mono\_native} (sound):} Exploits native
blanchet@47514
  1183
first-order types if the prover supports the TFF0, TFF1, or THF0 syntax;
blanchet@47514
  1184
otherwise, falls back on \textit{mono\_guards}. The problem is monomorphized.
blanchet@44492
  1185
blanchet@47263
  1186
\item[\labelitemi] \textbf{\textit{mono\_native\_higher} (sound):} Exploits
blanchet@47263
  1187
native higher-order types if the prover supports the THF0 syntax; otherwise,
blanchet@47263
  1188
falls back on \textit{mono\_native} or \textit{mono\_guards}. The problem is
blanchet@47263
  1189
monomorphized.
blanchet@43551
  1190
blanchet@47514
  1191
\item[\labelitemi] \textbf{\textit{poly\_native} (sound):} Exploits native
blanchet@49093
  1192
first-order polymorphic types if the prover supports the TFF1 syntax; otherwise,
blanchet@47514
  1193
falls back on \textit{mono\_native}.
blanchet@47514
  1194
blanchet@46387
  1195
\item[\labelitemi]
blanchet@43551
  1196
\textbf{%
blanchet@45349
  1197
\textit{poly\_guards}?, \textit{poly\_tags}?, \textit{raw\_mono\_guards}?, \\
blanchet@45349
  1198
\textit{raw\_mono\_tags}?, \textit{mono\_guards}?, \textit{mono\_tags}?, \\
blanchet@47263
  1199
\textit{mono\_native}? (sound*):} \\
blanchet@44861
  1200
The type encodings \textit{poly\_guards}, \textit{poly\_tags},
blanchet@45349
  1201
\textit{raw\_mono\_guards}, \textit{raw\_mono\_tags}, \textit{mono\_guards},
blanchet@47907
  1202
\textit{mono\_tags}, and \textit{mono\_native} are fully typed and sound. For
blanchet@47907
  1203
each of these, Sledgehammer also provides a lighter variant identified by a
blanchet@47907
  1204
question mark (`\hbox{?}')\ that detects and erases monotonic types, notably
blanchet@47907
  1205
infinite types. (For \textit{mono\_native}, the types are not actually erased
blanchet@47907
  1206
but rather replaced by a shared uniform type of individuals.) As argument to the
blanchet@47907
  1207
\textit{metis} proof method, the question mark is replaced by a
blanchet@47907
  1208
\hbox{``\textit{\_query\/}''} suffix.
blanchet@43460
  1209
blanchet@46387
  1210
\item[\labelitemi]
blanchet@43756
  1211
\textbf{%
blanchet@45640
  1212
\textit{poly\_guards}??, \textit{poly\_tags}??, \textit{raw\_mono\_guards}??, \\
blanchet@45640
  1213
\textit{raw\_mono\_tags}??, \textit{mono\_guards}??, \textit{mono\_tags}?? \\
blanchet@47128
  1214
(sound*):} \\
blanchet@45678
  1215
Even lighter versions of the `\hbox{?}' encodings. As argument to the
blanchet@45678
  1216
\textit{metis} proof method, the `\hbox{??}' suffix is replaced by
blanchet@47113
  1217
\hbox{``\textit{\_query\_query\/}''}.
blanchet@45678
  1218
blanchet@46387
  1219
\item[\labelitemi]
blanchet@45678
  1220
\textbf{%
blanchet@49199
  1221
\textit{poly\_guards}@, \textit{poly\_tags}@, \textit{raw\_mono\_guards}@, \\
blanchet@49199
  1222
\textit{raw\_mono\_tags}@ (sound*):} \\
blanchet@45678
  1223
Alternative versions of the `\hbox{??}' encodings. As argument to the
blanchet@49199
  1224
\textit{metis} proof method, the `\hbox{@}' suffix is replaced by
blanchet@49199
  1225
\hbox{``\textit{\_at\/}''}.
blanchet@45640
  1226
blanchet@49108
  1227
\item[\labelitemi] \textbf{\textit{poly\_args}?, \textit{raw\_mono\_args}? (unsound):} \\
blanchet@49108
  1228
Lighter versions of \textit{poly\_args} and \textit{raw\_mono\_args}.
blanchet@49108
  1229
blanchet@46387
  1230
\item[\labelitemi] \textbf{\textit{smart}:} The actual encoding used depends on
blanchet@47907
  1231
the ATP and should be the most efficient sound encoding for that ATP.
blanchet@43089
  1232
\end{enum}
blanchet@43089
  1233
blanchet@47263
  1234
For SMT solvers, the type encoding is always \textit{mono\_native}, irrespective
blanchet@45607
  1235
of the value of this option.
blanchet@43757
  1236
blanchet@43757
  1237
\nopagebreak
blanchet@43757
  1238
{\small See also \textit{max\_new\_mono\_instances} (\S\ref{relevance-filter})
blanchet@43757
  1239
and \textit{max\_mono\_iters} (\S\ref{relevance-filter}).}
blanchet@44436
  1240
blanchet@47130
  1241
\opfalse{strict}{non\_strict}
blanchet@47128
  1242
Specifies whether Sledgehammer should run in its strict mode. In that mode,
blanchet@47130
  1243
sound type encodings marked with an asterisk (*) above are made complete
blanchet@47128
  1244
for reconstruction with \textit{metis}, at the cost of some clutter in the
blanchet@47128
  1245
generated problems. This option has no effect if \textit{type\_enc} is
blanchet@47128
  1246
deliberately set to an unsound encoding.
blanchet@38814
  1247
\end{enum}
blanchet@36918
  1248
blanchet@36918
  1249
\subsection{Output Format}
blanchet@36918
  1250
\label{output-format}
blanchet@36918
  1251
blanchet@36918
  1252
\begin{enum}
blanchet@36918
  1253
blanchet@36918
  1254
\opfalse{verbose}{quiet}
blanchet@36918
  1255
Specifies whether the \textbf{sledgehammer} command should explain what it does.
blanchet@41456
  1256
This option is implicitly disabled for automatic runs.
blanchet@36918
  1257
blanchet@36918
  1258
\opfalse{debug}{no\_debug}
blanchet@40444
  1259
Specifies whether Sledgehammer should display additional debugging information
blanchet@40444
  1260
beyond what \textit{verbose} already displays. Enabling \textit{debug} also
blanchet@41456
  1261
enables \textit{verbose} and \textit{blocking} (\S\ref{mode-of-operation})
blanchet@41456
  1262
behind the scenes. The \textit{debug} option is implicitly disabled for
blanchet@41456
  1263
automatic runs.
blanchet@36918
  1264
blanchet@36918
  1265
\nopagebreak
blanchet@36918
  1266
{\small See also \textit{overlord} (\S\ref{mode-of-operation}).}
blanchet@36918
  1267
blanchet@36918
  1268
\opfalse{isar\_proof}{no\_isar\_proof}
blanchet@36918
  1269
Specifies whether Isar proofs should be output in addition to one-liner
blanchet@36918
  1270
\textit{metis} proofs. Isar proof construction is still experimental and often
blanchet@36918
  1271
fails; however, they are usually faster and sometimes more robust than
blanchet@36918
  1272
\textit{metis} proofs.
blanchet@36918
  1273
blanchet@40584
  1274
\opdefault{isar\_shrink\_factor}{int}{\upshape 1}
blanchet@36918
  1275
Specifies the granularity of the Isar proof. A value of $n$ indicates that each
blanchet@36918
  1276
Isar proof step should correspond to a group of up to $n$ consecutive proof
blanchet@36918
  1277
steps in the ATP proof.
blanchet@36918
  1278
\end{enum}
blanchet@36918
  1279
blanchet@39228
  1280
\subsection{Authentication}
blanchet@39228
  1281
\label{authentication}
blanchet@36918
  1282
blanchet@36918
  1283
\begin{enum}
blanchet@39228
  1284
\opnodefault{expect}{string}
blanchet@39228
  1285
Specifies the expected outcome, which must be one of the following:
blanchet@39228
  1286
blanchet@39228
  1287
\begin{enum}
blanchet@47128
  1288
\item[\labelitemi] \textbf{\textit{some}:} Sledgehammer found a proof.
blanchet@46387
  1289
\item[\labelitemi] \textbf{\textit{none}:} Sledgehammer found no proof.
blanchet@46387
  1290
\item[\labelitemi] \textbf{\textit{timeout}:} Sledgehammer timed out.
blanchet@46387
  1291
\item[\labelitemi] \textbf{\textit{unknown}:} Sledgehammer encountered some
blanchet@40444
  1292
problem.
blanchet@39228
  1293
\end{enum}
blanchet@39228
  1294
blanchet@39228
  1295
Sledgehammer emits an error (if \textit{blocking} is enabled) or a warning
blanchet@39228
  1296
(otherwise) if the actual outcome differs from the expected outcome. This option
blanchet@39228
  1297
is useful for regression testing.
blanchet@39228
  1298
blanchet@39228
  1299
\nopagebreak
blanchet@43879
  1300
{\small See also \textit{blocking} (\S\ref{mode-of-operation}) and
blanchet@43879
  1301
\textit{timeout} (\S\ref{timeouts}).}
blanchet@43879
  1302
\end{enum}
blanchet@43879
  1303
blanchet@43879
  1304
\subsection{Timeouts}
blanchet@43879
  1305
\label{timeouts}
blanchet@43879
  1306
blanchet@43879
  1307
\begin{enum}
blanchet@43879
  1308
\opdefault{timeout}{float\_or\_none}{\upshape 30}
blanchet@43879
  1309
Specifies the maximum number of seconds that the automatic provers should spend
blanchet@43879
  1310
searching for a proof. This excludes problem preparation and is a soft limit.
blanchet@43879
  1311
For historical reasons, the default value of this option can be overridden using
blanchet@45607
  1312
the option ``Sledgehammer: Time Limit'' in Proof General's ``Isabelle'' menu.
blanchet@43879
  1313
blanchet@47126
  1314
\opdefault{preplay\_timeout}{float\_or\_none}{\upshape 3}
blanchet@46251
  1315
Specifies the maximum number of seconds that \textit{metis} or \textit{smt}
blanchet@46251
  1316
should spend trying to ``preplay'' the found proof. If this option is set to 0,
blanchet@46251
  1317
no preplaying takes place, and no timing information is displayed next to the
blanchet@46251
  1318
suggested \textit{metis} calls.
blanchet@46579
  1319
blanchet@46579
  1320
\nopagebreak
blanchet@46579
  1321
{\small See also \textit{minimize} (\S\ref{mode-of-operation}).}
blanchet@47907
  1322
blanchet@47907
  1323
\optrueonly{dont\_preplay}
blanchet@47907
  1324
Alias for ``\textit{preplay\_timeout} = 0''.
blanchet@47907
  1325
blanchet@36918
  1326
\end{enum}
blanchet@36918
  1327
blanchet@36918
  1328
\let\em=\sl
blanchet@36918
  1329
\bibliography{../manual}{}
blanchet@36918
  1330
\bibliographystyle{abbrv}
blanchet@36918
  1331
blanchet@36918
  1332
\end{document}