@@ -184,7 +184,7 @@ sstat MainSolver::simplifyFormulas() {
184184 if (status == s_False) { break ; }
185185
186186 for (PTRef pref : decisionPreferences.scope (i)) {
187- giveDecisionPreferenceToSMTSolver (pref, frameId);
187+ giveDecisionPreferenceToSMTSolver (pref, frameId, context );
188188 }
189189 }
190190
@@ -346,15 +346,15 @@ PTRef MainSolver::rewriteMaxArity(PTRef root) {
346346 return opensmt::rewriteMaxArityClassic (logic, root);
347347}
348348
349- void MainSolver::giveDecisionPreferenceToSMTSolver (PTRef pref, FrameId frameId) {
349+ void MainSolver::giveDecisionPreferenceToSMTSolver (PTRef pref, FrameId frameId, PreprocessingContext const & pcontext ) {
350350 assert (logic.getSortRef (pref) == logic.getSort_bool ());
351351 assert (not logic.isConstant (pref));
352352
353353 // Ignores substitutions ..
354354 Lit l = [&] {
355355 if (term_mapper->hasLit (pref)) { return giveExistingDecisionPreferenceToSMTSolver (pref); }
356356 if (logic.isBoolVarLiteral (pref)) { return giveBoolVarDecisionPreferenceToSMTSolver (pref); }
357- return giveAnyDecisionPreferenceToSMTSolver (pref, frameId);
357+ return giveAnyDecisionPreferenceToSMTSolver (pref, frameId, pcontext );
358358 }();
359359
360360 smt_solver->pushUserBranchLit (l);
@@ -380,17 +380,25 @@ Lit MainSolver::giveBoolVarDecisionPreferenceToSMTSolver(PTRef pref) {
380380 return l;
381381}
382382
383- Lit MainSolver::giveAnyDecisionPreferenceToSMTSolver (PTRef pref, FrameId frameId) {
383+ Lit MainSolver::giveAnyDecisionPreferenceToSMTSolver (PTRef pref, FrameId frameId,
384+ PreprocessingContext const & pcontext) {
384385 assert (not term_mapper->hasLit (pref));
385386 assert (not logic.isBoolVarLiteral (pref));
386387
388+ // Cannot preprocess pref unconditionally - may result in a conflict
389+
387390 auto name = std::string{" .pref" } + std::to_string (pref.x );
388391 PTRef decisionVarTerm = logic.mkBoolVar (name.c_str ());
389392 Lit l = term_mapper->getOrCreateLit (decisionVarTerm);
390393 PTRef condTerm = logic.mkImpl (decisionVarTerm, pref);
394+ PTRef processed = preprocessFormula (condTerm, pcontext);
395+ assert (not logic.isConstant (processed));
396+ assert (not logic.isBoolVarLiteral (processed));
397+
391398 [[maybe_unused]]
392- sstat status = giveToSolver (condTerm , frameId);
399+ sstat status = giveToSolver (processed , frameId);
393400 assert (status == s_Undef);
401+
394402 assert (term_mapper->getLit (decisionVarTerm) == l);
395403 assert (term_mapper->getVar (decisionVarTerm) == var (l));
396404
0 commit comments