"unknown" 中的微小变化结果 - 与量词预处理有关?
Minor change results in "unknown" - related to quantifier preprocessing?
下面的 "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)
) 的触发器应该可用。
问题:这种行为是否符合预期 - 如果是,为什么?
已确认为错误,请参阅 Github issue 935。
下面的 "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)
) 的触发器应该可用。
问题:这种行为是否符合预期 - 如果是,为什么?
已确认为错误,请参阅 Github issue 935。