我需要使用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();
我错过了什么,我该怎么办? 谢谢你的帮助。
答案 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
包含简化表达式。