java 中的 z3 使用问题和奇怪的错误

z3 usage problem in java and strange error

我正在使用 Z3 进行约束检查,我目前正在使用 java Z3 包。

我正在做的是,这是我的 java 代码:

    Context context = new Context();
    Solver s=context.mkSolver();
    IntExpr i=context.mkIntConst("i");
    IntExpr zero=context.mkInt(1);//int i;
    BoolExpr initial=context.mkEq(i,zero);//i=0;
    IntExpr one=context.mkInt(1); //initial 1
    ArithExpr ipp=context.mkAdd(i,one);//i+1
    BoolExpr ippResult=context.mkEq(i,ipp);//i=i+1
    BoolExpr gtI=context.mkGe(i,zero);


    s.add(initial);
    s.add(ippResult);
    s.add(gtI);

    System.out.println(s+"\n\n");
 
    System.out.println(s.check());

这是我的输出

  (declare-fun i () Int)
  (assert (= i 1))
  (assert (= i (+ i 1)))
  (assert (>= i 1))

   UNSATISFIABLE

所以我不知道为什么 z3 returns 它是不可满足的?因为实际上i+1>=1,所以很奇怪。我不知道我写错了什么代码。谢谢!

您的程序未完成;你使用 gtI 但你从未定义它。可能 cut-and-paste 错误。

无论如何,输出的 SMTLib 部分很好地捕获了您的问题:

 (declare-fun i () Int)
 (assert (= i 1))
 (assert (= i (+ i 1)))
 (assert (>= i 1))

第二行说i1。第三行表示 i 等于 i+1。结合这两者,求解器推断出一定是 1 = 2 的情况。这显然不是真的,因此你得到 UNSATISFIABLE 结果。

我怀疑您想创建一个新变量并在创建 i+1 时使用它,或许 j?但是很难在不知道你想要达到什么目标的情况下发表意见。