Próbuję zdefiniować teorię zbiorów (połączenie, przecięcie itp.) dla Z3 przy użyciu interfejsu SMTLIB. Niestety moja obecna definicja zawiesza się z3 dla trywialnego zapytania, więc domyślam się, że brakuje mi jednej prostej opcji/flag.Definiowanie teorii zbiorów za pomocą Z3/SMT-LIB2
oto odnośnik: 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)
Wszelkie wskazówkę co do czego mi brakuje?
Ponadto, z tego co wiem, nie ma standardowego kodowania operacji ustawionych na przykład SMT-LIB2 Z3.mk_set_{add,del,empty,...}
(dlatego próbuję uzyskać tę funkcję za pomocą kwantyfikatorów). Czy to prawda? A może jest inna droga?
Dzięki!
Ranjit.
Dzięki Leo! Opcja 1 wygląda świetnie. Czy opcja 2 jest obsługiwana w SMTLIB? (tj. czy map i const w SMTLIB2)? –
Nie, opcja 2 nie jest częścią standardu SMT-LIB :( –
hi leo, dodano link do przykładu pokazującego opcję 2. twoi operatorzy const i map są NAPRAWDĘ niezłe! Dziękuję! –