Z3 Java API定义函数

时间:2015-05-11 15:53:24

标签: java z3 smt

我需要你帮助用Z3 Java API定义一个函数。 我尝试解决这样的问题(使用z3.exe进程可以正常工作):

(declare-fun a () Real)
(declare-fun b () Real)
(declare-fun c () Bool)

(define-fun max2 ((x Real) (y Real)) Real (ite (<= x y) y x))

(assert (and (>= a 0.0) (<= a 100.0)))
(assert (or (= (max2 (+ 100.0 (* (- 1.0) a)) (/ 1.0 1000.0)) 0.0) c (not (= b 0.0))))

(check-sat-using (then simplify bit-blast qfnra))
(get-model)

这个smt文件的结果是:

sat
(model
  (define-fun a () Real
    1.0)
  (define-fun c () Bool
    false)
  (define-fun b () Real
    1.0)
)

现在的问题是:没有选项,用java API定义一个函数。在另一篇文章(Equivalent of define-fun in Z3 API)中,我注意到在java API中使用以下语句:

(declare-fun max2 (Real Real) Real)
(assert (forall ((y Real) (x Real)) (= (max2 y x) (ite (<= x y) y x))))

所以我在我的smt文件中替换了(define-fun max2((x Real)(y Real))Real(ite(&lt; = xy)yx))并启动了z3。 exe进程再次。结果如下:

unknown
(model
  (define-fun b () Real
    0.0)
)

所以,正如你所看到的,再也没有令人满意的结果了。在java中翻译它将获得相同的结果 UNKNOWN

任何想法,我能做什么?

2 个答案:

答案 0 :(得分:2)

没有等效的函数定义,因为它们不是必需的,就像define-fun宏一样。在API中要做的同样的事情是为函数构建一个表达式,然后对函数的每个应用程序,只需用输入值的参数值替换,例如,使用Expr.Substitute。

就像你引用的帖子中提到的Leo一样,为了这个目的,量词的使用是可能的,但求解者通常会放弃并返回unknown,因为它认为公式太难以解决。我们可以通过使用宏查找器来解决这个问题(参见引用文章),它将准确识别这种宏。

答案 1 :(得分:1)

如何声明这样的函数:

private static RealExpr max2(Context ctx, ArithExpr x, ArithExpr y) 
        throws Z3Exception {
    return (RealExpr) ctx.mkITE(ctx.mkLe(x, y), y, x);
}

并且可能像这样使用它:

Context ctx = new Context();

ArithExpr a = (ArithExpr) ctx.mkConst(ctx.mkSymbol("a"), ctx.getRealSort());
ArithExpr b = (ArithExpr) ctx.mkConst(ctx.mkSymbol("b"), ctx.getRealSort());
BoolExpr c = (BoolExpr) ctx.mkConst(ctx.mkSymbol("c"), ctx.getBoolSort());

Goal g = ctx.mkGoal(true, true, false);
g.add(ctx.mkAnd(ctx.mkGe(a, ctx.mkReal(0)), ctx.mkLe(a, ctx.mkReal(100))));
g.add(ctx.mkOr(
    ctx.mkEq(
        max2(ctx, 
            ctx.mkAdd(ctx.mkReal(100), ctx.mkMul(ctx.mkReal(-1), a)), 
            ctx.mkDiv(ctx.mkReal(1), ctx.mkReal(1000))), 
        ctx.mkReal(0)),
    c,
    (ctx.mkNot(ctx.mkEq(b, ctx.mkReal(0))))));