I am using the Z3 SMT solver to solve a problem that I have expressed in the logic QF_BV, using the SMTLIB 2 language.
The model is unsatisfiable, and I am trying to get the solver to produce an unsat-core.
My model consists of several 'mandatory' constraints, which I specify using assert
statements.
The assertions that I want to be considered for unsat-core generation, have been specified using the (assert (! (EXPR) :named NAME))
construct.
Z3 gives me an unsat
, as expected. However, Z3 always seems to dump a 'trivial' unsat-core consisting of ALL the named assertions.
I know that there exists a subset of my named assertions, which is an unsat-core. I found this core using Yices SMT solver, which frequently gives me relatively smaller unsat-cores. The Yices model is the same as the Z3 model (pretty much a line-by-line translation from SMT2 to the Yices input language).
Is producing "good" unsat-cores a solver-specific feature, or are there any generic suggestions/changes I could make to help Z3 give me a better core?