Ваша формула, по сути, кодирует проблему «голубиного отверстия».У вас есть sz+1
отверстия (значения 0, 1,…, sz) и sz+2
голуби (ячейки массива (select tpath 0)
,…, (select tpath (+ sz 1))
).Ваш первый квантификатор утверждает, что каждый голубь должен быть помещен в одно из отверстий.Во-вторых, утверждается, что два разных голубя не должны находиться в одной и той же лунке.
Для решения проблемы «лунная дыра» не существует доказательства разрешения по полиномиальному размеру.Таким образом, ожидается экспоненциальный рост времени выполнения.Обратите внимание, что любой SAT-решатель, основанный на разрешении, DPLL или CDCL, будет плохо работать при решении проблемы с голубями.
Вы получаете лучшую производительность при использовании битовых векторов, потому что Z3 сводит их к пропозициональной логике, а анализ случаягораздо более эффективен на этом уровне.
Кстати, вы используете квантификаторы для кодирования параметрических задач.Это элегантное решение, но это не самый эффективный подход для Z3.В целом, для Z3 лучше утверждать, что проблема «расширенного» квантора свободна.Однако для проблемы, описанной в вашем вопросе, это не будет иметь большого значения, поскольку вы все равно будете испытывать экспоненциальный рост.