![](bg3.png)
OTTER are factoring and weighting. The purpose of a weight clause is give a weight to
variables or terms and if such weight is chosen sufficiently high then the generation of
too many irrelevant paramodulants is effectively blocked. Note, however, that the use
of a weight leads to an incomplete search strategy.
An OTTER program is divided into several sections, each such section made up
of first-order formulae or clauses (an exception is the section containing the optional
demodulators which must be in clausal form already). The most important sections are
the usable list and the set-of-support (sos) list. It is customary to place the negation of
the theorem to be proven in the sos and the rest of the information in the usable list.
Next we introduce a number of heuristics for reasoning about set theory. These
heuristics were developed to address the problems discussed in Sect. 1.1.
3 Set-Theoretic Reasoning Heuristics
The heuristics presented in this section are detailed in [5, ?] and have been developed
empirically through observing the behaviour of, as well as studying the format of the
clauses generated by the reasoner during a proof attempt. In total 14 heuristics were
developed and we briefly discuss some prominent ones below:
1. Weight strategy: Use the setting weight(x,n), for n ∈ {3, 4, 5}, whenever the
sos consists of the negation of an equality literal. Equality reasoning with paramod-
ulation generally results in the generation of many irrelevant clauses. Assigning a
weight of n to all variables avoids the generation of too many irrelevant paramod-
ulants. Empirically we found a weight of 3, 4 or 5 to be sufficient.
2. Extensionality: Use the principle of extensionality to replace an equality in the sos
with the condition under which two sets are equal, i.e. whenever their elements are
the same.
3. Nested functors: Avoid, if possible, the use of nested functor symbols in definitions.
Terms built up with the aid of function symbols (called functors) are more complex,
potentially leading to difficulties with unification of terms, especially when these
functors are nested inside other structures.
4. Divide and Conquer: Perform two separate subset proofs whenever the problem at
hand requires one to prove the equality of two sets. An equality in the sos implies
(via Extensionality) an ‘if and only if’. Hence a specifier may opt for two proofs,
one for the only-if part and another for the if part.
5. Multivariate functors: Make terms in sets as simple as possible — either not in-
volving functors at all, or else involving functors with the minimum number of
argument positions taken up by variables. The more variables occur as arguments
to a functor, the greater the likelihood of thrashing caused by the unification of
these variables with other terms.
6. Intermediate structures: Avoid complex functor expressions by using an indirect
definition for an internal structure whenever this appears less likely to produce
complex functor expressions than the direct definition. In practice we simply give a
name to a complex structure that is nested inside another structure and then define
the inner structure externally on its own, instead of unfolding its definition directly
inside the enclosing structure.
12