I am using Z3 to extract the unsat-core of an unsatisfiable formula. I am using Z3@Rise interface (web based) to write the following code,
(set-logic QF_LIA)
(set-option :produce-unsat-cores true)
(declare-fun ph1 () Int)
(declare-fun ph1p () Int)
(declare-fun ph3 () Int)
(declare-fun ph3p () Int)
(declare-fun ph4 () Int)
(declare-fun ph4p () Int)
(define-fun one () Bool (= ph3p (+ ph1 1)))
(define-fun two () Bool (= ph3 (+ ph1 1)))
(define-fun three () Bool (= ph1p (+ ph1 1)))
(define-fun four () Bool (= ph4p (+ ph1p 1)))
(define-fun five () Bool (>= ph1 0))
(define-fun six () Bool (>= ph4 0))
(define-fun secondpartA () Bool (or (= ph4 0) (<= ph3 ph4) ))
(define-fun secondpartB () Bool (or (= ph3p 0) (<= ph4p ph3p) ))
(assert one)
(assert two)
(assert three)
(assert four)
(assert five)
(assert six)
(assert secondpartA)
(assert secondpartB)
(check-sat)
(get-unsat-core)
check-sat correctly returns 'unsat' but (get-unsat-core) returns empty. Am I missing some configuration/option? Or have I made the example complicated?
You need to add name labels to your assertions so get-unsat-core has labels to use in the unsat core output. Write your assertions like this:
(assert (! one :named a1))
(assert (! two :named a2))
(assert (! three :named a3))
(assert (! four :named a4))
(assert (! five :named a5))
(assert (! six :named a6))
(assert (! secondpartA :named spA))
(assert (! secondpartB :named spB))
and get-unsat-core will print an unsat core.
Documentation for this syntax can be found in the SMTLIB tutorial (PDF file).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With