Quantifier decisions and checking evidence#
This page records why particular settings were selected and what external checks established. The implementation chapter describes current behavior. All counts below belong to their recorded revision, not to a new evaluation of the documentation branch.
Tuple order and round size#
The run 2026-09-13-quantifiers-tuple-orders-144606 in the
ledger compares six orders at fc786f1, on
7,590 UF files with a 60-second cutoff and a 100,000-distinct-instance budget.
References were reused by path from the recorded Z3/cvc5 run.
Order |
Solved |
|---|---|
|
1867 |
|
1891 |
|
1911 |
|
1876 |
|
1864 |
|
1846 |
This comparison motivated sum as the default. It gained 82 files and lost 38
against max; it was not uniformly better. The virtual best solved 2,020,
which motivates investigating portfolios but is not an implemented portfolio
result. The experiment predates later generated-term correctness repairs.
Its ranking is historical evidence, not fresh qualification of today’s default.
The cited enumeration papers justify methods and completeness conditions;
they do not establish Primo’s best default configuration.
Later question |
Recorded result and boundary |
|---|---|
One instance or 128 per round? |
|
Stop a round after prolonged redundant enumeration? |
|
Did the generated-term repair receive a fresh gate? |
|
Retain the comparison artifacts named in those records, including
results/uf-quantifier-compare-144606 and its per-order summaries. The
original chronology also preserves
round/stall counters and the separate cvc5 enumeration comparison.
What a pool-guided cvc5 check proves#
quantifier_pool_check.py checks
selected Primo UNSAT answers. It adds pool annotations to the original
input and runs cvc5 with --pool-inst. It is not a quantified SAT-model
validator. Pool terms guide cvc5’s own instantiation; Primo’s chosen universal
instances are not accepted as a proof.
The export contains fresh Skolem/Herbrand constants, pools, and witness lemmas. For an existential \(Q=\exists x.B(x)\), the witness condition \(Q\Rightarrow B(c)\) is satisfiability-preserving when \(c\) is fresh: if \(Q\) is true, choose a witness; otherwise the implication imposes no requirement. For false universal \(Q=\forall x.B(x)\), use \(\neg Q\Rightarrow\neg B(c)\). Each group must witness only its own obligation; the freshness and dependency conditions are essential.
The exporter marks top-level
existentials and negated universals. The checker locates an eligible original
assertion by quantifier kind, variable sorts and occurrence, looking through
let and annotations. It adds a witness instance constructed from the input’s
own text and drops the corresponding printed lemma. It retains the original
assertion. Matching a different eligible assertion still permits a fresh witness
for that assertion; it can make the pools less useful without changing
satisfiability, provided the witness group is not constrained elsewhere.
Unlinked witness lemmas remain as printed. Therefore the check still relies on the export obeying the fresh-witness contract and on correct reconstruction and serialization of those lemmas. The script does not independently prove that arbitrary exported assertions are conservative extensions. Its annotation-stripping check establishes that adding pools preserved the original command text; it does not establish all witness obligations. Describe these runs as independent cvc5 corroboration under the export contract, not as proof checking independent of every possible Primo printing/export defect.
Terms or lemmas mentioning unexportable internal constants are skipped and
counted. Losing pool hints or conservative witness lemmas can lose a
confirmation; it cannot establish one. The checker rejects scoped input and
uses logic ALL for pool syntax. The
checker tests cover
annotation restoration, top-level linking, unmatched exports, command ordering,
definitions and result classification. They are not a formal verification of
the complete trust argument.
Recorded corroborations and negative controls#
2026-09-15-quantifiers-cvc5-pool-checks, at 3b9264a, used 60 seconds each
for Primo and cvc5 1.3.4 with --pool-inst, one CPU and 4 GB per array task.
The final arrays were jobs 146068 and 146069; the ledger preserves their
commands and separate artifact directories.
Of 1,947 selected UNSAT answers, 1,601 were corroborated, 345 remained inconclusive, and one was not checked because the Primo rerun timed out. The record reports nine reference-less answers still unconfirmed. Of 109 reference-SAT negative controls, 100 ran without a cvc5 UNSAT result and nine were not checked. These controls support the implementation argument but do not prove that every export is sound. Keep the unconfirmed and unchecked rows visible; no new run is performed by this rewrite.