3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-03-16 10:10:02 +00:00

Merge pull request #8789 from Z3Prover/succ_int_mult

Fix #7507: simplify (>= product_of_consecutive_ints 0) to true
This commit is contained in:
Lev Nachmanson 2026-02-27 09:45:26 -10:00 committed by GitHub
commit 5ff5b075b2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 66 additions and 0 deletions

View file

@ -33,6 +33,21 @@ static expr_ref parse_fml(ast_manager& m, char const* str) {
static char const* example1 = "(<= (+ (* 1.3 x y) (* 2.3 y y) (* (- 1.1 x x))) 2.2)";
static char const* example2 = "(= (+ 4 3 (- (* 3 x x) (* 5 y)) y) 0)";
static expr_ref parse_int_fml(ast_manager& m, char const* str) {
expr_ref result(m);
cmd_context ctx(false, &m);
ctx.set_ignore_check(true);
std::ostringstream buffer;
buffer << "(declare-const I Int)\n"
<< "(declare-const S Int)\n"
<< "(assert " << str << ")\n";
std::istringstream is(buffer.str());
VERIFY(parse_smt2_commands(ctx, is));
ENSURE(!ctx.assertions().empty());
result = ctx.assertions().get(0);
return result;
}
void tst_arith_rewriter() {
ast_manager m;
@ -56,4 +71,16 @@ void tst_arith_rewriter() {
fml = parse_fml(m, example2);
rw(fml);
std::cout << mk_pp(fml, m) << "\n";
// Issue #7507: (>= (* I (+ I 1)) 0) should simplify to true
fml = parse_int_fml(m, "(>= (* I (+ I 1)) 0)");
rw(fml);
std::cout << "consecutive product >= 0: " << mk_pp(fml, m) << "\n";
ENSURE(m.is_true(fml));
// (>= (* I (+ I (- 1))) 0) should also simplify to true (x*(x-1))
fml = parse_int_fml(m, "(>= (* I (+ I (- 1))) 0)");
rw(fml);
std::cout << "consecutive product (minus) >= 0: " << mk_pp(fml, m) << "\n";
ENSURE(m.is_true(fml));
}