假设这是非线性实数算术的约束集,如
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_solver_check(ctx, solver);
b
不会。我想获得不饱和核心(这个例子很简单)。因此,对于每个谓词,我定义了一个谓词变量。可以说它们是p1
和p2
。
Z3_ast p1 = mk_bool_var(ctx, "P1");
assumptions[i] = Z3_mk_not(ctx, p1);
Z3_ast g[2] = { pred1, p1 };
Z3_solver_assert(ctx,solver,Z3_mk_or(ctx, 2, g));
Z3_ast p2 = mk_bool_var(ctx, "P2");
assumptions[i] = Z3_mk_not(ctx, p2);
Z3_ast g[2] = { pred2, p2 };
Z3_solver_assert(ctx,solver,Z3_mk_or(ctx, 2, g));
然后我拨打Z3_solver_check_assumptions(ctx, solver, 2 , assumptions);
但这会返回Z3_L_UNDEF
,原因是(incomplete (theory arithmetic))
我想知道我在哪里犯了错误以及如何解决这个问题。
以下是事情的初始化方式:
ctx = Z3_mk_context(cfg);
Z3_symbol logic_symbol = Z3_mk_string_symbol(ctx, "QF_UFNRA");
solver = Z3_mk_solver_for_logic((Z3_context)ctx, logic_symbol);
Z3_solver_inc_ref(ctx, solver);
Z3_params params = Z3_mk_params(ctx);
Z3_symbol param_symbol = Z3_mk_string_symbol(ctx, "unsat_core");
Z3_params_set_bool(ctx , params, param_symbol, Z3_L_TRUE);
Z3_solver_set_params(ctx, solver, params);
谢谢,
答案 0 :(得分:2)
Z3包含许多解算器。对于非线性算术问题,它使用nlsat
。此解算器的实现位于目录src/nlsat
中,并解释算法here。但是,当前nlsat
实现不支持不满核心提取和证据生成。当用户请求不满核心提取时,Z3切换到非线性算法不完整的通用求解器。也就是说,对于非线性算术问题,它可能会返回unknown
。通用求解器支持许多理论,量词,不满核心提取和证明生成。对于线性算法来说已经完成了,但正如我所说的那样,非线性片段并不完整。在计划中,Z3将有一个新版本的nlsat
与其他理论相结合,并支持不满核心提取,但这是未来的工作。