例如,在下面的代码中,路径条件将为x>0 && x+1>0
。但由于x>0
暗示x+1>0
,z3或pex API中是否有任何方法只能获取x>0
,而不是两者都有。
if(x>0)
if(x+1>0)
//get path condition.
由于
答案 0 :(得分:1)
使用Z3 API,您可以通过声明A
和B
(A
函数)来检查not B
是否隐含Z3_assert_cnstr
;并检查结果是否不可满足(Z3_check
功能)。一个简单的想法是在Z3上下文中保持断言路径条件。在断言A
之前,检查上下文是否隐含它。您可以使用以下C代码完成此操作。
Z3_push(ctx); // create a backtracking point
Z3_assert_cnstr(ctx, Z3_mk_not(ctx, A));
Z3_lbool r = Z3_check(ctx);
Z3_pop(ctx); // remove backtracking point and 'not A' from the context
if (r != Z3_L_FALSE)
Z3_assert_cnstr(ctx, A); // assert A only if it is not implied.
Z3 3.2有一些语言可用于指定解决和简化表达式的策略。 在这种语言中,你可以写:
(declare-const x Int)
(assert (> x 0))
(assert (> (+ x 1) 0))
(apply (and-then simplify propagate-bounds))
这个简单的策略会按预期产生(>= x 1)
。它基于更便宜(但不完整)的方法。
另一个问题是此功能仅在交互式shell中可用。
计划是在下一版本的程序化API中提供这些功能。