Для моего кода приложения я использовал следующие параметры для параметров z3 для моего решателя
z3::params p(context);
p.set(":relevancy", static_cast<unsigned>(1));
p.set(":logic", QF_ABV);
p.set(":timeout", timeout);
solver.set(p);
После обновления до последнего неуспешного Z # я получил исключения C++, в основном заявляющие, что логика и таймаут не являются допустимыми параметрами. Я не нашел эквивалентного варианта для логики, поэтому я предполагаю, что это выводится автоматически. Однако для тайм-аута есть два варианта soft_timout и solver2_timeout. Я знаю, что solver2_timeout используется для инкрементного решателя (т.е. С помощью push/pops), поэтому я изменил код, чтобы использовать следующие параметры.
z3::params p(context);
p.set(":relevancy", static_cast<unsigned>(1));
p.set(":soft_timeout", yices_timeout);
solver.set(p)
Правильно ли это изменение? Как soft_timeout отличается от таймаута? Есть ли документация для действительных "z3 :: params" где-то поддерживается?
Документацию по параметрам можно получить, запустив z3 -p
. Более подробную информацию о конкретной опции можно получить, выполнив z3 -pp:option_name
.
Инфраструктура параметров обнаружила значительные изменения в 4.3.2; теперь есть модули параметров, а soft_timeout находится в модуле smt, т.е. собственное имя - smt.soft_timeout
. Логики нет, но мы не можем предположить, что она будет определена автоматически (работает только для некоторых из них). Вместо этого мы теперь можем создавать объекты Solver для определенной логики (в C++ через solver::solver(context & c, char const * logic)
) или использовать одну из предопределенных тактик SMT (см., Например, учебник по стратегиям)