Инкрементальные вызовы Z3 на UFBV с push-вызовами и без них

Я использую Z3 для запросов UFBV. В настоящее время запрос содержит 2 вызова check-sat. Если я поставлю push 1 сразу после check-sat, Z3 решит запрос за 30 секунд. Если я вообще не ставлю push 1, то есть имею два вызова check-sat без push 1 между ними, то Z3 решает это за 200сек. Интересный. Какие-то конкретные причины или просто совпадение?


z3
person Ayrat    schedule 03.02.2012    source источник


Ответы (1)


Z3 3.x имеет «язык спецификации стратегии», основанный на тактике и тактике. Я пока не "рекламирую" это, потому что работа продолжается. Основная идея описана в этом слайде. У нас есть разные встроенные стратегии для каждой логики. Стратегии обычно не поддерживают пошаговое решение, потому что они могут применять преобразования, использующие предположение о «закрытом мире». Например, у нас есть преобразования, которые отображают линейную целочисленную арифметику 0-1 в SAT. Всякий раз, когда Z3 обнаруживает, что пользователь «хочет» инкрементное решение (например, несколько команд check-sat, push и pop), он переключается на решатель общего назначения. В будущих версиях мы предоставим больше возможностей для управления поведением Z3.

Кстати, если у вас есть две последовательные команды (check-sat) (check-sat), Z3 не обязательно входит в инкрементный режим. Он войдет, только если между двумя вызовами есть команда assert или push.

Теперь предположим, что ваш запрос имеет форму: (check-sat) <assertions> (check-sat), а второй запрос имеет форму (check-sat) <assertions> (push) (check-sat). В обоих случаях Z3 будет в инкрементном режиме во втором (check-sat). Однако поведение все равно не то. Инкрементальный решатель «компилирует» утвержденные формулы во внутренний формат, и на его поведение влияет выполнение команды push. Например, он будет использовать более эффективное кодирование двоичных предложений только в том случае, если пользовательская область отсутствует. Под областью пользователя я имею в виду количество push команд - количество pop команд. Это происходит потому, что структура данных, используемая в более эффективном кодировании, не имеет эффективной операции отмены/инверсии.

person Leonardo de Moura    schedule 03.02.2012
comment
Обе версии запроса являются добавочными. Разница в наличии push. Неинкрементный запрос решается за 8 секунд.) Изменяет ли push тактику? Или это связано с другим потоком программы в случае нажатия? (например, дополнительное копирование, которое может изменить порядок ограничений..) - person Ayrat; 03.02.2012
comment
Z3 автоматически предполагает, что он находится в инкрементном режиме, если используется push. - person Leonardo de Moura; 03.02.2012
comment
Да, я понимаю твою мысль, Лео. Но Z3 считает оба запроса инкрементными (поскольку в первом - 2 обращения к check-sat, во втором - 2 обращения к check-sat и еще push. Так.. в чем разница?:) - person Ayrat; 05.02.2012
comment
Я вижу, вы сравниваете (check-sat) ... (check-sat) с (check-sat) ... (push) (check-sat). Я обновлю ответ. - person Leonardo de Moura; 05.02.2012