Преобразование объектов ast (или решателя) API z3 C ++ в строку SMTLIB

Я играю с 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.

2

Решение

Z3_benchmark_to_smtlib_string — единственная функция, которую Z3 имеет для этой цели. Как и тот пост, о котором вы упоминаете, он был расширен до SMTLIB2. Как говорит Лео в своем ответе на этот пост, это старая функция, которая используется редко, и она может не поддерживать сброс всех функций (например, параметров в решателях). Недавно был также еще один пост, касающийся этой функции и проблем / ошибок в более старых версиях Z3 (см. Вот).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]