Короткий ответ для наблюдаемого поведения: Z3 возвращает «неизвестно», потому что ваши утверждения содержат квантификаторы.
Z3 содержит много процедур и эвристик для обработки квантификаторов.
Z3 использует технику, которая называется Insttiation Quantifier на основе модели (MBQI), для построения моделей для удовлетворения запросов, подобных вашему.
Первый шаг состоит в том, что эта процедура состоит в создании возможной интерпретации, основанной на интерпретации, которая удовлетворяет утверждениям без квантификатора.
К сожалению, в текущем Z3 этот шаг не взаимодействует гладко с теорией массива.
Основная проблема заключается в том, что интерпретация, построенная на основе теории массивов, не может быть изменена этим модулем.
Справедливый вопрос: почему это работает, когда мы удаляем команды push / pop?
Это работает, потому что Z3 использует более агрессивные шаги упрощения (предварительной обработки), когда команды инкрементного решения (такие как команды push и pop) не используются.
Я вижу два возможных решения вашей проблемы.
Вы можете избежать квантификаторов и продолжать использовать теорию массивов. Это возможно в вашем примере, так как вы знаете длину всех «строк». Таким образом, вы можете расширить квантификатор.
Хотя этот подход может показаться неудобным, он используется на практике и во многих инструментах проверки и тестирования.
Вы можете избежать теории массивов. Вы объявляете строку как неинтерпретируемую сортировку, как вы сделали для Char. Затем вы объявляете функцию char-of, которая должна возвращать i-й символ строки.
Вы можете аксиоматизировать эту операцию. Например, вы можете сказать, что две строки равны, если они имеют одинаковую длину и содержат одинаковые символы:
(assert (forall ((s1 String) (s2 String))
(=> (and
(= (length s1) (length s2))
(forall ((i Int))
(=> (and (<= 0 i) (< i (length s1)))
(= (char-of s1 i) (char-of s2 i)))))
(= s1 s2))))
Следующая ссылка содержит ваш скрипт, закодированный с использованием второго подхода:
http://rise4fun.com/Z3/yD3
Второй подход более привлекателен и позволит вам доказать более сложные свойства строк.
Тем не менее, очень легко написать выполнимые количественные формулы, что Z3 не сможет построить модель.
Z3 Guide описывает основные возможности и ограничения модуля MBQI.
Он может содержать разрешимые фрагменты, которые могут обрабатываться Z3.
Кстати, обратите внимание, что теория отбрасывания массива не будет большой проблемой, если у вас есть квантификаторы. В руководстве показано, как кодировать массивы с помощью квантификаторов и функций.
Подробнее о том, как работает MBQI, можно узнать из следующих статей: