Given the following input
(set-option :auto_config false)
(set-option :smt.mbqi false)
(declare-fun len (Int) Int)
(declare-fun idx (Int Int) Int)
(declare-const x Int)
(define-fun FOO () Bool
(forall ((i Int)) (!
(implies
(and (<= 0 i) (< i (len x)))
(exists ((j Int)) (!
(implies
(and (<= 0 j) (< j (len x)))
(> (idx x j) 0))))))))
(assert FOO)
; (push)
(assert (not FOO))
(check-sat)
; (pop)
; (push)
(assert (not FOO))
(check-sat)
; (pop)
Z3 4.3.2 x64 reports unsat
for the first check-sat
(as expected), but unknown
for the second. If the commented push
/pop
s are uncommented, both check-sat
s yield unknown
.
My guess is that this is either a bug, or a consequence of Z3 switching to incremental mode when it reaches the second check-sat
. The latter could also explain why both check-sat
s yield unknown
if push
/pop
is used because Z3 will (as far as I understand) switch to incremental mode on first push
.
Question: Is it a bug or an expected consequence?