2012-05-31 1 views
1

Возможно ли изменить значение таймаута решателя во время выполнения с использованием C API? Для того, чтобы установить тайм-аута можно сделать следующее -Z3 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); 

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

+0

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

ответ

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; 
+0

Дорогой Леонардо, спасибо за быстрые ответы! У меня есть еще один вопрос. Я занимаюсь поиском парето с использованием Z3. Мне нужно утверждать ограничения, как в приведенном выше примере (x> = 2), а затем проверить, чтобы sat снова утверждал (x> = 3), а затем проверял сидение и многократно и так далее ... , так что я делаю, я нажимаю контекст в стеке перед утверждением любого ограничения. Когда я закончил с текущим запросом, я вывожу контекст из стека и снова нажимаю его. Поэтому я готов к следующему запросу. Это лучший способ сделать это? – Raj

+1

Ограничение 'x> = 3' принимает' x> = 2'. Таким образом, вам не нужно использовать 'push/pop'. Мы используем 'push/pop', когда хотим удалить ограничения. Например, мы можем сделать это, потому что текущий набор утверждений уже неудовлетворен. –

+0

Привет @ Леонардо, у меня есть связанный с этим вопрос. Предположим, что в приведенном выше примере я добавляю утверждение (x == y) к решателю и хочу проверить с «разным» таймаутом (скажем, 0,5). Можно ли это сделать, снова вызвав s.set (p)? Я попытался сделать это для своего клиента, а z3 начал давать неправильные ответы. Возможно, настройка параметров снова для решателя нарушает внутреннюю структуру данных. – Tushar