考虑以下SMT-LIB代码:
(set-option :auto_config false)
(set-option :smt.mbqi false)
; (set-option :smt.case_split 3)
(set-option :smt.qi.profile true)
(declare-const x Int)
(declare-fun trigF (Int Int Int) Bool)
(declare-fun trigF$ (Int Int Int) Bool)
(declare-fun trigG (Int) Bool)
(declare-fun trigG$ (Int) Bool)
; Essentially noise
(declare-const y Int)
(assert (!
(not (= x y))
:named foo
))
; Essentially noise
(assert (forall ((x Int) (y Int) (z Int)) (!
(= (trigF$ x y z) (trigF x y z))
:pattern ((trigF x y z))
:qid |limited-F|
)))
; Essentially noise
(assert (forall ((x Int)) (!
(= (trigG$ x) (trigG x))
:pattern ((trigG x))
:qid |limited-G|
)))
; This assumption is relevant
(assert (forall ((a Int) (b Int) (c Int)) (!
(and
(trigG a)
(trigF a b c))
:pattern ((trigF a b c))
:qid |bar|
)))
试图断言公理bar
成立,即
(push)
(assert (not (forall ((a Int) (b Int) (c Int))
(and
(trigG a)
(trigF a b c)))))
(check-sat)
(pop)
失败(Z3 4.3.2 - 构建哈希码47ac5c06333b):
unknown
[quantifier_instances] limited-G : 1 : 0 : 1
问题1:为什么Z3只会实例化limited-G
,但limited-F
和bar
都没有(这会证明断言)?
问题2:评论任何(无用的)断言foo
,limited-F
或limited-G
允许Z3证明断言 - 为什么会这样? (根据评论的内容,仅实例化bar
或bar
和limited-F
。)
如果它与观察到的行为有关:我想将smt.case_split
设置为3
(我的配置遵循MSR的Boogie工具省略的配置),但是Z3给了我{{1尽管事实是WARNING: auto configuration (option AUTO_CONFIG) must be disabled to use option CASE_SPLIT=3, 4 or 5
。
答案 0 :(得分:3)
情况如下:
当使用基于模式的实例化时,Z3采用了一种可操作的方法来查找量词实例化。
通过禁用MBQI,您依赖于相等匹配引擎。
您可以通过在连词上分配通用量词,并在每种情况下提供模式来绕过此问题。因此,你(r工具)可以重写公理:
(assert (forall ((a Int) (b Int) (c Int)) (!
(and
(trigG a)
(trigF a b c))
:pattern ((trigF a b c))
:qid |bar|
)))
两个公理。
(assert (forall ((a Int)) (! (trigG a) :pattern ((trigG a))))
(assert (forall ((a Int) (b Int) (c Int)) (!
(trigF a b c)
:pattern ((trigF a b c))
:qid |bar|
)))
设置自动完成的问题似乎已修复。我最近修复了一些错误,如果在smt-lib输入中设置了多个顶级配置,则会重置一些顶级配置。