У меня вопрос о квантификаторах.Quantifier Vs Non-Quantifier
Предположим, что у меня есть массив, и я хочу, чтобы вычислить индекс массива 0, 1 и 2 для этого массива -
(declare-const cpuA (Array Int Int))
(assert (or (= (select cpuA 0) 0) (= (select cpuA 0) 1)))
(assert (or (= (select cpuA 1) 0) (= (select cpuA 1) 1)))
(assert (or (= (select cpuA 2) 0) (= (select cpuA 2) 1)))
Или иначе я могу указать тот же используя FORALL построить, как -
(assert (forall ((x Int)) (=> (and (>= x 0) (<= x 2)) (or (= (select cpuA x) 0) (= (select cpuA x) 1)))))
Теперь я хотел бы понять разницу между двумя из них. Первый метод выполняется быстро и дает простую и читаемую модель. Напротив, размер кода со второй опцией очень мал, но для выполнения программы требуется время. А также решение является сложным.
Я бы хотел использовать второй метод, так как мой код станет меньше. Тем не менее, я хочу найти читаемую простую модель.
Уважаемый Леонардо, я снова возвращаюсь к тому же вопросу. Я пытаюсь оптимизировать код для спутникового решателя. Не могли бы вы рассказать мне, когда полезно использовать константы, и когда хорошо использовать неинтерпретируемые функции. Например, в моем коде есть около 30-40 неинтерпретируемых функций. Когда я заменяю некоторые функции на несколько констант, например (xA 0), заменяемых на xA0 и т. Д., Я получаю сокращение во время выполнения, но для других я не получаю. Каково ключевое правило выбирать между ними? Это зависит от того, насколько вы используете их в коде? – Raj
Флуктуации - это очень распространенные результаты. Мы наблюдаем флуктуации даже при небольших модификациях, таких как переупорядочение утверждений. Любая незначительная модификация может изменить порядок Z3, пересекающий пространство поиска. Как правило, мы должны избегать квантификаторов, когда это возможно. Если мы можем кодировать проблему, используя единую теорию, мы обычно получаем лучшую производительность. Конечно, у нас всегда есть исключения. Какое колебание производительности вы наблюдаете? Он имеет порядок 2x, 10x, 100x? –