Z3Java:简化分布式表达式

Z3Java:简化分布式表达式,java,z3,Java,Z3,我需要用z3定理证明器简化Java中的分布表达式: (simplify (or (and (<= b 0) (<= a 0)) (and (not (<= b 0)) (<= a 0)))) 我错过了什么,我能做什么? 谢谢你的帮助。我找到了解决问题的办法。我所做的是使用策略ctx solver simplify应用我的表达式。这将显示一组最终目标。在Java中,它如下所示: Goal g = this.context.mkGoal(true, false, false

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

(simplify (or (and (<= b 0) (<= a 0)) (and (not (<= b 0)) (<= a 0))))
我错过了什么,我能做什么?
谢谢你的帮助。

我找到了解决问题的办法。我所做的是使用策略
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();

数组
公式\u 0
包含简化的表达式。

只是好奇:这是
(b可能
ctx.mkGt(b,zero)
,即您正在更改!(b 0)会影响简化吗?不,不幸的是,这不会带来任何结果。Expr.simplify(Params)而不是Expr.simplify()方法有什么用.也许这能帮上忙!?但我不知道怎么用。
(or (and (<= b 0) (<= a 0)) (and (not (<= b 0)) (<= a 0)))
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();
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();