【发布时间】:2015-12-15 07:42:18
【问题描述】:
我观察到 Z3 的量词触发行为(我尝试了 4.4.0 和 4.4.2.3f02beb8203b)存在我无法解释的差异。考虑以下程序:
(set-option :auto_config false)
(set-option :smt.mbqi false)
(declare-datatypes () ((Snap
(Snap.unit)
(Snap.combine (Snap.first Snap) (Snap.second Snap))
)))
(declare-fun fun (Snap Int) Bool)
(declare-fun bar (Int) Int)
(declare-const s1 Snap)
(declare-const s2 Snap)
(assert (forall ((i Int)) (!
(> (bar i) 0)
:pattern ((fun s1 i))
)))
(assert (fun s2 5))
(assert (not (> (bar 5) 0)))
(check-sat) ; unsat
据我了解,unsat 是意料之外的:Z3 不应该能够触发 forall,因为它由模式 (fun s1 i) 保护,并且 Z3 不应该能够(实际上不能)证明s1 = s2。
相比之下,如果我声明 Snap 是一个未解释的排序,那么最终的 check-sat 会产生 unknown - 这是我期望的:
(set-option :auto_config false)
(set-option :smt.mbqi false)
(declare-sort Snap 0)
...
(check-sat) ; unknown
如果我假设 s1 和 s2 不同,即
(assert (not (= s1 s2)))
那么最后的check-sat 在这两种情况下都会产生unknown。
为方便起见,这里是rise4fun 上的the example。
问:行为上的差异是错误还是有意为之?
【问题讨论】:
标签: z3