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

Z3 仅当check sat返回“时动态调用get value”;sat“;,z3,smt,cvc4,Z3,Smt,Cvc4,SMT2标准规定,只有在调用check sat之后以及check sat返回“sat”或“unknown”时,调用get值才合法 下面是一个简单的unsat问题示例: (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 ()(_

SMT2标准规定,只有在调用check sat之后以及check sat返回“sat”或“unknown”时,调用get值才合法

下面是一个简单的unsat问题示例:

(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 ))
由于问题是unsat,因此get value命令是非法的。去掉任何一个assert,它就变成了sat,getvalue命令就变成了合法的。所以我的问题是,如何编写一个SMT2脚本来检查check-sat的返回值,并且只在它返回sat时调用get-value


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

如果您想要一个“SMT”文件来管理整个事务,我认为没有好方法

这个问题在与其他语言的SMT解决方案交互时经常出现。我采用的解决方案是,我用解算器保持一个打开的管道,并将脚本的行输入它,阅读响应,然后根据得到的响应决定下一步发送什么。本质上是程序化的交互。(例如,Haskell SBV库就是这样做的。)


然而,我同意这是一种痛苦;如果有一种SMT2 lib认可的方式来处理这种常见的交互,那就太好了。

对于从命令行运行的CVC4,添加标志

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

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

这是预期的交互模型,无论好坏。不过,尚不清楚SMT应该添加什么内容。循环显然超出了语言的预期范围,但“check-sat:print-model if-sat”又如何呢?我相信Clark和Cesare会很乐意为添加简单的可用性功能提供建议,如果它们能巧妙地融入到框架中的话。谢谢你,Tim。这解决了我的问题,尽管最初的问题仍然存在。我想每个解算器都有自己的解。需要注意的是,
--dump models
要求还可以从命令行而不是从解析器设置product models选项,即需要
-m--dump models
。这是虫子吗?不管怎样,这对我来说不是问题,但我花了一点时间才弄明白为什么
--转储模型一开始不起作用。另外:
CVC4-h
--dump models
选项没有任何说明。可以考虑添加它吗?不介意,<代码> CVC4- H 确实包含关于“代码> -转储模型< /代码>的信息,我刚刚错过它。每个解决者都有自己的解决方案。对于文本交互,您始终可以实现Levent的建议。这是目前的预期用途模型。