Я хотел бы использовать Z3 для устранения квантификаторов в формулах линейной целочисленной арифметики через C/C++ API. Рассмотрим простой пример: Exists (x) ( x ‹= y & y ‹= 2*x). Бескванторная формула с теми же моделями имеет вид y >= 0.
Я пытался сделать это следующим образом:
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);
что я получаю
(существует ((x Int) (и (‹= x y) (‹= y (* 2 x))))
тогда как я хотел бы получить что-то вроде
(<= 0 y)
Есть ли возможность получить его с Z3? Спасибо заранее.