微小的变化导致"未知" - 与量词预处理有关吗?

时间:2016-10-03 15:29:29

标签: z3

以下" 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))的触发器应该可用。

问题:预计会出现这种情况 - 如果是,为什么?

1 个答案:

答案 0 :(得分:0)

确认为错误,请参阅Github issue 935