3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-07-27 01:12:40 +00:00
z3/src/sat
Nikolaj Bjorner 88448d4afd
Fix unsound model from parallel QF_BV solving (#10133) (#10142)
## Problem

Fixes #10133. For `QF_BV` with `parallel.enable=true`, the solver could
return `sat` with a model that violates its own assertions.

`mk_qfbv_tactic` routes SAT solving to `mk_psat_tactic`, which built the
solver via `mk_inc_sat_solver(m, p, false)` (non-incremental). The
parallel cube-and-conquer engine **reuses this single solver** across
many `check_sat(cube)` calls, but SAT variable/blocked-clause
elimination ran because the simplifier's incremental gate was disabled.
Elimination model reconstruction is only sound for a single one-shot
solve; under repeated cube assumptions it produces models where
eliminated Tseitin variables get values contradicting the original
clauses.

## Root cause (two coupled defects)

1. **Stale simplifier cache.** `inc_sat_solver`'s constructor called
`m_solver.set_incremental()` *after* `updt_params()`. The SAT simplifier
caches `m_incremental_mode` from the SAT config *during* `updt_params`,
so setting the incremental flag afterwards left a stale non-incremental
mode and elimination stayed enabled. (This is why simply passing
`incremental_mode=true` had no effect on its own.)
2. **Non-incremental parallel solver.** `mk_psat_tactic` created the
reused solver as non-incremental.

## Fix

- Move `set_incremental()` **before** `updt_params()` in the
`inc_sat_solver` constructor so the simplifier caches the correct mode.
- Create the parallel solver with `incremental_mode=true` in
`mk_psat_tactic`.

## Validation

- Variable elimination on the QF_BV parallel path drops to zero
(`sat-elim-bool-vars-res` 21664 -> 0); remaining `elim-clauses/literals`
are sound cleaner/subsumption steps.
- Consistent with ground truth: on 4.16.0, `sat.elim_vars=false` removed
all 7 `failed to verify` errors; this change disables exactly that
unsound elimination, scoped to the reused/parallel solver.
- A solvable QF_BV instance returns a **valid** model under
`parallel.enable=true model_validate=true`.
- All 92 unit tests pass (`test-z3 /a`).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-16 11:47:07 -07:00
..
sat_solver Fix unsound model from parallel QF_BV solving (#10133) (#10142) 2026-07-16 11:47:07 -07:00
smt Issue 438 (#10085) 2026-07-12 13:35:57 -07:00
tactic Standardize for-loop increments to prefix form (++i) (#8199) 2026-01-14 19:55:31 -08:00
CMakeLists.txt remove stale experimental code #8063 2025-12-12 05:49:05 +00:00
dimacs.cpp deal with compiler warnings and include value exchange prior to final check. 2025-01-24 09:40:33 -08:00
dimacs.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_aig_finder.cpp Fix static analysis issues: null dereferences, unsafe casts, branch clones, uninitialized members (#9424) 2026-04-29 13:37:11 -07:00
sat_aig_finder.h remove a hundred implicit constructors/destructors 2021-05-23 14:25:01 +01:00
sat_allocator.h booyah 2020-07-04 15:56:30 -07:00
sat_anf_simplifier.cpp Refactor sat_anf_simplifier to use C++17 structured bindings (#8358) 2026-01-27 09:59:26 -08:00
sat_anf_simplifier.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_asymm_branch.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_asymm_branch.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_asymm_branch_params.pyg bug fixes 2018-02-19 21:49:03 -08:00
sat_bcd.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_bcd.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_big.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_big.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_clause.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_clause.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_clause_set.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_clause_set.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_clause_use_list.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_clause_use_list.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_cleaner.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_cleaner.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_config.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_config.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_ddfw_wrapper.cpp flip tabu on predicate being repaired, add model rotation code 2025-01-02 14:39:36 -08:00
sat_ddfw_wrapper.h Remove redundant overridden default destructors (#8191) 2026-01-14 18:41:26 +00:00
sat_drat.cpp Centralize and document TRACE tags using X-macros (#7657) 2025-05-28 14:31:25 +01:00
sat_drat.h Replace empty destructors with = default for compiler optimization (#8189) 2026-01-13 10:50:10 -08:00
sat_elim_eqs.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_elim_eqs.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_extension.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_gc.cpp Standardize for-loop increments to prefix form (++i) (#8199) 2026-01-14 19:55:31 -08:00
sat_integrity_checker.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_integrity_checker.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_justification.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_local_search.cpp Centralize and document TRACE tags using X-macros (#7657) 2025-05-28 14:31:25 +01:00
sat_local_search.h remove default destructors 2024-10-02 22:20:12 +01:00
sat_lookahead.cpp Fix 13 compiler warnings: sign-comparison and unused parameters (#8215) 2026-01-16 16:00:42 -08:00
sat_lookahead.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_model_converter.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_model_converter.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_mus.cpp replace some copies with moves 2026-02-09 22:45:28 +00:00
sat_mus.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_npn3_finder.cpp No need to hash quaternaries for AND. 2020-03-01 04:10:25 -08:00
sat_npn3_finder.h remove a hundred implicit constructors/destructors 2021-05-23 14:25:01 +01:00
sat_parallel.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_parallel.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_prob.cpp create insert-fresh and insert for indexed_uint_set to make use cases with non-fresh inserts easier 2023-08-03 09:48:07 -07:00
sat_prob.h fix #6599 2023-02-18 14:18:02 -08:00
sat_probing.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_probing.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_proof_trim.cpp fix bug in trim code missing dependecy 2025-06-07 15:39:05 -07:00
sat_proof_trim.h Migrate codebase to std::string_view (except z3++.h) (#8266) 2026-01-21 09:30:41 -08:00
sat_scc.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_scc.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_scc_params.pyg working on completing ATE/ALA for acce and abce 2018-01-29 20:32:06 -08:00
sat_simplifier.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_simplifier.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_simplifier_params.pyg remove unused bdd based variable elimination 2025-04-14 16:07:41 -07:00
sat_solver.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_solver.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_solver_core.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_types.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_watched.cpp Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_watched.h Remove unnecessary semicolons (Attempt 2) (#10020) 2026-07-02 12:47:29 -07:00
sat_xor_finder.cpp replace some copies with moves 2026-02-09 22:45:28 +00:00
sat_xor_finder.h remove a hundred implicit constructors/destructors 2021-05-23 14:25:01 +01:00