(get-unsat-core) returns null in Z3

I use Z3 to extract unsaturated core unsatisfactory formula. I am using the Z3 @Rise interface (Internet 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. Is any configuration / option missing? Or did I make this example complicated?

+7
core smt z3 sat-solvers
source share
1 answer

You need to add name labels to your statements, so get-unsat-core has labels for use in unsat core output. Write your statements as follows:

 (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 the unsaturated core.

Documentation of this syntax can be found in the SMTLIB tutorial (PDF file).

+9
source share

All Articles