有没有办法简化路径条件

时间:2011-11-19 01:47:31

标签: pex z3

例如,在下面的代码中,路径条件将为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.

由于

1 个答案:

答案 0 :(得分:1)

使用Z3 API,您可以通过声明ABA函数)来检查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中提供这些功能。