【发布时间】:2014-10-26 16:38:44
【问题描述】:
考虑以下 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 给了我WARNING: auto configuration (option AUTO_CONFIG) must be disabled to use option CASE_SPLIT=3, 4 or 5,尽管@ 987654339@.
【问题讨论】:
-
您的问题还没有答案,但是已经有一些与参数问题相关的错误修正,这也是您看到的警告消息的来源。您能否验证问题是否仍然存在?
-
@ChristophWintersteiger 我刚用 Z3 4.4.0 9bff93279f75 x64 试过,结果是一样的
-
@ChristophWintersteiger 仅供参考:官方 Z3 4.4.0 版本 (github.com/Z3Prover/bin/blob/master/releases/…) 仍然显示相同的行为
标签: triggers z3 smt quantifiers