Я играю с z3 и другими SMT-решателями и хочу рассмотреть случаи, когда другие решатели, такие как булекторный триумф над 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";
}
Я получаю что-то вроде:
Суббота
Солвер это:
(решатель
(> = х 1)
(< у (+ х 3)))
Вместо этого я хочу что-то вроде этого (ссылка rise4fun: http://rise4fun.com/Z3/aznC8):
(declare-const x Int)
(declare-const y Int)
(assert (>= x 1))
(assert (< y (+ x 3)))
(check-sat)
Я пробовал функции API C, такие как Z3_set_ast_print_mode, Z3_ast_to_string, но не увенчались успехом. Я посмотрел на Z3_benchmark_to_smtlib_string, но этот пост Входные аргументы Z3_benchmark_to_smtlib_string () предполагает, что он поддерживает только SMTLIB 1.0.
Z3_benchmark_to_smtlib_string — единственная функция, которую Z3 имеет для этой цели. Как и тот пост, о котором вы упоминаете, он был расширен до SMTLIB2. Как говорит Лео в своем ответе на этот пост, это старая функция, которая используется редко, и она может не поддерживать сброс всех функций (например, параметров в решателях). Недавно был также еще один пост, касающийся этой функции и проблем / ошибок в более старых версиях Z3 (см. Вот).
Других решений пока нет …