Z3:在Z3API中支持命名

Z3:在Z3API中支持命名,z3,Z3,我的问题是,我没有看到unsat_核心跟踪使用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_示例1.smt2: (declare-f

我的问题是,我没有看到unsat_核心跟踪使用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_示例1.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_核心向量总是空的

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


知道原因是什么吗?

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")

这将产生正确的unsat核心

你好,christoph,谢谢你的回复,你知道是否有计划实现这个特性吗?目前没有计划扩展解析器。生成unsat核心的首选方法是通过显式定义布尔常量(例如,请参见此处:),这比使用:命名注释更灵活。