如何在带有量词集的公式上使用Z3?

时间:2013-10-08 10:35:59

标签: z3 quantifiers

我有一个简单的公式,包含数组的量词,Z3(4.3.2)返回“unknown”。

(assert (forall ((a (Array Int Int)) (b (Array Int Int))) (=> (forall ((i Int)) (= (select a i) (select b i))) (= a b))))
(check-sat)

详细信息是:

(simplifier :num-exprs 12 :num-asts 185 :time 0.00 :before-memory 2.49 :after-memory 2.49)
(smt.simplifier-done)
(smt.searching)
(smt.mbqi)
(smt.simplifier-done)
(smt.searching)
(smt.simplifying-clause-set :num-deleted-clauses 1)
(smt.simplifier-done)
(smt.searching)
(smt.simplifying-clause-set :num-deleted-clauses 1)
(smt.mbqi :failed k!1)
(smt.restarting :propagations 0 :decisions 0 :conflicts 0 :restart 100 :agility 0.00)
(tactic-exception "smt tactic failed to show goal to be sat/unsat")

似乎Z3允许这种公式。从我对冗长的不完全理解中,我是否错过了一些使用的策略?你能帮忙解决这个公式吗?

2 个答案:

答案 0 :(得分:3)

Z3 tutorial(Section Quantifiers)描述Z3完成的片段。一般问题是不可判定的。

关于您的示例,Z3将在包含数组范围的量词的可满足实例上失败。 请注意,您的公式是可以满足的。 如果我们否定它,那么Z3会自动证明它是不可满足的。

(assert (not (forall ((a (Array Int Int)) (b (Array Int Int))) 
             (=> (forall ((i Int)) (= (select a i) (select b i))) (= a b)))))
(check-sat)

备注:Z3本质上是一种可满足性检查器。为证明公式F,我们证明否定是不可满足的。

答案 1 :(得分:1)

实际上,您可以先尝试消除量词。 使用Tactic' qe' qe-sat'或者' qe-light'可能有帮助。 我尝试了它,似乎变成了“真实”。