Используйте Z3, чтобы определить сложность исключения квантора для BV-запросов

В настоящее время я использую Z3 C ++ API для решения запросов по битовым векторам. Некоторые запросы могут содержать квантификатор существования на верхнем уровне.

Часто исключение квантификатора является простым и может быть выполнено Z3 быстро. Однако в тех случаях, когда исключение квантора возвращается к перечислению тысяч возможных решений, я бы хотел прервать эту тактику и обработать запрос самостоятельно каким-либо другим способом.

Я попытался обернуть тактику qe тактикой «попытка», надеясь, что если исключение квантификатора не удастся (скажем, 100 мс), я буду знать, что мне лучше обработать запрос каким-либо другим способом. К сожалению, тактика «попытка» не может отменить исключение квантора (для любого временного ограничения).

В старом сообщении аналогичное вопрос обсуждается, и тактика «smt» обвиняется в том, что она не реагирует. Применимы ли те же рассуждения к тактике «qe»? В том же сообщении указано, что «будущие» версии должны быть более отзывчивыми. Есть ли какой-либо способ или эвристика, чтобы определить, займет ли устранение квантификатора много времени (кроме запуска решателя в отдельном потоке и его отключения по таймауту)?

Я приложил минимальный пример, чтобы вы могли попробовать сами:

z3::context ctx;

z3::expr bv1 = ctx.bv_const("bv1", 10);
z3::expr bv2 = ctx.bv_const("bv2", 10);
z3::goal goal(ctx);
goal.add(z3::exists(bv1, bv1 != bv2));

z3::tactic t = z3::try_for(z3::tactic(ctx,"qe"), 100);    
auto res = t.apply(goal);
std::cout << res << std::endl;

Спасибо!


person bdh    schedule 06.09.2015    source источник


Ответы (1)


Отмена тайм-аута должна периодически проверяться действующей тактикой. В основном мы должны убедиться, что код проверяет отмены и не спускается в длительный цикл без проверки. Вероятно, вы можете определить сегмент кода, который не удается проверить на отмену, запустив свой код в отладчике, прервав его, а затем определив, в каких процедурах он находится. Затем отправьте сообщение об ошибке на GitHub, чтобы проверить флаг отмены в том месте, которое поможет. В целом, тактика исключения кванторов в настоящее время довольно упрощена, когда дело касается битовых векторов, поэтому лучше избегать qe во всех случаях, кроме простых.

person Nikolaj Bjorner    schedule 08.09.2015