Z3:在z3 api中支持named

时间:2014-04-11 09:07:00

标签: z3

我的问题是我没有看到unsat_core跟踪使用api在整个块中提供的任何断言

f = Z3_parse_smtlib2_string(c, "unsat_core_example1.smt2",0,0,0,0,0,0);
params p(c);
p.set(":unsat-core", true);
s.set(p);
// enabling unsat core tracking
expr r = to_expr(c, f);

unsat_core_example1.smt2:

(declare-fun p () Bool)
(declare-fun q () Bool)
(declare-fun r () Bool)
(declare-fun s () Bool)
(assert (! (or p q) :named a1))
(assert (! (implies r s) :named a2))
(assert (! (implies s (iff q r)) :named a3))
(assert (! (or r p) :named a4))
(assert (! (or r s) :named a5))
(assert (! (not (and r q)) :named a6))
(assert (! (not (and s p)) :named a7))

它似乎是注释:named未被处理,因为返回的unsat_core向量始终为空。

但是,如果我使用z3.exe并输入文件,则情况并非如此。

知道可能是什么原因?

1 个答案:

答案 0 :(得分:2)

Z3_parse_smtlib2_file函数不支持所有SMTLIB2,它实际上只是一个便利函数;它的输出不能保证完全涵盖所有语言(例如,它不执​​行check-sat或某些set-option命令等命令。它也被写为先前SMTLIB1解析器的扩展,该解析器在引入目标/策略/解算器架构之前很久就被编写,因此并非所有信息都被转移到这个新架构。

在这种特殊情况下,断言名称确实保存在上下文中,但Z3_parse_smtlib2_file不返回一组断言和名称;它返回一个未命名的表达式。为了准确地表示SMTLIB2基准,该功能的签名必须显着改变。

在给出的示例中,声明到解算器中的表达式是r,即我们会有类似

的表达式
s.add(r);

这基本上要求解算器断言未命名的断言r,但是r内的表达式不支持“子名称”。我们仍然可以命名r,例如,通过调用

s.add(r, "top")

导致正确的不饱和核心。