Prover9 Manual | Version 2009-02A |
Each list of hint clauses must start with formulas(hints). and end with end_of_list. Any clause is acceptable as a hint. For example (the label attributes are optional),
formulas(hints). x ' * (x * y) = y # label(6). x * (x * y) = y # label(7). x * (y * (x * y)) = e # label(8). x ' ' * e = x # label(9). x ' * e = x # label(10). x ' = x # label(11). x * e = x # label(12). x * (y * x) = y # label(13). x * y = y * x # label(14). end_of_list.
A derived clause matches a hint if it subsumes the hint. If a clause matches more than one hint, the first matching hint is used.
In Otter, "matching a hint" can mean (depending on the parameter settings) subsumes, subsumed by, or equivalent to. These other types of matching may be added to Prover9 if there is any demand for them.
Hints are used primarily when selecting given clauses. The mechanism for doing this is the given-clause selection procedure. In short, the default value of the hints_part parameter says to select clauses that match hints (lightest first) whenever any are available.
Hints are also used when deciding to keep a new clause. Clauses that match hints are not deleted by any of the parameters max_weight, max_vars, max_literals, or max_depth.
Bob Veroff developed the concept, installing code for hints in an early version of Otter, to experiment with his method of proof sketches [Veroff-hints, Veroff-sketches]. In the proof sketches method, a difficult conjecture is attacked by first proving several (or many) weakened variants of the conjecture, and using those proofs as hints to guide searches for a proof of the original conjecture.
The program Prooftrans, which is distributed along with Prover9, can be used to extract proofs from a Prover9 output file and transform the proofs to lists of hints suitable for input to subsequent Prover9 jobs.
prover9 -f hard.in > hard.out
prover9 -f easy.in > easy.out
prooftrans hints -f easy.out > easy.hints
prover9 -f hard.in easy.hints > hard-hints.out
formulas(hints). x ' * (x * y) = y # label("very important hint") # bsub_hint_wt(-100). end_of_list.Another way to assign a special weight is with the following flag.
set(breadth_first_hints). clear(breadth_first_hints). % default clear
Setting this flag causes all clauses that match hints to receive weight 0. The effect is as if each hint had the attribute bsub_hint_wt(0). This causes clauses that match hints to be selected in the order they are generated.
The weight assigned by any of the preceding methods may be modified if the flag degrade_hints is set.
set(degrade_hints). % default set clear(degrade_hints).
If this flag is set, a weight penalty is added to clauses that match hints that have been previously matched. The following procedure is used. Given a newly derived clause, say C, assume we find a hint that matches the clause; let n be the number of times the hint has already been matched; then the weight of C is increased by (n * 1000). In other words, 1000 is added for each previous match of the hint.The effect of this procedure is (usually) that clauses matching hints are selected in the following order: clauses matching hints that have not been matched before, clauses matching hints that have been matched once before, and so on.
set(limit_hint_matchers). clear(limit_hint_matchers). % default clear
If this flag is set, the parameters max_weight, max_literals, max_depth, and max_vars will be applied to clauses that match hints (as well as to clauses that don't match hints).Otherwise (the default), those limits will not be applied to clauses that match hints.
set(back_demod_hints). % default set clear(back_demod_hints).
If this flag is set, hints are back demodulated. That is, they are kept simplified with respect to the current set of demodulators.
The following flag addresses the situation in which the input contains
sets of equivalent hints. (This situation frequently occurs when the
hints contain many proofs of similar theorems.)
If this flag is clear, when a clause matches a set of equivalent hints,
it receives the label (if any) from the first copy only.
set(collect_hint_labels).
clear(collect_hint_labels). % default clear
If this flag is set, and the hints list contains a set of equivalent hints,
only the first copy of the hint is retained. However, the labels from
all of the other equivalent hints are collected and put on the retained
copy. When a clause matches the retained hint, it gets copies of all of the
labels from the equivalent hints.
Next Section:
Semantics