У меня вопрос по квантификаторам.
Предположим, что у меня есть массив, и я хочу вычислить индекс массива 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)))))
Теперь я хотел бы понять разницу между двумя из них. Первый метод выполняется быстро и дает простую и удобочитаемую модель. В отличие от второго варианта размер кода намного меньше, но для выполнения программы требуется время. И решение тоже сложное.
Я хотел бы использовать второй метод, так как мой код станет меньше. Однако я хочу найти удобочитаемую простую модель.