Skip to content

Add predicate elimination as a new preprocessing step - #892

Open
quickbeam123 wants to merge 1 commit into
masterfrom
predicate_elimination
Open

Add predicate elimination as a new preprocessing step#892
quickbeam123 wants to merge 1 commit into
masterfrom
predicate_elimination

Conversation

@quickbeam123

Copy link
Copy Markdown
Collaborator

Implements the technique of Khasidashvili and Korovin (SAT 2016): a predicate P occurring at most once in every clause is eliminated by replacing S_P and S_~P with all pairwise resolvents on P. On problems without equality and theories, resolvents are computed with an mgu and non-unifiable pairs dropped; otherwise the P-literals are (virtually) flattened, introducing argument disequalities which are then simplified away by exhaustive equality substitution (this can introduce equality into a problem previously without it). FMB forces the equational mode, since its model reconstruction cannot rely on the Herbrand-interpretation argument justifying the mgu variant.

Elimination steps are gated SAT-VE-style by growth limits on the estimated clause count |S_P|*|S_~P| - |S_P| - |S_~P|: a global cap relative to the original total (-peltl, default 2.0). Syntactic tautologies (complementary pair, s = s) and duplicate literals are removed from generated resolvents, and the actual surviving count feeds back into the budget.

The next predicate to eliminate is by default the one with the smallest estimated growth (pure predicates thus go first, their clauses being simply deleted)

With -pels, the clause set is kept forward-inter-subsumed throughout, using a standalone LiteralSubstitutionTree index (unit literal, or the least matchable one) plus SATSubsumptionAndResolution; backward subsumption is left as future work.

Every elimination records a model-repairing definition
P(xs) <=> /_{D / P(ts) in S_P} exists ys. (xs = ts /\ ~D)
via Problem::addEliminatedPredicate (addTrivialPredicate for pure ones), so both the textual model updates output and FMB model restoration stay correct (verified via --mode model_check).

Skipped for higher-order/polymorphic inputs (predicates could hide inside terms, breaking the occurrence counting) and for color-annotated problems.

…default off)

Implements the technique of Khasidashvili and Korovin (SAT 2016): a predicate P
occurring at most once in every clause is eliminated by replacing S_P and S_~P
with all pairwise resolvents on P. On problems without equality and theories,
resolvents are computed with an mgu and non-unifiable pairs dropped; otherwise
the P-literals are (virtually) flattened, introducing argument disequalities
which are then simplified away by exhaustive equality substitution (this can
introduce equality into a problem previously without it). FMB forces the
equational mode, since its model reconstruction cannot rely on the
Herbrand-interpretation argument justifying the mgu variant.

Elimination steps are gated SAT-VE-style by growth limits on the estimated
clause count |S_P|*|S_~P| - |S_P| - |S_~P|: a per-step tolerance factor over
the current total (-pelst, default 1.05) and a global cap relative to the
original total (-peltl, default 2.0). Syntactic tautologies (complementary
pair, t != t, s = s) and duplicate literals are removed from generated
resolvents, and the actual surviving count feeds back into the budget.

The next predicate to eliminate is by default the one with the smallest
estimated growth (pure predicates thus go first, their clauses being simply
deleted); with -pelr the choice is uniformly random among the admissible
candidates (controlled by random_seed), since the process is not confluent.

With -pels, the clause set is kept forward-inter-subsumed throughout, using a
standalone LiteralSubstitutionTree index (unit literal, or the least matchable
one) plus SATSubsumptionAndResolution; backward subsumption is left as future
work.

Every elimination records a model-repairing definition
  P(xs) <=> \/_{D \/ P(ts) in S_P} exists ys. (xs = ts /\ ~D)
via Problem::addEliminatedPredicate (addTrivialPredicate for pure ones), so
both the textual model updates output and FMB model restoration stay correct
(verified via --mode model_check).

Skipped for higher-order/polymorphic inputs (predicates could hide inside
terms, breaking the occurrence counting) and for color-annotated problems.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@quickbeam123
quickbeam123 requested review from MichaelRawson and mezpusz and removed request for MichaelRawson August 3, 2026 10:21
@quickbeam123

quickbeam123 commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator Author

The original commit message is preserved in the commit but describes more than what I eventually decided to keep. (I used interactive rebasing and "fixup" to hide my update commits, not sure if for the better.)

A TPTP FOL discount comparison is now:

Sort by SAT
1025 ['problemsSTD_pel10964_dis10_i10K.pkl']
1073 ['problemsSTD_pel10964_dis10_pel_i10K.pkl']

Sort by UNS
8406 ['problemsSTD_pel10964_dis10_i10K.pkl']
8591 ['problemsSTD_pel10964_dis10_pel_i10K.pkl']

Total 1108 / 8826

Num only-by (UNS):
   problemsSTD_pel10964_dis10_i10K.pkl 235
   problemsSTD_pel10964_dis10_pel_i10K.pkl 420

Greedy cover (UNS):
# problemsSTD_pel10964_dis10_pel_i10K.pkl contributes 8591 total 8591
# problemsSTD_pel10964_dis10_i10K.pkl contributes 235 total 8406
Total 8826

Overall, I already reviewed this and as a separate module in preprocessing, this shouldn't cause any problems.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant