Я играю с z3 и другими решателями SMT и хочу изучить случаи, когда другие решатели, такие как boolector, побеждают z3 и наоборот. Для этой цели мне нужен способ преобразования объявлений и утверждений в формат SMT-LIB2, который могут распознавать другие решатели SMT.
Например, для этого примера
void print_as_smtlib2_string() {
context c;
expr x = c.int_const("x");
expr y = c.int_const("y");
solver s(c);
s.add(x >= 1);
s.add(y < x + 3);
std::cout << s.check() << "\n";
Z3_set_ast_print_mode(c, Z3_PRINT_SMTLIB_COMPLIANT);
std::cout << "\nSolver is:\n";
std::cout << s << "\n";
}
Я получаю что-то вроде: сидел
Решатель: (решатель (>= x 1) (‹ y (+ x 3)))
Вместо этого я хочу что-то вроде этого (ссылка на rise4fun: http://rise4fun.com/Z3/aznC8):
(declare-const x Int)
(declare-const y Int)
(assert (>= x 1))
(assert (< y (+ x 3)))
(check-sat)
Я пробовал функции C API, такие как Z3_set_ast_print_mode, Z3_ast_to_string, но безуспешно. Я просмотрел Z3_benchmark_to_smtlib_string, но этот пост Входные аргументы Z3_benchmark_to_smtlib_string() предполагает, что он поддерживает только SMTLIB 1.0.