Я хочу знать, может ли Z3 отображать эквивалентные формулы после исключения квантификатора.
Пример (существует k) (i x k) = 1 и k > 5 эквивалентен
i > 0 и 5 i - 1 ‹ 0.
Здесь квантор k исключен.
Это возможно?
Спасибо, Каустубх.
Я хочу знать, может ли Z3 отображать эквивалентные формулы после исключения квантификатора.
Пример (существует k) (i x k) = 1 и k > 5 эквивалентен
i > 0 и 5 i - 1 ‹ 0.
Здесь квантор k исключен.
Это возможно?
Спасибо, Каустубх.
Да, Z3 может проверить эквивалентность двух формул. Чтобы проверить, эквивалентны ли p
и q
. Мы должны проверить, является ли (not (iff p q))
невыполнимым.
В вашем примере используется нелинейная арифметика i*k
. Модуль исключения квантификаторов в Z3 имеет ограниченную поддержку нелинейной действительной арифметики. Он основан на виртуальной замене терминов, которая не является полной. Однако для вашего примера этого достаточно. Мы должны включить модуль исключения квантификатора в Z3 и нелинейные расширения (т. е. виртуальную подстановку терминов).
Вот как мы можем закодировать ваш пример в Z3: http://rise4fun.com/Z3/rXfi
В общем случае можно получить результат исключения кванторов. Например, введя следующее в rise4fun:
(declare-const i Real)
(assert (exists ((k Real)) (and (= (* i k) 1.0) (> k 5.0))))
(apply qe)
В этом случае используется нелинейная арифметика, и Z3 не устраняет квантификатор.