首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据求解器的决定执行get-model或unsat core

根据求解器的决定执行get-model或unsat core
EN

Stack Overflow用户
提问于 2016-08-26 04:55:31
回答 2查看 925关注 0票数 3

我想知道,在SMT-LIB2.0脚本中是否有可能访问求解器的最后一个可满足性决定(sat,unsat,...)。例如,以下代码:

代码语言:javascript
复制
(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返回中运行:

代码语言:javascript
复制
unsat
(error "line 15 column 10: model is not available")
(PQ QR nPR)

并在MathSAT返回中运行:

代码语言:javascript
复制
unsat
(error "model generation not enabled")

在MathSAT 5中,它只是中断(get-model),甚至不能到达(get-unsat-core)。在SMT-LIB2.0语言中,有没有办法在决策是SAT的情况下获得模型,而在非SAT的情况下决策是UNSAT?例如,解决方案可能如下所示:

代码语言:javascript
复制
(check-sat)
(ite (= (was-sat) true) (get-model) (get-unsat-core))

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

编辑:我也尝试了下面的代码,不幸的是它不能工作。

代码语言:javascript
复制
(ite (= (check-sat) "sat") (get-model) (get-unsat-core))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-26 07:04:04

SMT语言不允许您编写这样的命令。Boogie等工具处理此问题的方法是使用双向文本管道:它从(check-sat.)中读回结果。如果结果字符串为"unsat“,则模型不可用,但如果检查使用are,则核心将可用。如果结果字符串是"sat“,则该工具可以预期(get-model)命令成功。

票数 3
EN

Stack Overflow用户

发布于 2016-09-11 19:13:39

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

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

代码语言:javascript
复制
$ 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的情况下:

代码语言:javascript
复制
$ 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)错误时退出。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39154575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档