我想知道,在SMT-LIB2.0脚本中是否有可能访问求解器的最后一个可满足性决定(sat,unsat,...)。例如,以下代码:
(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-model),甚至不能到达(get-unsat-core)。在SMT-LIB2.0语言中,有没有办法在决策是SAT的情况下获得模型,而在非SAT的情况下决策是UNSAT?例如,解决方案可能如下所示:
(check-sat)
(ite (= (was-sat) true) (get-model) (get-unsat-core))我搜索了SMT-LIB2.0语言文档,但没有找到任何提示。
编辑:我也尝试了下面的代码,不幸的是它不能工作。
(ite (= (check-sat) "sat") (get-model) (get-unsat-core))发布于 2016-08-26 07:04:04
SMT语言不允许您编写这样的命令。Boogie等工具处理此问题的方法是使用双向文本管道:它从(check-sat.)中读回结果。如果结果字符串为"unsat“,则模型不可用,但如果检查使用are,则核心将可用。如果结果字符串是"sat“,则该工具可以预期(get-model)命令成功。
发布于 2016-09-11 19:13:39
正如Nikolaj在他的回答中所说,正确的方法是解析求解器输出,并有条件地生成(get-model)或(get-unsat-core)语句。
但是,对于mathsat语言,您可以使用不带(get-model)语句的代码,并使用-model选项调用mathsat。例如:
$ 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")在unsat的情况下:
$ 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这样的选项来生成非not内核。因此,如果你想使用它来解决增量问题,那么这个方法就不会起作用,除非你对求解器在第一个sat结果后终止没有意见。(因为在第一个sat结果中,解算器将在出现(get-unsat-core)错误时退出。)
https://stackoverflow.com/questions/39154575
复制相似问题