From bcee5ef4d425033b163970d15ec9e19c6fbb7e91 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 12 Jul 2026 23:49:22 +0000 Subject: [PATCH] Add regression test for QE unsoundness issue #4175 --- src/test/quant_solve.cpp | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/test/quant_solve.cpp b/src/test/quant_solve.cpp index 28667917fc..8bf0818a30 100644 --- a/src/test/quant_solve.cpp +++ b/src/test/quant_solve.cpp @@ -168,6 +168,44 @@ static void test_quant_solver(ast_manager& m, char const* str, bool validate = t test_quant_solver(m, vars.size(), vars.data(), fml, validate); } +static void test_qe_regression_4175() { + ast_manager m; + reg_decl_plugins(m); + smt_params params; + arith_util a(m); + + expr_ref fml = parse_fml(m, "(forall ((b Real)) (= (= r1 b) (= b 0)))"); + expr_ref result(m); + qe::expr_quant_elim qe(m, params); + qe(m.mk_true(), fml, result); + + expr_ref r1(m.mk_const(symbol("r1"), a.mk_real()), m); + expr_ref zero(a.mk_numeral(rational(0), false), m); + + { + smt::kernel solver(m, params); + solver.assert_expr(fml); + VERIFY(l_true == solver.check()); + } + { + smt::kernel solver(m, params); + solver.assert_expr(result); + VERIFY(l_true == solver.check()); + } + { + smt::kernel solver(m, params); + solver.assert_expr(result); + solver.assert_expr(m.mk_eq(r1, zero)); + VERIFY(l_true == solver.check()); + } + { + smt::kernel solver(m, params); + solver.assert_expr(result); + solver.assert_expr(m.mk_not(m.mk_eq(r1, zero))); + VERIFY(l_false == solver.check()); + } +} + static void test_quant_solve1() { ast_manager m; @@ -253,6 +291,7 @@ void tst_quant_solve() { disable_debug("heap"); test_quant_solve1(); + test_qe_regression_4175(); #if 0 memory::finalize(); @@ -263,4 +302,3 @@ void tst_quant_solve() { #endif } -