使用Z3_solver_get_unsat_core获取未统计核心

使用Z3_solver_get_unsat_core获取未统计核心,z3,Z3,假设这里有一组关于非线性实数算术的约束,比如 pred1 = (> (- (* (- v2_x v0_x) (- v1_y v0_y)) (* (- v2_y v0_y) (- v1_x v0_x))) 0) pred2 = (> (- (* (- v1_x v0_x) (- v2_y v0_y)) (* (- v1_y v0_y) (- v2_x v0_x))) 0) 事实上,如果我们这样做 Z3_solver_assert(ctx,solver,pred1); Z3_solv

假设这里有一组关于非线性实数算术的约束,比如

pred1 = (> (- (* (- v2_x v0_x) (- v1_y v0_y)) (* (- v2_y v0_y) (- v1_x v0_x))) 0)
pred2 = (> (- (* (- v1_x v0_x) (- v2_y v0_y)) (* (- v1_y v0_y) (- v2_x v0_x))) 0)
事实上,如果我们这样做

Z3_solver_assert(ctx,solver,pred1);
Z3_solver_assert(ctx、solver、pred2);
b=Z3解算器检查(ctx,解算器);
b
将被取消。我想获得unsat核心(因为这个例子很简单)。因此,我为每个谓词定义了一个谓词变量。假设它们是
p1
p2

Z3_ast p1=mk_bool_var(ctx,“p1”);
假设[i]=Z3_mk____________________________________________;
Z3_ast g[2]={pred1,p1};
Z3_solver_assert(ctx,solver,Z3_mk_或(ctx,2,g));
Z3_ast p2=mk_bool_var(ctx,“p2”);
假设[i]=Z3_mk__________________________________;
Z3_ast g[2]={pred2,p2};
Z3_solver_assert(ctx,solver,Z3_mk_或(ctx,2,g));
然后我调用
Z3\u solver\u check\u假设(ctx,solver,2,假设)

但这会返回
Z3_L_unde
,原因是
(不完整(理论算术))

我想知道我在哪里犯了错误,以及如何解决这个问题

下面是如何初始化的:

ctx=Z3_mk_上下文(cfg);
Z3_符号逻辑_符号=Z3_mk_字符串_符号(ctx,“QF_UFNRA”);
解算器=Z3_mk_解算器_,用于逻辑((Z3_上下文)ctx,逻辑符号);
Z3解算器公司(ctx,解算器);
Z3_参数=Z3_mk_参数(ctx);
Z3_symbol参数symbol=Z3_mk_字符串_symbol(ctx,“未安装的核心”);
Z3参数集布尔(ctx,参数,参数符号,Z3参数为真);
Z3解算器集参数(ctx,解算器,参数);

谢谢,

Z3包含许多解算器。对于非线性算术问题,它使用
nlsat
。该解算器的实现位于目录
src/nlsat
中,并对算法进行了说明。但是,当前的nlsat实施不支持unsat核心提取或证据生成。当用户请求unsat核心提取时,Z3切换到通用解算器,该解算器对于非线性算法来说是不完整的。也就是说,对于非线性算术问题,它可能返回
unknown
。通用解算器支持许多理论、量词、unsat核心提取和证明生成。它对于线性算法来说是完整的,但正如我所说的,对于非线性片段来说是不完整的。在计划中,Z3将有一个新版本的
nlsat
,它与其他理论相结合,并支持unsat核心提取,但这是未来的工作