Я пытаюсь определить теорию множеств (объединение, пересечение и т.д.), для Z3 с использованием интерфейса SMTLIB. К сожалению, мой текущий определение зависает z3 для тривиального запроса, поэтому, я думаю, я не хватает некоторые простые опции/флаги.
здесь постоянная ссылка: http://rise4fun.com/Z3/JomY
(declare-sort Set) (declare-fun emp () Set) (declare-fun add (Set Int) Set) (declare-fun cup (Set Set) Set) (declare-fun cap (Set Set) Set) (declare-fun dif (Set Set) Set) (declare-fun sub (Set Set) Bool) (declare-fun mem (Int Set) Bool) (assert (forall ((x Int)) (not (mem x emp)))) (assert (forall ((x Int) (s1 Set) (s2 Set)) (= (mem x (cup s1 s2)) (or (mem x s1) (mem x s2))))) (assert (forall ((x Int) (s1 Set) (s2 Set)) (= (mem x (cap s1 s2)) (and (mem x s1) (mem x s2))))) (assert (forall ((x Int) (s1 Set) (s2 Set)) (= (mem x (dif s1 s2)) (and (mem x s1) (not (mem x s2)))))) (assert (forall ((x Int) (s Set) (y Int)) (= (mem x (add s y)) (or (mem x s) (= x y))))) (declare-fun z3v8 () Bool) (assert (not z3v8)) (check-sat)
Какой-нибудь намек на то, что мне не хватает?
Кроме того, из того, что я могу сказать, нет стандартного SMT-LIB2
кодирование заданных операций, например. Z3.mk_set_{add,del,empty,...}
(вот почему я пытаюсь получить эту функциональность с помощью кванторов).
Это верно? Или есть другой маршрут?
Спасибо!
Ранджит.