根据求解器的决定执行get-model或不满核心

时间:2016-08-25 20:55:31

标签: z3 smt

我想知道,如果SMT-LIB 2.0脚本中有可能访问求解器的最后可满足性决策(sat,不满,......)。例如,以下代码:

(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)

在Z3中运行返回:

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

并在MathSAT中运行返回:

unsat
(error "model generation not enabled")

在MathSAT 5中,它只是打破了(获取模型)并且甚至达不到(get-unsat-core)。 SMT-LIB 2.0语言是否有任何方法可以获得模型,如果决定是SAT而且不满核心,如果决定是UNSAT的话?例如,解决方案可能如下所示:

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

我搜索了SMT-LIB 2.0语言文档,但我没有找到任何提示。

编辑: 我也试过下面的代码,不幸的是它没有用。

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

2 个答案:

答案 0 :(得分:3)

SMT语言不允许您编写这样的命令。 像Boogie这样的工具处理这个问题的方法就是使用它 双向文本管道:它从(check-sat)读回结果。 如果结果字符串是"不满"模型不可用,但是 核心将是检查使用假设。如果结果 字符串是" sat"该工具可以期待一个(get-model)命令 成功。

答案 1 :(得分:3)

正如Nikolaj在他的回答中所说,正确的方法是解析求解器输出并有条件地生成(get-model)(get-unsat-core)语句。

但是,使用mathsat,您可以使用不带(get-model)语句的代码,并使用mathsat选项调用-model。例如:

$ cat demo_sat.smt2 
(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-unsat-core)

$ mathsat -model demo_sat.smt2 
sat
( (p false)
  (q false)
  (r false) )
(error "no unsatisfiability proof, impossible to compute unsat core")

在不满的情况下:

$ cat demo_unsat.smt2 
(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-unsat-core)

$ mathsat -model demo_unsat.smt2 
unsat
( PQ
  QR
  nPR )

不幸的是,似乎没有像-model这样的选项来生成不满核心。因此,如果你想将它与增量问题一起使用,那么这个hack将无法工作,除非你在第一个sat结果之后终止解算器。 (因为在第一个sat结果处,解算器将退出(get-unsat-core)的错误。)