z3smtmathsat

Executing get-model or unsat-core depending on solver's decision


I wonder, if there is a possibility in a SMT-LIB 2.0 script to access the last satisfiability decision of a solver (sat, unsat, ...). For example, the following code:

(set-option :produce-unsat-cores true)
(set-option :produce-models true)
(set-logic QF_UF)
(declare-fun p () Bool)
(declare-fun q () Bool)
(declare-fun r () Bool)

(assert (! (=> p q) :named PQ))
(assert (! (=> q r) :named QR))
(assert (! (not (=> p r)) :named nPR))

(check-sat)
(get-model)
(get-unsat-core)

ran in Z3 returns:

unsat
(error "line 15 column 10: model is not available")
(PQ QR nPR)

and ran in MathSAT returns:

unsat
(error "model generation not enabled")

In MathSAT 5 it just breaks on (get-model) and doesn't even reach (get-unsat-core). Is there any way in SMT-LIB 2.0 language to get-model iff the decision was SAT and unsat-core iff the decision was UNSAT? Solution could for example look like this:

(check-sat)
(ite (= (was-sat) true) (get-model) (get-unsat-core))

I searched SMT-LIB 2.0 language documentation, but I did not found any hint.

EDIT: I also tried the code below, and unfortunately it did not work.

(ite (= (check-sat) "sat") (get-model) (get-unsat-core))

Solution

  • The SMT language does not let you write commands like this. The way that tools, such as Boogie, deal with this is to use a two-way text pipe: It reads back the result from (check-sat). If the resulting string is "unsat" models are not available, but cores would be if the check uses asssumptions. If the resulting string is "sat" the tool can expect that a (get-model) command succeeds.