Eliminacja kwantyfikatora dla LIA w Z3 przez API C / C ++
Chciałbym użyć Z3 do eliminowania kwantyfikatorów w liniowych formułach arytmetycznych liczb całkowitych za pomocą API C / C ++. Rozważmy prosty przykład: istnieje (x) (x <= y & y <= 2 * x). Formuła wolna od kwantyfikatora z tymi samymi modelami to y> = 0.
Próbowałem to zrobić w ten sposób:
context ctx;
ctx.set("ELIM_QUANTIFIERS", "true");
expr x = ctx.int_const("x");
expr y = ctx.int_const("y");
expr sub_expr = (x <= y) && (y <= 2*x);
Z3_ast qf = Z3_mk_exists_const(ctx, 0, 1, (Z3_app[]) {x},
0, {}, // patterns don't seem to make sense here.
sub_expr); //No C++ API for quantifiers :(
qf = Z3_simplify(ctx, qf);
cout << Z3_ast_to_string(ctx, qf);
co dostaję to
(istnieje ((x Int) (i (<= x y) (<= y (* 2 x))))
podczas gdy chciałbym uzyskać coś takiego
(<= 0 y)
Czy istnieje możliwość zdobycia go z Z3? Z góry bardzo dziękuję.