仅当check-sat返回“sat”时动态调用get-value

时间:2014-06-25 03:04:00

标签: z3 smt cvc4

SMT2标准规定,在调用check-sat之后调用get-value是合法的,并且只有当check-sat返回时才会调用get-value" sat"或"未知"。

以下是一个不满问题的简单示例:

(set-option :produce-models true)
(set-logic QF_BV)
(set-info :smt-lib-version 2.0)
(declare-fun a ()(_ BitVec 4))
(declare-fun b ()(_ BitVec 4))
(declare-fun c ()(_ BitVec 4))
(declare-fun z ()(_ BitVec 4))
(assert (= #b1111 z))
(assert (= a b))
(assert (= (bvxor a z) c))
(assert (= b c))
(check-sat)
(get-value ( a ))
(get-value ( b ))
(get-value ( c ))

由于问题不严重,get-value命令是非法的。取出任何一个断言,它变为sat,get-value命令变得合法。所以我的问题是,你如何编写一个SMT2脚本来检查check-sat的返回值,如果它返回的话只调用get-value?

非法调用get-value对我来说是一个问题,因为我在流中运行不同的smt求解器并检查程序的返回值然后解析它们的输出。如果非法调用get-value,CVC4会将其返回值更改为错误状态。

2 个答案:

答案 0 :(得分:3)

我不认为这是一个好方法,如果你想要的是有一个" SMT"文件来统治整个交易。

这个问题经常出现在与其他语言的SMT解算器交互中。我采用的解决方案是,我使用解算器保持一个开放的管道,并将其提供给脚本的行,阅读响应,并根据我得到的响应决定接下来要发送什么。基本编程的交互。 (例如,这就是Haskell SBV库所做的。)

然而,我确实同意这是一种痛苦;如果有一个SMT2-lib批准处理这种共同互动的方式,那就太好了。

答案 1 :(得分:1)

要从命令行运行CVC4,请添加标志

--dump-models          output models after every SAT/INVALID/UNKNOWN
                       response [*]

这不像get-value那样具体。此选项是非标准的,CVC4当前不支持从SMT2解析器设置此标志。 (如果您希望得到支持,请告诉我们。)