Вопрос по – Z3 C API Изменение времени ожидания во время выполнения

1

Можно ли изменить значение времени ожидания решателя во время выполнения, используя C API? Чтобы установить время ожидания, можно сделать следующее:

Z3_config  cfg = Z3_mk_config();
Z3_set_param_value(cfg, "SOFT_TIMEOUT", "10000") // set timeout to 10 seconds
Z3_context ctx = Z3_mk_context(cfg);
....
Z3_check_and_get_model(ctx);
....
....
Z3_check_and_get_model(ctx);

Однако предположим, что мы хотим изменить время ожидания для следующего запроса при сохранении контекста. Можно ли изменить значение времени ожидания между ними?

Я только что наткнулся на этот API, чтобы изменить изменяемый параметр.void Z3_API Z3_update_param_value (__in Z3_context c, __in Z3_string param_id, __in Z3_string param_value)  Я не знаю, является ли soft_timeout изменчивым или нет? Raj

Ваш Ответ

1   ответ
2

Подумайте о переходе на Z3 4.0. Z3 4.0 имеет новый API, который позволяет пользователю создавать множество решателей в одном и том же Z3_context. Вы можете установить различные таймауты для каждого решателя и обновлять их, когда захотите. Z3 4.0 также поставляется с уровнем C ++, который делает C API намного более удобным в использовании. Вот короткий пример, который устанавливает время ожидания. На моей машине Z3 вернетсяunknown когда используется таймаут в 1 миллисекунду, иsat когдаs.set(p) команда удалена

context c;
expr x = c.real_const("x");
expr y = c.real_const("y");
solver s(c);

s.add(x >= 1);
s.add(y < x + 3);

params p(c);
p.set(":timeout", static_cast<unsigned>(1)); // in milliseconds
s.set(p);

std::cout << s.check() << std::endl;
Привет @ Леонардо, у меня есть связанный вопрос. Предположим, что в приведенном выше примере я добавляю утверждение (x == y) в решатель и хочу проверить с помощью & quot; другому & quot; тайм-аут (скажем, 0,5). Можно ли это сделать, снова вызвав s.set (p)? Я попытался сделать это для своего клиента, и z3 начал давать неправильные ответы. Возможно, установка параметров снова для решателя испортит внутреннюю структуру данных.
Уважаемый Леонардо, спасибо за быстрые ответы! У меня есть еще один вопрос. Я делаю исследование Парето, используя Z3. Мне нужно установить ограничения, как в приведенном выше примере (x & gt; = 2), а затем снова проверить на sat, assert (x & gt; = 3), а затем проверить на sat и многократно, и так далее ... так что я делаю, я нажимаю контекст на стек до утверждения какого-либо ограничения. Когда я закончу с текущим запросом, я извлекаю контекст из стека и нажимаю его снова. Итак, я готов к следующему запросу. Это лучший способ сделать это? Raj
Ограничениеx >= 3 вбираетx >= 2, Таким образом, вам не нужно использоватьpush/pop, Мы используемpush/pop когда мы хотим удалить ограничения. Например, мы можем захотеть сделать это, потому что текущий набор утверждений уже неудовлетворителен.

Похожие вопросы