以下" minimal"程序,从一个更大的程序中提取,预计会产生 unsat
(并且确实如此)。但是,取消注释量词AX-1
中的其他合并会将结果更改为unknown
(在Windows 10上的Z3 4.5.0 x64中)。
(set-option :auto_config false)
(set-option :smt.mbqi false)
(declare-fun foo (Int) Bool)
(declare-const k Real)
(assert (forall ((i Int)) (!
(and
(< 0.0 k)
; (implies (<= 0 i) (< 0.0 k)) ;;; ---- uncomment this line ----
)
:pattern ((foo i))
:qid |AX-1|)))
(assert (forall ((i Int)) (!
(foo i)
:pattern ((foo i))
:qid |AX-2|)))
(declare-const j Int)
(assert (< j 0))
; (push) ;;; doesn't make a difference
(assert (not
(ite
(foo j)
(< 0.0 k)
false)))
; (set-option :smt.qi.profile true)
(check-sat)
; (get-info :all-statistics)
; (pop)
量词实例化统计信息显示AX-2
在两种情况下都被实例化,但AX-1
仅在附加的联合体不时被实例化。我的假设是,在后一种情况下,Z3消除了量词,因为量化变量不会在体内发生。
然而,我发现令人惊讶的是,带有附加组合的版本 - 其中Z3可能没有消除量词 - 产生unknown
,因为量词((foo j)
)的触发器应该可用。
问题:预计会出现这种情况 - 如果是,为什么?