2015-02-19 6 views
2

Прочитав strategies guide от Z3 и this answer от Leo, я ожидал, что (check-sat) и (check-sat-using smt) эквивалентны. Однако при запуске Z3 4.3.2 три раза по сравнению с нашим набором тестов (230 файлов SMTLIB2) потребовалось 198 с/192 с/195 секунд с (check-sat), но 275s/283s/270s с (check-sat-using smt). Я также пробовал ночной сборщик Z3 4.4.0 d3fb5f2a4cda, и разница была аналогичной.(check-sat) vs (check-sat-using smt)

Почему это может быть?

немного больше информации, которая может иметь отношение:

  • Windows 7 x64, Z3 x64
  • Все наши тесты выполнены с auto_config false и smt.mbqi false
  • Все использование кванторов и интерпретируемые функции
  • Некоторые использование (нелинейная) int и/или действительная арифметика
  • Все интенсивно используют блоки push-pop

Edit: То, что я в конечном счете, хотел бы сделать, это установить тайм-аут для некоторыхcheck-sat звонков, но не для всех. AFAIK, это невозможно с check-sat, но check-sat-using (using-params smt :soft_timeout $timeout) должен работать. Это правильно?

+0

Похоже, что http://stackoverflow.com/questions/23973453/ были потенциально связаны –

+0

FYI в текущей ведущей ветви Z3, можно получить эффект, который вы ищете, используя '(check-sat-using по умолчанию) '. См. [Этот вопрос] (https://stackoverflow.com/questions/37443308/check-sat-using-default-or-similar). –

ответ

2

Предполагаю, что вы используете Z3 в файле SMT2?

В Z3 имеются средства для определения логики эталонного теста, если ни один не указан (см., Например, default_tactic.cpp). Тактика smt - это откат, когда другая тактика не применяется. Когда Z3 запускается с -v: 10, он покажет, какая (суб) -тактика запускается.

В недавнем прошлом у нас также возникли проблемы с параметрами конфигурации, которые не передавались ядру smt. Мы исправили их, но, конечно, возможно, что где-то есть ошибка.

+0

Так может быть, что '(check-sat)' выбирает более специализированный (и эффективный) решатель, чем 'smt', и, следовательно, разница во времени выполнения? Также см. Мои измененные вопросы. –

+0

Да, это может быть, это зависит от того, что используется в тестах. Вы пытались (сбросить) (set-option: timeout или: soft_timeout ...) [stuff] (check-sat)? –

+0

Ницца! По какой-то причине я думал, что вы не можете изменять параметры после первого утверждения, но установка ': timeout' перед каждыми« check-sat », кажется, работает просто отлично (': soft_timeout' был отклонен, потому что этот параметр, по-видимому, был переименован в ' : timeout'). Использование 'reset' также, вероятно, не так просто, потому что оно также сбрасывает объявления символов (и я использую': global-decls', чтобы объявления символов выходили из всплывающих окон), и, похоже, он перезагружает стек push-pop. –