为什么z3中的以下表达式需要很长时间?

时间:2019-02-28 11:32:32

标签: z3

此z3表达式有什么问题?

(declare-const arg_1 Int)
(assert
  (and
     (not (= 0 (mod arg_1 10)))
     (= 0 (mod (+ 1 arg_1) 10))))
(check-sat)
(get-model)

尝试用z3进行评估永远挂起。另一方面,如果我尝试以下任一方法,它将立即返回。

  

仅使用第一个表达式

(declare-const arg_1 Int)
(assert (not (= 0 (mod arg_1 10))))
(check-sat)
(get-model)

=> sat
(model 
  (define-fun arg_1 () Int
 1)
)
  

仅使用第二个表达式

(declare-const arg_1 Int)
(assert (= 0 (mod (+ 1 arg_1) 10)))
(check-sat)
(get-model)

=> sat
(model
  (define-fun arg_1 () Int
    9)
)

将它们一起置入同一文件也将立即返回。

(declare-const arg_1 Int)
(declare-const arg_2 Int)
(assert (= 0 (mod (+ 1 arg_1) 10)))
(assert (not (= 0 (mod arg_2 10))))

;(assert (= arg_1 arg_2))
(check-sat)
(get-model)

=> sat
(model 
  (define-fun arg_2 () Int
    1)
  (define-fun arg_1 () Int
    9)
)

但是,如果我取消注释arg_1 = arg_2断言,它将挂起。

1 个答案:

答案 0 :(得分:1)

这很可能是z3错误。如果使用z3 -v:3运行原始文件,则会得到:

$ z3 -v:3 a.smt2
(smt.searching)
(smt.simplifying-clause-set :num-deleted-clauses 1)
final-check OPTIMAL
final-check OPTIMAL
...

并继续打印。我尝试使用cvc4,yices和mathsat;他们都立即解决了。您应该在https://github.com/Z3Prover/z3/issues进行举报,以便他们进行查看。