(Под) оптимальный способ получить достоверную информацию о диапазоне при использовании ограничения SMT с Z3

Этот вопрос связан с моим предыдущим вопросом

Возможно ли получить достоверную информацию о диапазоне при использовании ограничения SMT с Z3?

Таким образом, кажется, что «эффективное» нахождение информации о максимальном диапазоне нецелесообразно, учитывая типичные 32-битные векторы и так далее. Но с другой стороны, я думаю, возможно ли найти определенную информацию о "суб-максимальном" диапазоне, которая, надеюсь, станет более эффективной. Другое дело, что мы можем захотеть иметь определенную "безопасную" гарантию, скажем, для всех элементов в субмаксимальном диапазоне они должны удовлетворять ограничению, но могут существовать и другие решения, которые удовлетворяли бы ограничение тоже.

В настоящее время я изучаю, может ли техника model counting иметь смысл в этой настройке. Любые мысли будут очень признательны. Спасибо.


person lllllllllllll    schedule 11.12.2018    source источник
comment
Если битовый вектор беззнаковый, извлечь первые k наиболее значимых битов и применить тот же метод среза диапазона, который я предложил в предыдущем вопросе, тривиально. Уровень детализации фиксирован, поэтому он может переоценить фактические границы интервала и даже рассматривать два несмежных интервала как один больший. Похоже, вас больше интересует безопасная аппроксимация, в этом случае это может сработать, перевернув свойство. На самом деле параллельная попытка обоих способов может дать наилучшую информацию об интервале поиска. Какова ваша идея подсчета моделей, не могли бы вы подробнее остановиться?   -  person Patrick Trentin    schedule 12.12.2018


Ответы (1)


Общий случай

Это не только вопрос эффективности. Рассмотрим задачу, в которой есть две переменные a и b и одно ограничение:

a != b

Какой диапазон b? (максимум или иначе?)

Можно сказать, что все ценности законны. Но это было бы неправильно, поскольку, очевидно, выбор a влияет на выбор b. Чем больше у вас переменных, тем сложнее станет проблема. Я не думаю, что в этом случае проблема даже четко определена, поэтому поиск решения (эффективного или нет) не имеет особого смысла.

Допущение одной переменной

Сказав это, я думаю, вы можете найти решение, если предположите, что в системе есть ровно одна переменная. (Или, в качестве альтернативы, если вы исправите все другие переменные до некоторых предопределенных констант.) Если вы хотите пойти по этому пути, вы можете реализовать алгоритм двоичного поиска, чтобы найти диапазон разумного размера, просто доказав количественную формулу

Exists([b], And(b >= minBound, b <= maxBound, Not(constraints)))

Как только вы получите unsat для этого, у вас будет свой диапазон. Пока вы получаете sat, вы можете настроить _9 _ / _ 10_ для поиска в меньших диапазонах. В худшем случае это может превратиться в линейную прогулку, но вы можете «сократить» этот поиск, убедившись, что вы уменьшаете значительный размер на каждом шаге. Это может быть параметром для всего поиска, в зависимости от того, насколько большими вы хотите, чтобы ваши интервалы были. Придется выбирать между попыткой найти максимальный диапазон и тем, сколько времени вы хотите провести в этом поиске. Конечно, если вы сократите слишком много, вы можете пропустить большой интервал, но это цена эффективности.

Пример1 (Хороший случай) Есть единственное ограничение, в котором указано b != 5. Тогда ваш поиск будет быстрым и в зависимости от того, в какую ветку вы пойдете, вы найдете либо [0, 4], либо [6, 255], предполагающие 8-битные слова.

Пример2 (Плохой случай) Есть единственное ограничение, в котором указано b is even. Тогда ваш поиск будет демонстрировать наихудшее поведение, и если ваш "сокращенный" размер равен 1, вы, возможно, повторите 255 раз, прежде чем остановитесь на [0, 0]; предполагая, что z3 дает вам максимальное нечетное число в каждом вызове.

Я надеюсь, что это иллюстрирует суть дела. В целом, однако, я предполагаю, что вы будете ближе к «хорошему случаю» для практических приложений, и даже если ваш сокращенный размер минимален, вы, скорее всего, сможете сойтись за несколько итераций. Конечно, это полностью зависит от вашей проблемной области, но я ожидаю, что это применимо к анализу программного обеспечения в целом.

person alias    schedule 12.12.2018