Поддержка многомерных массивов в QF_AUFBV?

В настоящее время я работаю над кодом, который переводит «путь» через программу C в соответствующий запрос SMT, чтобы проверить возможность этого пути. У меня есть рабочий код, который создает запрос SMT-LIB v1.2 и использует Z3 2.11 и логику QF_AUFBV для решения запроса. В настоящее время я переношу этот код на Z3 4.3, чтобы воспользоваться преимуществами любого повышения скорости, которое могло произойти с тех пор, тем более что мой прежний код, похоже, занимает много времени (около 22 минут) на запрос, который просто присваивает 24 значения для трехмерный массив и проверяет значение определенного места в массиве.

Однако похоже, что логика QF_AUFBV (начиная со стандарта SMT-LIB v2.0) больше не поддерживает многомерные массивы, точнее массивы, значения которых также являются массивами (потенциально более глубокими). Как только я уберу строку "(set-logic QF_AUFBV)" из своего запроса, Z3 4.3 сможет обработать запрос, но это все равно займет много времени.

Мне было интересно, знает ли кто-нибудь, почему поддержка многомерных массивов была остановлена ​​в стандарте SMT-LIB v2.0, и какую альтернативную логику я мог бы использовать. Мне также было интересно, какую логику в любом случае использовал Z3, когда я удалил строку, определяющую теорию QF_AUFBV.

Спасибо!


person Jon Kotker    schedule 18.11.2012    source источник


Ответы (1)


Стандарт SMT-LIB никогда не поддерживал многомерные массивы. Z3 мог их обрабатывать, но они не были частью стандарта. SMT-LIB 1.0 — очень строгий формат, поэтому в Z3 было несколько расширений для удовлетворения потребностей пользователей. С другой стороны, SMT-LIB 2.0 представляет собой очень богатый формат ввода и устраняет основные проблемы, с которыми пользователи сталкивались при работе с SMT-LIB 1.0. В Z3 4.x, когда во входном файле указана логика, Z3 пытается соответствовать стандарту SMT-LIB 2.0. Когда set-logic удален, все специальные расширения Z3 включены.

Как вы описали, массив sort (Array I1 I2 R) может быть закодирован как (Array I1 (Array I2 R)).

Что касается производительности, Z3 3.x и 4.x не имеют улучшений производительности для теории массивов. В них есть много улучшений для битовых векторов, но они недоступны, когда задача смешивает массивы и битовые векторы. Новая теория массивов находится в списке TODO, но никто из команды Z3 в настоящее время над ней не работает.

person Leonardo de Moura    schedule 18.11.2012
comment
О, спасибо, Леонардо. Поддерживает ли стандарт SMT-LIB v2.0 многомерные массивы в теории QF_AUFBV? Это, похоже, не так. Одно потенциальное исправление, о котором я думал, — которое все еще позволило бы мне использовать теорию QF_AUFBV — заключалось в конкатенации индексов. - person Jon Kotker; 15.12.2012
comment
Нет, теория QF_AUFBV не поддерживает многомерные массивы. Конкатенация индексов является решением, но может затруднить решение проблемы. Например, j == w and a[i][j] != a[i][w] невыполнимо, в этой кодировке решатель может доказать это без использования какой-либо комбинации теорий (нужна только теория массивов). Формула j == w and a[concat(i, j)] != a[concat(i, w)] тоже ненасыщена, но решатели для массивов и бит-векторов должны взаимодействовать друг с другом. - person Leonardo de Moura; 15.12.2012
comment
Ладно, спасибо за объяснение! В настоящее время я работаю с массивами битовых векторов, поэтому кажется, что я ограничен теорией QF_AUFBV, но хорошо знать ограничения. - person Jon Kotker; 16.12.2012