Z3 Java:简化分布式表达式

时间:2015-06-08 11:59:43

标签: java z3

我需要使用z3定理证明器简化Java中的分布式表达式:

(simplify (or (and (<= b 0) (<= a 0)) (and (not (<= b 0)) (<= a 0))))

通常z3证明者应该返回以下表达式:

(<= a 0)

但我得到的是同样的表达:

(or (and (<= b 0) (<= a 0)) (and (not (<= b 0)) (<= a 0)))

这是java代码:

Context ctx = new Context(configuration);

ArithExpr a = (ArithExpr) ctx.mkConst(ctx.mkSymbol("a"), ctx.getIntSort());
ArithExpr b = (ArithExpr) ctx.mkConst(ctx.mkSymbol("b"), ctx.getIntSort());
IntNum zero = this.context.mkInt(0);

Expr expr = ctx.mkOr(
    ctx.mkAnd(ctx.mkLe(a, zero), ctx.mkLe(b, zero)),
    ctx.mkAnd(ctx.mkLe(a, zero), ctx.mkGt(b, zero)));

expr = expr.simplify();

我错过了什么,我该怎么办? 谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

我找到了解决问题的解决方案。我所做的是用我的表达法ctx-solver-simplify来表达。这将显示一组结果目标。在Java中它看起来像这样:

Goal g = this.context.mkGoal(true, false, false);
g.add((BoolExpr) expr);

ApplyResult ar = this.context.mkTactic("ctx-solver-simplify").apply(g);
Goal[] subgoals = ar.getSubgoals();
BoolExpr[] formulas_0 = subgoals[0].getFormulas();

数组formulas_0包含简化表达式。